Commit 3ae2d76675b7837e52518a7ca60882b98111a4ec
1 parent
faf12f6b
Exists in
master
and in
1 other branch
New Heroku Suspenders app
Showing
16 changed files
with
765 additions
and
765 deletions
Show diff stats
app/views/layouts/application.html.erb
@@ -3,8 +3,8 @@ | @@ -3,8 +3,8 @@ | ||
3 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> | 3 | <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en"> |
4 | <head> | 4 | <head> |
5 | <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> | 5 | <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> |
6 | - <title>CHANGETITLE</title> | ||
7 | - <%= stylesheet_link_tag :flutie, 'CHANGEME', :cache => true %> | 6 | + <title>Rebirth</title> |
7 | + <%= stylesheet_link_tag :flutie, 'rebirth', :cache => true %> | ||
8 | </head> | 8 | </head> |
9 | <body class="<%= body_class %>"> | 9 | <body class="<%= body_class %>"> |
10 | <div class="content"> | 10 | <div class="content"> |
config/environment.rb
1 | # Be sure to restart your server when you modify this file | 1 | # Be sure to restart your server when you modify this file |
2 | 2 | ||
3 | # Specifies gem version of Rails to use when vendor/rails is not present | 3 | # Specifies gem version of Rails to use when vendor/rails is not present |
4 | -RAILS_GEM_VERSION = '2.3.3' unless defined? RAILS_GEM_VERSION | 4 | +RAILS_GEM_VERSION = '2.3.4' unless defined? RAILS_GEM_VERSION |
5 | 5 | ||
6 | # Bootstrap the Rails environment, frameworks, and default configuration | 6 | # Bootstrap the Rails environment, frameworks, and default configuration |
7 | require File.join(File.dirname(__FILE__), 'boot') | 7 | require File.join(File.dirname(__FILE__), 'boot') |
config/environments/production.rb
@@ -22,5 +22,5 @@ config.gem "rubaidh-google_analytics", | @@ -22,5 +22,5 @@ config.gem "rubaidh-google_analytics", | ||
22 | :version => "1.1.4", | 22 | :version => "1.1.4", |
23 | :source => "http://gems.github.com" | 23 | :source => "http://gems.github.com" |
24 | 24 | ||
25 | -HOST = "CHANGEME.heroku.com" | 25 | +HOST = "rebirth.heroku.com" |
26 | 26 |
config/environments/staging.rb
@@ -11,5 +11,5 @@ config.action_controller.perform_caching = true | @@ -11,5 +11,5 @@ config.action_controller.perform_caching = true | ||
11 | # Disable delivery errors if you bad email addresses should just be ignored | 11 | # Disable delivery errors if you bad email addresses should just be ignored |
12 | config.action_mailer.raise_delivery_errors = false | 12 | config.action_mailer.raise_delivery_errors = false |
13 | 13 | ||
14 | -HOST = "CHANGEME.heroku.com" | 14 | +HOST = "rebirth.heroku.com" |
15 | 15 |
config/initializers/session_store.rb
@@ -5,8 +5,8 @@ | @@ -5,8 +5,8 @@ | ||
5 | # Make sure the secret is at least 30 characters and all random, | 5 | # Make sure the secret is at least 30 characters and all random, |
6 | # no regular words or you'll be exposed to dictionary attacks. | 6 | # no regular words or you'll be exposed to dictionary attacks. |
7 | ActionController::Base.session = { | 7 | ActionController::Base.session = { |
8 | - :session_key => "_CHANGEME_session", | ||
9 | - :secret => "CHANGESESSION" | 8 | + :session_key => "_rebirth_session", |
9 | + :secret => "f86c832870682bd056afe09e8b328b1b" | ||
10 | } | 10 | } |
11 | 11 | ||
12 | # Use the database for sessions instead of the cookie-based default, | 12 | # Use the database for sessions instead of the cookie-based default, |
@@ -0,0 +1,40 @@ | @@ -0,0 +1,40 @@ | ||
1 | +body { | ||
2 | + background-color: #dadada; } | ||
3 | + | ||
4 | +.content { | ||
5 | + background: #fff; | ||
6 | + padding: 40px; | ||
7 | + margin: 40px auto; | ||
8 | + width: 880px; | ||
9 | + -moz-border-radius: 24px; | ||
10 | + -webkit-border-radius: 24px; } | ||
11 | + | ||
12 | +/* flash color */ | ||
13 | + | ||
14 | +#flash_success { | ||
15 | + background: seagreen; } | ||
16 | +#flash_failure { | ||
17 | + color: beige; | ||
18 | + background: firebrick; } | ||
19 | +#flash_notice { | ||
20 | + color: snow; | ||
21 | + background: dimgray; } | ||
22 | + | ||
23 | +/* flashes spacing */ | ||
24 | + | ||
25 | +#flash { | ||
26 | + margin-bottom: 0.6em; } | ||
27 | + | ||
28 | +#flash_notice, #flash_success, #flash_failure, #errorExplanation ul li { | ||
29 | + padding: 0.6em; } | ||
30 | + | ||
31 | +/* flash scale */ | ||
32 | + | ||
33 | +#flash_notice, #flash_success, #flash_failure, #errorExplanation ul li { | ||
34 | + font-size: 1.6em; } | ||
35 | + | ||
36 | +/* flash weighting */ | ||
37 | + | ||
38 | +#flash_notice, #flash_success, #flash_failure, #errorExplanation ul li { | ||
39 | + font-weight: bold; } | ||
40 | + |
public/stylesheets/screen.css
@@ -1,40 +0,0 @@ | @@ -1,40 +0,0 @@ | ||
1 | -body { | ||
2 | - background-color: #dadada; } | ||
3 | - | ||
4 | -.content { | ||
5 | - background: #fff; | ||
6 | - padding: 40px; | ||
7 | - margin: 40px auto; | ||
8 | - width: 880px; | ||
9 | - -moz-border-radius: 24px; | ||
10 | - -webkit-border-radius: 24px; } | ||
11 | - | ||
12 | -/* flash color */ | ||
13 | - | ||
14 | -#flash_success { | ||
15 | - background: seagreen; } | ||
16 | -#flash_failure { | ||
17 | - color: beige; | ||
18 | - background: firebrick; } | ||
19 | -#flash_notice { | ||
20 | - color: snow; | ||
21 | - background: dimgray; } | ||
22 | - | ||
23 | -/* flashes spacing */ | ||
24 | - | ||
25 | -#flash { | ||
26 | - margin-bottom: 0.6em; } | ||
27 | - | ||
28 | -#flash_notice, #flash_success, #flash_failure, #errorExplanation ul li { | ||
29 | - padding: 0.6em; } | ||
30 | - | ||
31 | -/* flash scale */ | ||
32 | - | ||
33 | -#flash_notice, #flash_success, #flash_failure, #errorExplanation ul li { | ||
34 | - font-size: 1.6em; } | ||
35 | - | ||
36 | -/* flash weighting */ | ||
37 | - | ||
38 | -#flash_notice, #flash_success, #flash_failure, #errorExplanation ul li { | ||
39 | - font-weight: bold; } | ||
40 | - |
script/create_project
@@ -14,9 +14,9 @@ project_directory = base_directory + project_name | @@ -14,9 +14,9 @@ project_directory = base_directory + project_name | ||
14 | fail("Project directory (#{project_directory}) already exists") if project_directory.exist? | 14 | fail("Project directory (#{project_directory}) already exists") if project_directory.exist? |
15 | 15 | ||
16 | template_url = "git://github.com/dancroak/heroku_suspenders.git" | 16 | template_url = "git://github.com/dancroak/heroku_suspenders.git" |
17 | -changeme = "CHANGEME" | 17 | +changeme = "rebirth" |
18 | changesession = "CHANGESESSION" | 18 | changesession = "CHANGESESSION" |
19 | -changetitle = "CHANGETITLE" | 19 | +changetitle = "Rebirth" |
20 | 20 | ||
21 | def run(cmd) | 21 | def run(cmd) |
22 | puts "Running '#{cmd}'" | 22 | puts "Running '#{cmd}'" |
vendor/gems/activemerchant-1.4.2/test/extra/binding_of_caller.rb
1 | -class Continuation # :nodoc: | ||
2 | - def self.create(*args, &block) # :nodoc: | ||
3 | - cc = nil; result = callcc {|c| cc = c; block.call(cc) if block and args.empty?} | ||
4 | - result ||= args | ||
5 | - return *[cc, *result] | ||
6 | - end | ||
7 | -end | ||
8 | - | ||
9 | -class Binding; end # for RDoc | ||
10 | -# This method returns the binding of the method that called your | ||
11 | -# method. It will raise an Exception when you're not inside a method. | ||
12 | -# | ||
13 | -# It's used like this: | ||
14 | -# def inc_counter(amount = 1) | ||
15 | -# Binding.of_caller do |binding| | ||
16 | -# # Create a lambda that will increase the variable 'counter' | ||
17 | -# # in the caller of this method when called. | ||
18 | -# inc = eval("lambda { |arg| counter += arg }", binding) | ||
19 | -# # We can refer to amount from inside this block safely. | ||
20 | -# inc.call(amount) | ||
21 | -# end | ||
22 | -# # No other statements can go here. Put them inside the block. | ||
23 | -# end | ||
24 | -# counter = 0 | ||
25 | -# 2.times { inc_counter } | ||
26 | -# counter # => 2 | ||
27 | -# | ||
28 | -# Binding.of_caller must be the last statement in the method. | ||
29 | -# This means that you will have to put everything you want to | ||
30 | -# do after the call to Binding.of_caller into the block of it. | ||
31 | -# This should be no problem however, because Ruby has closures. | ||
32 | -# If you don't do this an Exception will be raised. Because of | ||
33 | -# the way that Binding.of_caller is implemented it has to be | ||
34 | -# done this way. | ||
35 | -def Binding.of_caller(&block) | ||
36 | - old_critical = Thread.critical | ||
37 | - Thread.critical = true | ||
38 | - count = 0 | ||
39 | - cc, result, error, extra_data = Continuation.create(nil, nil) | ||
40 | - error.call if error | ||
41 | - | ||
42 | - tracer = lambda do |*args| | ||
43 | - type, context, extra_data = args[0], args[4], args | ||
44 | - if type == "return" | ||
45 | - count += 1 | ||
46 | - # First this method and then calling one will return -- | ||
47 | - # the trace event of the second event gets the context | ||
48 | - # of the method which called the method that called this | ||
49 | - # method. | ||
50 | - if count == 2 | ||
51 | - # It would be nice if we could restore the trace_func | ||
52 | - # that was set before we swapped in our own one, but | ||
53 | - # this is impossible without overloading set_trace_func | ||
54 | - # in current Ruby. | ||
55 | - set_trace_func(nil) | ||
56 | - cc.call(eval("binding", context), nil, extra_data) | ||
57 | - end | ||
58 | - elsif type == "line" then | ||
59 | - nil | ||
60 | - elsif type == "c-return" and extra_data[3] == :set_trace_func then | ||
61 | - nil | ||
62 | - else | ||
63 | - set_trace_func(nil) | ||
64 | - error_msg = "Binding.of_caller used in non-method context or " + | ||
65 | - "trailing statements of method using it aren't in the block." | ||
66 | - cc.call(nil, lambda { raise(ArgumentError, error_msg) }, nil) | ||
67 | - end | ||
68 | - end | ||
69 | - | ||
70 | - unless result | ||
71 | - set_trace_func(tracer) | ||
72 | - return nil | ||
73 | - else | ||
74 | - Thread.critical = old_critical | ||
75 | - case block.arity | ||
76 | - when 1 then yield(result) | ||
77 | - else yield(result, extra_data) | ||
78 | - end | ||
79 | - end | ||
80 | -end | 1 | +class Continuation # :nodoc: |
2 | + def self.create(*args, &block) # :nodoc: | ||
3 | + cc = nil; result = callcc {|c| cc = c; block.call(cc) if block and args.empty?} | ||
4 | + result ||= args | ||
5 | + return *[cc, *result] | ||
6 | + end | ||
7 | +end | ||
8 | + | ||
9 | +class Binding; end # for RDoc | ||
10 | +# This method returns the binding of the method that called your | ||
11 | +# method. It will raise an Exception when you're not inside a method. | ||
12 | +# | ||
13 | +# It's used like this: | ||
14 | +# def inc_counter(amount = 1) | ||
15 | +# Binding.of_caller do |binding| | ||
16 | +# # Create a lambda that will increase the variable 'counter' | ||
17 | +# # in the caller of this method when called. | ||
18 | +# inc = eval("lambda { |arg| counter += arg }", binding) | ||
19 | +# # We can refer to amount from inside this block safely. | ||
20 | +# inc.call(amount) | ||
21 | +# end | ||
22 | +# # No other statements can go here. Put them inside the block. | ||
23 | +# end | ||
24 | +# counter = 0 | ||
25 | +# 2.times { inc_counter } | ||
26 | +# counter # => 2 | ||
27 | +# | ||
28 | +# Binding.of_caller must be the last statement in the method. | ||
29 | +# This means that you will have to put everything you want to | ||
30 | +# do after the call to Binding.of_caller into the block of it. | ||
31 | +# This should be no problem however, because Ruby has closures. | ||
32 | +# If you don't do this an Exception will be raised. Because of | ||
33 | +# the way that Binding.of_caller is implemented it has to be | ||
34 | +# done this way. | ||
35 | +def Binding.of_caller(&block) | ||
36 | + old_critical = Thread.critical | ||
37 | + Thread.critical = true | ||
38 | + count = 0 | ||
39 | + cc, result, error, extra_data = Continuation.create(nil, nil) | ||
40 | + error.call if error | ||
41 | + | ||
42 | + tracer = lambda do |*args| | ||
43 | + type, context, extra_data = args[0], args[4], args | ||
44 | + if type == "return" | ||
45 | + count += 1 | ||
46 | + # First this method and then calling one will return -- | ||
47 | + # the trace event of the second event gets the context | ||
48 | + # of the method which called the method that called this | ||
49 | + # method. | ||
50 | + if count == 2 | ||
51 | + # It would be nice if we could restore the trace_func | ||
52 | + # that was set before we swapped in our own one, but | ||
53 | + # this is impossible without overloading set_trace_func | ||
54 | + # in current Ruby. | ||
55 | + set_trace_func(nil) | ||
56 | + cc.call(eval("binding", context), nil, extra_data) | ||
57 | + end | ||
58 | + elsif type == "line" then | ||
59 | + nil | ||
60 | + elsif type == "c-return" and extra_data[3] == :set_trace_func then | ||
61 | + nil | ||
62 | + else | ||
63 | + set_trace_func(nil) | ||
64 | + error_msg = "Binding.of_caller used in non-method context or " + | ||
65 | + "trailing statements of method using it aren't in the block." | ||
66 | + cc.call(nil, lambda { raise(ArgumentError, error_msg) }, nil) | ||
67 | + end | ||
68 | + end | ||
69 | + | ||
70 | + unless result | ||
71 | + set_trace_func(tracer) | ||
72 | + return nil | ||
73 | + else | ||
74 | + Thread.critical = old_critical | ||
75 | + case block.arity | ||
76 | + when 1 then yield(result) | ||
77 | + else yield(result, extra_data) | ||
78 | + end | ||
79 | + end | ||
80 | +end |
vendor/gems/activemerchant-1.4.2/test/extra/breakpoint.rb
1 | -# The Breakpoint library provides the convenience of | ||
2 | -# being able to inspect and modify state, diagnose | ||
3 | -# bugs all via IRB by simply setting breakpoints in | ||
4 | -# your applications by the call of a method. | ||
5 | -# | ||
6 | -# This library was written and is supported by me, | ||
7 | -# Florian Gross. I can be reached at flgr@ccan.de | ||
8 | -# and enjoy getting feedback about my libraries. | ||
9 | -# | ||
10 | -# The whole library (including breakpoint_client.rb | ||
11 | -# and binding_of_caller.rb) is licensed under the | ||
12 | -# same license that Ruby uses. (Which is currently | ||
13 | -# either the GNU General Public License or a custom | ||
14 | -# one that allows for commercial usage.) If you for | ||
15 | -# some good reason need to use this under another | ||
16 | -# license please contact me. | ||
17 | - | ||
18 | -require 'irb' | ||
19 | -require 'binding_of_caller' | ||
20 | -require 'drb' | ||
21 | -require 'drb/acl' | ||
22 | -require 'thread' | ||
23 | - | ||
24 | -module Breakpoint | ||
25 | - id = %q$Id: breakpoint.rb 52 2005-02-26 19:43:19Z flgr $ | ||
26 | - current_version = id.split(" ")[2] | ||
27 | - unless defined?(Version) | ||
28 | - # The Version of ruby-breakpoint you are using as String of the | ||
29 | - # 1.2.3 form where the digits stand for release, major and minor | ||
30 | - # version respectively. | ||
31 | - Version = "0.5.0" | ||
32 | - end | ||
33 | - | ||
34 | - extend self | ||
35 | - | ||
36 | - # This will pop up an interactive ruby session at a | ||
37 | - # pre-defined break point in a Ruby application. In | ||
38 | - # this session you can examine the environment of | ||
39 | - # the break point. | ||
40 | - # | ||
41 | - # You can get a list of variables in the context using | ||
42 | - # local_variables via +local_variables+. You can then | ||
43 | - # examine their values by typing their names. | ||
44 | - # | ||
45 | - # You can have a look at the call stack via +caller+. | ||
46 | - # | ||
47 | - # The source code around the location where the breakpoint | ||
48 | - # was executed can be examined via +source_lines+. Its | ||
49 | - # argument specifies how much lines of context to display. | ||
50 | - # The default amount of context is 5 lines. Note that | ||
51 | - # the call to +source_lines+ can raise an exception when | ||
52 | - # it isn't able to read in the source code. | ||
53 | - # | ||
54 | - # breakpoints can also return a value. They will execute | ||
55 | - # a supplied block for getting a default return value. | ||
56 | - # A custom value can be returned from the session by doing | ||
57 | - # +throw(:debug_return, value)+. | ||
58 | - # | ||
59 | - # You can also give names to break points which will be | ||
60 | - # used in the message that is displayed upon execution | ||
61 | - # of them. | ||
62 | - # | ||
63 | - # Here's a sample of how breakpoints should be placed: | ||
64 | - # | ||
65 | - # class Person | ||
66 | - # def initialize(name, age) | ||
67 | - # @name, @age = name, age | ||
68 | - # breakpoint("Person#initialize") | ||
69 | - # end | ||
70 | - # | ||
71 | - # attr_reader :age | ||
72 | - # def name | ||
73 | - # breakpoint("Person#name") { @name } | ||
74 | - # end | ||
75 | - # end | ||
76 | - # | ||
77 | - # person = Person.new("Random Person", 23) | ||
78 | - # puts "Name: #{person.name}" | ||
79 | - # | ||
80 | - # And here is a sample debug session: | ||
81 | - # | ||
82 | - # Executing break point "Person#initialize" at file.rb:4 in `initialize' | ||
83 | - # irb(#<Person:0x292fbe8>):001:0> local_variables | ||
84 | - # => ["name", "age", "_", "__"] | ||
85 | - # irb(#<Person:0x292fbe8>):002:0> [name, age] | ||
86 | - # => ["Random Person", 23] | ||
87 | - # irb(#<Person:0x292fbe8>):003:0> [@name, @age] | ||
88 | - # => ["Random Person", 23] | ||
89 | - # irb(#<Person:0x292fbe8>):004:0> self | ||
90 | - # => #<Person:0x292fbe8 @age=23, @name="Random Person"> | ||
91 | - # irb(#<Person:0x292fbe8>):005:0> @age += 1; self | ||
92 | - # => #<Person:0x292fbe8 @age=24, @name="Random Person"> | ||
93 | - # irb(#<Person:0x292fbe8>):006:0> exit | ||
94 | - # Executing break point "Person#name" at file.rb:9 in `name' | ||
95 | - # irb(#<Person:0x292fbe8>):001:0> throw(:debug_return, "Overriden name") | ||
96 | - # Name: Overriden name | ||
97 | - # | ||
98 | - # Breakpoint sessions will automatically have a few | ||
99 | - # convenience methods available. See Breakpoint::CommandBundle | ||
100 | - # for a list of them. | ||
101 | - # | ||
102 | - # Breakpoints can also be used remotely over sockets. | ||
103 | - # This is implemented by running part of the IRB session | ||
104 | - # in the application and part of it in a special client. | ||
105 | - # You have to call Breakpoint.activate_drb to enable | ||
106 | - # support for remote breakpoints and then run | ||
107 | - # breakpoint_client.rb which is distributed with this | ||
108 | - # library. See the documentation of Breakpoint.activate_drb | ||
109 | - # for details. | ||
110 | - def breakpoint(id = nil, context = nil, &block) | ||
111 | - callstack = caller | ||
112 | - callstack.slice!(0, 3) if callstack.first["breakpoint"] | ||
113 | - file, line, method = *callstack.first.match(/^(.+?):(\d+)(?::in `(.*?)')?/).captures | ||
114 | - | ||
115 | - message = "Executing break point " + (id ? "#{id.inspect} " : "") + | ||
116 | - "at #{file}:#{line}" + (method ? " in `#{method}'" : "") | ||
117 | - | ||
118 | - if context then | ||
119 | - return handle_breakpoint(context, message, file, line, &block) | ||
120 | - end | ||
121 | - | ||
122 | - Binding.of_caller do |binding_context| | ||
123 | - handle_breakpoint(binding_context, message, file, line, &block) | ||
124 | - end | ||
125 | - end | ||
126 | - | ||
127 | - # These commands are automatically available in all breakpoint shells. | ||
128 | - module CommandBundle | ||
129 | - # Proxy to a Breakpoint client. Lets you directly execute code | ||
130 | - # in the context of the client. | ||
131 | - class Client | ||
132 | - def initialize(eval_handler) # :nodoc: | ||
133 | - eval_handler.untaint | ||
134 | - @eval_handler = eval_handler | ||
135 | - end | ||
136 | - | ||
137 | - instance_methods.each do |method| | ||
138 | - next if method[/^__.+__$/] | ||
139 | - undef_method method | ||
140 | - end | ||
141 | - | ||
142 | - # Executes the specified code at the client. | ||
143 | - def eval(code) | ||
144 | - @eval_handler.call(code) | ||
145 | - end | ||
146 | - | ||
147 | - # Will execute the specified statement at the client. | ||
148 | - def method_missing(method, *args, &block) | ||
149 | - if args.empty? and not block | ||
150 | - result = eval "#{method}" | ||
151 | - else | ||
152 | - # This is a bit ugly. The alternative would be using an | ||
153 | - # eval context instead of an eval handler for executing | ||
154 | - # the code at the client. The problem with that approach | ||
155 | - # is that we would have to handle special expressions | ||
156 | - # like "self", "nil" or constants ourself which is hard. | ||
157 | - remote = eval %{ | ||
158 | - result = lambda { |block, *args| #{method}(*args, &block) } | ||
159 | - def result.call_with_block(*args, &block) | ||
160 | - call(block, *args) | ||
161 | - end | ||
162 | - result | ||
163 | - } | ||
164 | - remote.call_with_block(*args, &block) | ||
165 | - end | ||
166 | - | ||
167 | - return result | ||
168 | - end | ||
169 | - end | ||
170 | - | ||
171 | - # Returns the source code surrounding the location where the | ||
172 | - # breakpoint was issued. | ||
173 | - def source_lines(context = 5, return_line_numbers = false) | ||
174 | - lines = File.readlines(@__bp_file).map { |line| line.chomp } | ||
175 | - | ||
176 | - break_line = @__bp_line | ||
177 | - start_line = [break_line - context, 1].max | ||
178 | - end_line = break_line + context | ||
179 | - | ||
180 | - result = lines[(start_line - 1) .. (end_line - 1)] | ||
181 | - | ||
182 | - if return_line_numbers then | ||
183 | - return [start_line, break_line, result] | ||
184 | - else | ||
185 | - return result | ||
186 | - end | ||
187 | - end | ||
188 | - | ||
189 | - # Lets an object that will forward method calls to the breakpoint | ||
190 | - # client. This is useful for outputting longer things at the client | ||
191 | - # and so on. You can for example do these things: | ||
192 | - # | ||
193 | - # client.puts "Hello" # outputs "Hello" at client console | ||
194 | - # # outputs "Hello" into the file temp.txt at the client | ||
195 | - # client.File.open("temp.txt", "w") { |f| f.puts "Hello" } | ||
196 | - def client() | ||
197 | - if Breakpoint.use_drb? then | ||
198 | - sleep(0.5) until Breakpoint.drb_service.eval_handler | ||
199 | - Client.new(Breakpoint.drb_service.eval_handler) | ||
200 | - else | ||
201 | - Client.new(lambda { |code| eval(code, TOPLEVEL_BINDING) }) | ||
202 | - end | ||
203 | - end | ||
204 | - end | ||
205 | - | ||
206 | - def handle_breakpoint(context, message, file = "", line = "", &block) # :nodoc: | ||
207 | - catch(:debug_return) do |value| | ||
208 | - eval(%{ | ||
209 | - @__bp_file = #{file.inspect} | ||
210 | - @__bp_line = #{line} | ||
211 | - extend Breakpoint::CommandBundle | ||
212 | - extend DRbUndumped if self | ||
213 | - }, context) rescue nil | ||
214 | - | ||
215 | - if not use_drb? then | ||
216 | - puts message | ||
217 | - IRB.start(nil, IRB::WorkSpace.new(context)) | ||
218 | - else | ||
219 | - @drb_service.add_breakpoint(context, message) | ||
220 | - end | ||
221 | - | ||
222 | - block.call if block | ||
223 | - end | ||
224 | - end | ||
225 | - | ||
226 | - # These exceptions will be raised on failed asserts | ||
227 | - # if Breakpoint.asserts_cause_exceptions is set to | ||
228 | - # true. | ||
229 | - class FailedAssertError < RuntimeError | ||
230 | - end | ||
231 | - | ||
232 | - # This asserts that the block evaluates to true. | ||
233 | - # If it doesn't evaluate to true a breakpoint will | ||
234 | - # automatically be created at that execution point. | ||
235 | - # | ||
236 | - # You can disable assert checking in production | ||
237 | - # code by setting Breakpoint.optimize_asserts to | ||
238 | - # true. (It will still be enabled when Ruby is run | ||
239 | - # via the -d argument.) | ||
240 | - # | ||
241 | - # Example: | ||
242 | - # person_name = "Foobar" | ||
243 | - # assert { not person_name.nil? } | ||
244 | - # | ||
245 | - # Note: If you want to use this method from an | ||
246 | - # unit test, you will have to call it by its full | ||
247 | - # name, Breakpoint.assert. | ||
248 | - def assert(context = nil, &condition) | ||
249 | - return if Breakpoint.optimize_asserts and not $DEBUG | ||
250 | - return if yield | ||
251 | - | ||
252 | - callstack = caller | ||
253 | - callstack.slice!(0, 3) if callstack.first["assert"] | ||
254 | - file, line, method = *callstack.first.match(/^(.+?):(\d+)(?::in `(.*?)')?/).captures | ||
255 | - | ||
256 | - message = "Assert failed at #{file}:#{line}#{" in `#{method}'" if method}." | ||
257 | - | ||
258 | - if Breakpoint.asserts_cause_exceptions and not $DEBUG then | ||
259 | - raise(Breakpoint::FailedAssertError, message) | ||
260 | - end | ||
261 | - | ||
262 | - message += " Executing implicit breakpoint." | ||
263 | - | ||
264 | - if context then | ||
265 | - return handle_breakpoint(context, message, file, line) | ||
266 | - end | ||
267 | - | ||
268 | - Binding.of_caller do |context| | ||
269 | - handle_breakpoint(context, message, file, line) | ||
270 | - end | ||
271 | - end | ||
272 | - | ||
273 | - # Whether asserts should be ignored if not in debug mode. | ||
274 | - # Debug mode can be enabled by running ruby with the -d | ||
275 | - # switch or by setting $DEBUG to true. | ||
276 | - attr_accessor :optimize_asserts | ||
277 | - self.optimize_asserts = false | ||
278 | - | ||
279 | - # Whether an Exception should be raised on failed asserts | ||
280 | - # in non-$DEBUG code or not. By default this is disabled. | ||
281 | - attr_accessor :asserts_cause_exceptions | ||
282 | - self.asserts_cause_exceptions = false | ||
283 | - @use_drb = false | ||
284 | - | ||
285 | - attr_reader :drb_service # :nodoc: | ||
286 | - | ||
287 | - class DRbService # :nodoc: | ||
288 | - include DRbUndumped | ||
289 | - | ||
290 | - def initialize | ||
291 | - @handler = @eval_handler = @collision_handler = nil | ||
292 | - | ||
293 | - IRB.instance_eval { @CONF[:RC] = true } | ||
294 | - IRB.run_config | ||
295 | - end | ||
296 | - | ||
297 | - def collision | ||
298 | - sleep(0.5) until @collision_handler | ||
299 | - | ||
300 | - @collision_handler.untaint | ||
301 | - | ||
302 | - @collision_handler.call | ||
303 | - end | ||
304 | - | ||
305 | - def ping() end | ||
306 | - | ||
307 | - def add_breakpoint(context, message) | ||
308 | - workspace = IRB::WorkSpace.new(context) | ||
309 | - workspace.extend(DRbUndumped) | ||
310 | - | ||
311 | - sleep(0.5) until @handler | ||
312 | - | ||
313 | - @handler.untaint | ||
314 | - @handler.call(workspace, message) | ||
315 | - rescue Errno::ECONNREFUSED, DRb::DRbConnError | ||
316 | - raise if Breakpoint.use_drb? | ||
317 | - end | ||
318 | - | ||
319 | - attr_accessor :handler, :eval_handler, :collision_handler | ||
320 | - end | ||
321 | - | ||
322 | - # Will run Breakpoint in DRb mode. This will spawn a server | ||
323 | - # that can be attached to via the breakpoint-client command | ||
324 | - # whenever a breakpoint is executed. This is useful when you | ||
325 | - # are debugging CGI applications or other applications where | ||
326 | - # you can't access debug sessions via the standard input and | ||
327 | - # output of your application. | ||
328 | - # | ||
329 | - # You can specify an URI where the DRb server will run at. | ||
330 | - # This way you can specify the port the server runs on. The | ||
331 | - # default URI is druby://localhost:42531. | ||
332 | - # | ||
333 | - # Please note that breakpoints will be skipped silently in | ||
334 | - # case the DRb server can not spawned. (This can happen if | ||
335 | - # the port is already used by another instance of your | ||
336 | - # application on CGI or another application.) | ||
337 | - # | ||
338 | - # Also note that by default this will only allow access | ||
339 | - # from localhost. You can however specify a list of | ||
340 | - # allowed hosts or nil (to allow access from everywhere). | ||
341 | - # But that will still not protect you from somebody | ||
342 | - # reading the data as it goes through the net. | ||
343 | - # | ||
344 | - # A good approach for getting security and remote access | ||
345 | - # is setting up an SSH tunnel between the DRb service | ||
346 | - # and the client. This is usually done like this: | ||
347 | - # | ||
348 | - # $ ssh -L20000:127.0.0.1:20000 -R10000:127.0.0.1:10000 example.com | ||
349 | - # (This will connect port 20000 at the client side to port | ||
350 | - # 20000 at the server side, and port 10000 at the server | ||
351 | - # side to port 10000 at the client side.) | ||
352 | - # | ||
353 | - # After that do this on the server side: (the code being debugged) | ||
354 | - # Breakpoint.activate_drb("druby://127.0.0.1:20000", "localhost") | ||
355 | - # | ||
356 | - # And at the client side: | ||
357 | - # ruby breakpoint_client.rb -c druby://127.0.0.1:10000 -s druby://127.0.0.1:20000 | ||
358 | - # | ||
359 | - # Running through such a SSH proxy will also let you use | ||
360 | - # breakpoint.rb in case you are behind a firewall. | ||
361 | - # | ||
362 | - # Detailed information about running DRb through firewalls is | ||
363 | - # available at http://www.rubygarden.org/ruby?DrbTutorial | ||
364 | - # | ||
365 | - # == Security considerations | ||
366 | - # Usually you will be fine when using the default druby:// URI and the default | ||
367 | - # access control list. However, if you are sitting on a machine where there are | ||
368 | - # local users that you likely can not trust (this is the case for example on | ||
369 | - # most web hosts which have multiple users sitting on the same physical machine) | ||
370 | - # you will be better off by doing client/server communication through a unix | ||
371 | - # socket. This can be accomplished by calling with a drbunix:/ style URI, e.g. | ||
372 | - # <code>Breakpoint.activate_drb('drbunix:/tmp/breakpoint_server')</code>. This | ||
373 | - # will only work on Unix based platforms. | ||
374 | - def activate_drb(uri = nil, allowed_hosts = ['localhost', '127.0.0.1', '::1'], | ||
375 | - ignore_collisions = false) | ||
376 | - | ||
377 | - return false if @use_drb | ||
378 | - | ||
379 | - uri ||= 'druby://localhost:42531' | ||
380 | - | ||
381 | - if allowed_hosts then | ||
382 | - acl = ["deny", "all"] | ||
383 | - | ||
384 | - Array(allowed_hosts).each do |host| | ||
385 | - acl += ["allow", host] | ||
386 | - end | ||
387 | - | ||
388 | - DRb.install_acl(ACL.new(acl)) | ||
389 | - end | ||
390 | - | ||
391 | - @use_drb = true | ||
392 | - @drb_service = DRbService.new | ||
393 | - did_collision = false | ||
394 | - begin | ||
395 | - @service = DRb.start_service(uri, @drb_service) | ||
396 | - rescue Errno::EADDRINUSE | ||
397 | - if ignore_collisions then | ||
398 | - nil | ||
399 | - else | ||
400 | - # The port is already occupied by another | ||
401 | - # Breakpoint service. We will try to tell | ||
402 | - # the old service that we want its port. | ||
403 | - # It will then forward that request to the | ||
404 | - # user and retry. | ||
405 | - unless did_collision then | ||
406 | - DRbObject.new(nil, uri).collision | ||
407 | - did_collision = true | ||
408 | - end | ||
409 | - sleep(10) | ||
410 | - retry | ||
411 | - end | ||
412 | - end | ||
413 | - | ||
414 | - return true | ||
415 | - end | ||
416 | - | ||
417 | - # Deactivates a running Breakpoint service. | ||
418 | - def deactivate_drb | ||
419 | - Thread.exclusive do | ||
420 | - @service.stop_service unless @service.nil? | ||
421 | - @service = nil | ||
422 | - @use_drb = false | ||
423 | - @drb_service = nil | ||
424 | - end | ||
425 | - end | ||
426 | - | ||
427 | - # Returns true when Breakpoints are used over DRb. | ||
428 | - # Breakpoint.activate_drb causes this to be true. | ||
429 | - def use_drb? | ||
430 | - @use_drb == true | ||
431 | - end | ||
432 | -end | ||
433 | - | ||
434 | -module IRB # :nodoc: | ||
435 | - class << self; remove_method :start; end | ||
436 | - def self.start(ap_path = nil, main_context = nil, workspace = nil) | ||
437 | - $0 = File::basename(ap_path, ".rb") if ap_path | ||
438 | - | ||
439 | - # suppress some warnings about redefined constants | ||
440 | - old_verbose, $VERBOSE = $VERBOSE, nil | ||
441 | - IRB.setup(ap_path) | ||
442 | - $VERBOSE = old_verbose | ||
443 | - | ||
444 | - if @CONF[:SCRIPT] then | ||
445 | - irb = Irb.new(main_context, @CONF[:SCRIPT]) | ||
446 | - else | ||
447 | - irb = Irb.new(main_context) | ||
448 | - end | ||
449 | - | ||
450 | - if workspace then | ||
451 | - irb.context.workspace = workspace | ||
452 | - end | ||
453 | - | ||
454 | - @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC] | ||
455 | - @CONF[:MAIN_CONTEXT] = irb.context | ||
456 | - | ||
457 | - old_sigint = trap("SIGINT") do | ||
458 | - begin | ||
459 | - irb.signal_handle | ||
460 | - rescue RubyLex::TerminateLineInput | ||
461 | - # ignored | ||
462 | - end | ||
463 | - end | ||
464 | - | ||
465 | - catch(:IRB_EXIT) do | ||
466 | - irb.eval_input | ||
467 | - end | ||
468 | - ensure | ||
469 | - trap("SIGINT", old_sigint) | ||
470 | - end | ||
471 | - | ||
472 | - class << self | ||
473 | - alias :old_CurrentContext :CurrentContext | ||
474 | - remove_method :CurrentContext | ||
475 | - remove_method :parse_opts | ||
476 | - end | ||
477 | - | ||
478 | - def IRB.CurrentContext | ||
479 | - if old_CurrentContext.nil? and Breakpoint.use_drb? then | ||
480 | - result = Object.new | ||
481 | - def result.last_value; end | ||
482 | - return result | ||
483 | - else | ||
484 | - old_CurrentContext | ||
485 | - end | ||
486 | - end | ||
487 | - def IRB.parse_opts() end | ||
488 | - | ||
489 | - class Context # :nodoc: | ||
490 | - alias :old_evaluate :evaluate | ||
491 | - def evaluate(line, line_no) | ||
492 | - if line.chomp == "exit" then | ||
493 | - exit | ||
494 | - else | ||
495 | - old_evaluate(line, line_no) | ||
496 | - end | ||
497 | - end | ||
498 | - end | ||
499 | - | ||
500 | - class WorkSpace # :nodoc: | ||
501 | - alias :old_evaluate :evaluate | ||
502 | - | ||
503 | - def evaluate(*args) | ||
504 | - if Breakpoint.use_drb? then | ||
505 | - result = old_evaluate(*args) | ||
506 | - if args[0] != :no_proxy and | ||
507 | - not [true, false, nil].include?(result) | ||
508 | - then | ||
509 | - result.extend(DRbUndumped) rescue nil | ||
510 | - end | ||
511 | - return result | ||
512 | - else | ||
513 | - old_evaluate(*args) | ||
514 | - end | ||
515 | - end | ||
516 | - end | ||
517 | - | ||
518 | - module InputCompletor # :nodoc: | ||
519 | - def self.eval(code, context, *more) | ||
520 | - # Big hack, this assumes that InputCompletor | ||
521 | - # will only call eval() when it wants code | ||
522 | - # to be executed in the IRB context. | ||
523 | - IRB.conf[:MAIN_CONTEXT].workspace.evaluate(:no_proxy, code, *more) | ||
524 | - end | ||
525 | - end | ||
526 | -end | ||
527 | - | ||
528 | -module DRb # :nodoc: | ||
529 | - class DRbObject # :nodoc: | ||
530 | - undef :inspect if method_defined?(:inspect) | ||
531 | - undef :clone if method_defined?(:clone) | ||
532 | - end | ||
533 | -end | ||
534 | - | ||
535 | -# See Breakpoint.breakpoint | ||
536 | -def breakpoint(id = nil, &block) | ||
537 | - Binding.of_caller do |context| | ||
538 | - Breakpoint.breakpoint(id, context, &block) | ||
539 | - end | ||
540 | -end | ||
541 | - | ||
542 | -# See Breakpoint.assert | ||
543 | -def assert(&block) | ||
544 | - Binding.of_caller do |context| | ||
545 | - Breakpoint.assert(context, &block) | ||
546 | - end | ||
547 | -end | 1 | +# The Breakpoint library provides the convenience of |
2 | +# being able to inspect and modify state, diagnose | ||
3 | +# bugs all via IRB by simply setting breakpoints in | ||
4 | +# your applications by the call of a method. | ||
5 | +# | ||
6 | +# This library was written and is supported by me, | ||
7 | +# Florian Gross. I can be reached at flgr@ccan.de | ||
8 | +# and enjoy getting feedback about my libraries. | ||
9 | +# | ||
10 | +# The whole library (including breakpoint_client.rb | ||
11 | +# and binding_of_caller.rb) is licensed under the | ||
12 | +# same license that Ruby uses. (Which is currently | ||
13 | +# either the GNU General Public License or a custom | ||
14 | +# one that allows for commercial usage.) If you for | ||
15 | +# some good reason need to use this under another | ||
16 | +# license please contact me. | ||
17 | + | ||
18 | +require 'irb' | ||
19 | +require 'binding_of_caller' | ||
20 | +require 'drb' | ||
21 | +require 'drb/acl' | ||
22 | +require 'thread' | ||
23 | + | ||
24 | +module Breakpoint | ||
25 | + id = %q$Id: breakpoint.rb 52 2005-02-26 19:43:19Z flgr $ | ||
26 | + current_version = id.split(" ")[2] | ||
27 | + unless defined?(Version) | ||
28 | + # The Version of ruby-breakpoint you are using as String of the | ||
29 | + # 1.2.3 form where the digits stand for release, major and minor | ||
30 | + # version respectively. | ||
31 | + Version = "0.5.0" | ||
32 | + end | ||
33 | + | ||
34 | + extend self | ||
35 | + | ||
36 | + # This will pop up an interactive ruby session at a | ||
37 | + # pre-defined break point in a Ruby application. In | ||
38 | + # this session you can examine the environment of | ||
39 | + # the break point. | ||
40 | + # | ||
41 | + # You can get a list of variables in the context using | ||
42 | + # local_variables via +local_variables+. You can then | ||
43 | + # examine their values by typing their names. | ||
44 | + # | ||
45 | + # You can have a look at the call stack via +caller+. | ||
46 | + # | ||
47 | + # The source code around the location where the breakpoint | ||
48 | + # was executed can be examined via +source_lines+. Its | ||
49 | + # argument specifies how much lines of context to display. | ||
50 | + # The default amount of context is 5 lines. Note that | ||
51 | + # the call to +source_lines+ can raise an exception when | ||
52 | + # it isn't able to read in the source code. | ||
53 | + # | ||
54 | + # breakpoints can also return a value. They will execute | ||
55 | + # a supplied block for getting a default return value. | ||
56 | + # A custom value can be returned from the session by doing | ||
57 | + # +throw(:debug_return, value)+. | ||
58 | + # | ||
59 | + # You can also give names to break points which will be | ||
60 | + # used in the message that is displayed upon execution | ||
61 | + # of them. | ||
62 | + # | ||
63 | + # Here's a sample of how breakpoints should be placed: | ||
64 | + # | ||
65 | + # class Person | ||
66 | + # def initialize(name, age) | ||
67 | + # @name, @age = name, age | ||
68 | + # breakpoint("Person#initialize") | ||
69 | + # end | ||
70 | + # | ||
71 | + # attr_reader :age | ||
72 | + # def name | ||
73 | + # breakpoint("Person#name") { @name } | ||
74 | + # end | ||
75 | + # end | ||
76 | + # | ||
77 | + # person = Person.new("Random Person", 23) | ||
78 | + # puts "Name: #{person.name}" | ||
79 | + # | ||
80 | + # And here is a sample debug session: | ||
81 | + # | ||
82 | + # Executing break point "Person#initialize" at file.rb:4 in `initialize' | ||
83 | + # irb(#<Person:0x292fbe8>):001:0> local_variables | ||
84 | + # => ["name", "age", "_", "__"] | ||
85 | + # irb(#<Person:0x292fbe8>):002:0> [name, age] | ||
86 | + # => ["Random Person", 23] | ||
87 | + # irb(#<Person:0x292fbe8>):003:0> [@name, @age] | ||
88 | + # => ["Random Person", 23] | ||
89 | + # irb(#<Person:0x292fbe8>):004:0> self | ||
90 | + # => #<Person:0x292fbe8 @age=23, @name="Random Person"> | ||
91 | + # irb(#<Person:0x292fbe8>):005:0> @age += 1; self | ||
92 | + # => #<Person:0x292fbe8 @age=24, @name="Random Person"> | ||
93 | + # irb(#<Person:0x292fbe8>):006:0> exit | ||
94 | + # Executing break point "Person#name" at file.rb:9 in `name' | ||
95 | + # irb(#<Person:0x292fbe8>):001:0> throw(:debug_return, "Overriden name") | ||
96 | + # Name: Overriden name | ||
97 | + # | ||
98 | + # Breakpoint sessions will automatically have a few | ||
99 | + # convenience methods available. See Breakpoint::CommandBundle | ||
100 | + # for a list of them. | ||
101 | + # | ||
102 | + # Breakpoints can also be used remotely over sockets. | ||
103 | + # This is implemented by running part of the IRB session | ||
104 | + # in the application and part of it in a special client. | ||
105 | + # You have to call Breakpoint.activate_drb to enable | ||
106 | + # support for remote breakpoints and then run | ||
107 | + # breakpoint_client.rb which is distributed with this | ||
108 | + # library. See the documentation of Breakpoint.activate_drb | ||
109 | + # for details. | ||
110 | + def breakpoint(id = nil, context = nil, &block) | ||
111 | + callstack = caller | ||
112 | + callstack.slice!(0, 3) if callstack.first["breakpoint"] | ||
113 | + file, line, method = *callstack.first.match(/^(.+?):(\d+)(?::in `(.*?)')?/).captures | ||
114 | + | ||
115 | + message = "Executing break point " + (id ? "#{id.inspect} " : "") + | ||
116 | + "at #{file}:#{line}" + (method ? " in `#{method}'" : "") | ||
117 | + | ||
118 | + if context then | ||
119 | + return handle_breakpoint(context, message, file, line, &block) | ||
120 | + end | ||
121 | + | ||
122 | + Binding.of_caller do |binding_context| | ||
123 | + handle_breakpoint(binding_context, message, file, line, &block) | ||
124 | + end | ||
125 | + end | ||
126 | + | ||
127 | + # These commands are automatically available in all breakpoint shells. | ||
128 | + module CommandBundle | ||
129 | + # Proxy to a Breakpoint client. Lets you directly execute code | ||
130 | + # in the context of the client. | ||
131 | + class Client | ||
132 | + def initialize(eval_handler) # :nodoc: | ||
133 | + eval_handler.untaint | ||
134 | + @eval_handler = eval_handler | ||
135 | + end | ||
136 | + | ||
137 | + instance_methods.each do |method| | ||
138 | + next if method[/^__.+__$/] | ||
139 | + undef_method method | ||
140 | + end | ||
141 | + | ||
142 | + # Executes the specified code at the client. | ||
143 | + def eval(code) | ||
144 | + @eval_handler.call(code) | ||
145 | + end | ||
146 | + | ||
147 | + # Will execute the specified statement at the client. | ||
148 | + def method_missing(method, *args, &block) | ||
149 | + if args.empty? and not block | ||
150 | + result = eval "#{method}" | ||
151 | + else | ||
152 | + # This is a bit ugly. The alternative would be using an | ||
153 | + # eval context instead of an eval handler for executing | ||
154 | + # the code at the client. The problem with that approach | ||
155 | + # is that we would have to handle special expressions | ||
156 | + # like "self", "nil" or constants ourself which is hard. | ||
157 | + remote = eval %{ | ||
158 | + result = lambda { |block, *args| #{method}(*args, &block) } | ||
159 | + def result.call_with_block(*args, &block) | ||
160 | + call(block, *args) | ||
161 | + end | ||
162 | + result | ||
163 | + } | ||
164 | + remote.call_with_block(*args, &block) | ||
165 | + end | ||
166 | + | ||
167 | + return result | ||
168 | + end | ||
169 | + end | ||
170 | + | ||
171 | + # Returns the source code surrounding the location where the | ||
172 | + # breakpoint was issued. | ||
173 | + def source_lines(context = 5, return_line_numbers = false) | ||
174 | + lines = File.readlines(@__bp_file).map { |line| line.chomp } | ||
175 | + | ||
176 | + break_line = @__bp_line | ||
177 | + start_line = [break_line - context, 1].max | ||
178 | + end_line = break_line + context | ||
179 | + | ||
180 | + result = lines[(start_line - 1) .. (end_line - 1)] | ||
181 | + | ||
182 | + if return_line_numbers then | ||
183 | + return [start_line, break_line, result] | ||
184 | + else | ||
185 | + return result | ||
186 | + end | ||
187 | + end | ||
188 | + | ||
189 | + # Lets an object that will forward method calls to the breakpoint | ||
190 | + # client. This is useful for outputting longer things at the client | ||
191 | + # and so on. You can for example do these things: | ||
192 | + # | ||
193 | + # client.puts "Hello" # outputs "Hello" at client console | ||
194 | + # # outputs "Hello" into the file temp.txt at the client | ||
195 | + # client.File.open("temp.txt", "w") { |f| f.puts "Hello" } | ||
196 | + def client() | ||
197 | + if Breakpoint.use_drb? then | ||
198 | + sleep(0.5) until Breakpoint.drb_service.eval_handler | ||
199 | + Client.new(Breakpoint.drb_service.eval_handler) | ||
200 | + else | ||
201 | + Client.new(lambda { |code| eval(code, TOPLEVEL_BINDING) }) | ||
202 | + end | ||
203 | + end | ||
204 | + end | ||
205 | + | ||
206 | + def handle_breakpoint(context, message, file = "", line = "", &block) # :nodoc: | ||
207 | + catch(:debug_return) do |value| | ||
208 | + eval(%{ | ||
209 | + @__bp_file = #{file.inspect} | ||
210 | + @__bp_line = #{line} | ||
211 | + extend Breakpoint::CommandBundle | ||
212 | + extend DRbUndumped if self | ||
213 | + }, context) rescue nil | ||
214 | + | ||
215 | + if not use_drb? then | ||
216 | + puts message | ||
217 | + IRB.start(nil, IRB::WorkSpace.new(context)) | ||
218 | + else | ||
219 | + @drb_service.add_breakpoint(context, message) | ||
220 | + end | ||
221 | + | ||
222 | + block.call if block | ||
223 | + end | ||
224 | + end | ||
225 | + | ||
226 | + # These exceptions will be raised on failed asserts | ||
227 | + # if Breakpoint.asserts_cause_exceptions is set to | ||
228 | + # true. | ||
229 | + class FailedAssertError < RuntimeError | ||
230 | + end | ||
231 | + | ||
232 | + # This asserts that the block evaluates to true. | ||
233 | + # If it doesn't evaluate to true a breakpoint will | ||
234 | + # automatically be created at that execution point. | ||
235 | + # | ||
236 | + # You can disable assert checking in production | ||
237 | + # code by setting Breakpoint.optimize_asserts to | ||
238 | + # true. (It will still be enabled when Ruby is run | ||
239 | + # via the -d argument.) | ||
240 | + # | ||
241 | + # Example: | ||
242 | + # person_name = "Foobar" | ||
243 | + # assert { not person_name.nil? } | ||
244 | + # | ||
245 | + # Note: If you want to use this method from an | ||
246 | + # unit test, you will have to call it by its full | ||
247 | + # name, Breakpoint.assert. | ||
248 | + def assert(context = nil, &condition) | ||
249 | + return if Breakpoint.optimize_asserts and not $DEBUG | ||
250 | + return if yield | ||
251 | + | ||
252 | + callstack = caller | ||
253 | + callstack.slice!(0, 3) if callstack.first["assert"] | ||
254 | + file, line, method = *callstack.first.match(/^(.+?):(\d+)(?::in `(.*?)')?/).captures | ||
255 | + | ||
256 | + message = "Assert failed at #{file}:#{line}#{" in `#{method}'" if method}." | ||
257 | + | ||
258 | + if Breakpoint.asserts_cause_exceptions and not $DEBUG then | ||
259 | + raise(Breakpoint::FailedAssertError, message) | ||
260 | + end | ||
261 | + | ||
262 | + message += " Executing implicit breakpoint." | ||
263 | + | ||
264 | + if context then | ||
265 | + return handle_breakpoint(context, message, file, line) | ||
266 | + end | ||
267 | + | ||
268 | + Binding.of_caller do |context| | ||
269 | + handle_breakpoint(context, message, file, line) | ||
270 | + end | ||
271 | + end | ||
272 | + | ||
273 | + # Whether asserts should be ignored if not in debug mode. | ||
274 | + # Debug mode can be enabled by running ruby with the -d | ||
275 | + # switch or by setting $DEBUG to true. | ||
276 | + attr_accessor :optimize_asserts | ||
277 | + self.optimize_asserts = false | ||
278 | + | ||
279 | + # Whether an Exception should be raised on failed asserts | ||
280 | + # in non-$DEBUG code or not. By default this is disabled. | ||
281 | + attr_accessor :asserts_cause_exceptions | ||
282 | + self.asserts_cause_exceptions = false | ||
283 | + @use_drb = false | ||
284 | + | ||
285 | + attr_reader :drb_service # :nodoc: | ||
286 | + | ||
287 | + class DRbService # :nodoc: | ||
288 | + include DRbUndumped | ||
289 | + | ||
290 | + def initialize | ||
291 | + @handler = @eval_handler = @collision_handler = nil | ||
292 | + | ||
293 | + IRB.instance_eval { @CONF[:RC] = true } | ||
294 | + IRB.run_config | ||
295 | + end | ||
296 | + | ||
297 | + def collision | ||
298 | + sleep(0.5) until @collision_handler | ||
299 | + | ||
300 | + @collision_handler.untaint | ||
301 | + | ||
302 | + @collision_handler.call | ||
303 | + end | ||
304 | + | ||
305 | + def ping() end | ||
306 | + | ||
307 | + def add_breakpoint(context, message) | ||
308 | + workspace = IRB::WorkSpace.new(context) | ||
309 | + workspace.extend(DRbUndumped) | ||
310 | + | ||
311 | + sleep(0.5) until @handler | ||
312 | + | ||
313 | + @handler.untaint | ||
314 | + @handler.call(workspace, message) | ||
315 | + rescue Errno::ECONNREFUSED, DRb::DRbConnError | ||
316 | + raise if Breakpoint.use_drb? | ||
317 | + end | ||
318 | + | ||
319 | + attr_accessor :handler, :eval_handler, :collision_handler | ||
320 | + end | ||
321 | + | ||
322 | + # Will run Breakpoint in DRb mode. This will spawn a server | ||
323 | + # that can be attached to via the breakpoint-client command | ||
324 | + # whenever a breakpoint is executed. This is useful when you | ||
325 | + # are debugging CGI applications or other applications where | ||
326 | + # you can't access debug sessions via the standard input and | ||
327 | + # output of your application. | ||
328 | + # | ||
329 | + # You can specify an URI where the DRb server will run at. | ||
330 | + # This way you can specify the port the server runs on. The | ||
331 | + # default URI is druby://localhost:42531. | ||
332 | + # | ||
333 | + # Please note that breakpoints will be skipped silently in | ||
334 | + # case the DRb server can not spawned. (This can happen if | ||
335 | + # the port is already used by another instance of your | ||
336 | + # application on CGI or another application.) | ||
337 | + # | ||
338 | + # Also note that by default this will only allow access | ||
339 | + # from localhost. You can however specify a list of | ||
340 | + # allowed hosts or nil (to allow access from everywhere). | ||
341 | + # But that will still not protect you from somebody | ||
342 | + # reading the data as it goes through the net. | ||
343 | + # | ||
344 | + # A good approach for getting security and remote access | ||
345 | + # is setting up an SSH tunnel between the DRb service | ||
346 | + # and the client. This is usually done like this: | ||
347 | + # | ||
348 | + # $ ssh -L20000:127.0.0.1:20000 -R10000:127.0.0.1:10000 example.com | ||
349 | + # (This will connect port 20000 at the client side to port | ||
350 | + # 20000 at the server side, and port 10000 at the server | ||
351 | + # side to port 10000 at the client side.) | ||
352 | + # | ||
353 | + # After that do this on the server side: (the code being debugged) | ||
354 | + # Breakpoint.activate_drb("druby://127.0.0.1:20000", "localhost") | ||
355 | + # | ||
356 | + # And at the client side: | ||
357 | + # ruby breakpoint_client.rb -c druby://127.0.0.1:10000 -s druby://127.0.0.1:20000 | ||
358 | + # | ||
359 | + # Running through such a SSH proxy will also let you use | ||
360 | + # breakpoint.rb in case you are behind a firewall. | ||
361 | + # | ||
362 | + # Detailed information about running DRb through firewalls is | ||
363 | + # available at http://www.rubygarden.org/ruby?DrbTutorial | ||
364 | + # | ||
365 | + # == Security considerations | ||
366 | + # Usually you will be fine when using the default druby:// URI and the default | ||
367 | + # access control list. However, if you are sitting on a machine where there are | ||
368 | + # local users that you likely can not trust (this is the case for example on | ||
369 | + # most web hosts which have multiple users sitting on the same physical machine) | ||
370 | + # you will be better off by doing client/server communication through a unix | ||
371 | + # socket. This can be accomplished by calling with a drbunix:/ style URI, e.g. | ||
372 | + # <code>Breakpoint.activate_drb('drbunix:/tmp/breakpoint_server')</code>. This | ||
373 | + # will only work on Unix based platforms. | ||
374 | + def activate_drb(uri = nil, allowed_hosts = ['localhost', '127.0.0.1', '::1'], | ||
375 | + ignore_collisions = false) | ||
376 | + | ||
377 | + return false if @use_drb | ||
378 | + | ||
379 | + uri ||= 'druby://localhost:42531' | ||
380 | + | ||
381 | + if allowed_hosts then | ||
382 | + acl = ["deny", "all"] | ||
383 | + | ||
384 | + Array(allowed_hosts).each do |host| | ||
385 | + acl += ["allow", host] | ||
386 | + end | ||
387 | + | ||
388 | + DRb.install_acl(ACL.new(acl)) | ||
389 | + end | ||
390 | + | ||
391 | + @use_drb = true | ||
392 | + @drb_service = DRbService.new | ||
393 | + did_collision = false | ||
394 | + begin | ||
395 | + @service = DRb.start_service(uri, @drb_service) | ||
396 | + rescue Errno::EADDRINUSE | ||
397 | + if ignore_collisions then | ||
398 | + nil | ||
399 | + else | ||
400 | + # The port is already occupied by another | ||
401 | + # Breakpoint service. We will try to tell | ||
402 | + # the old service that we want its port. | ||
403 | + # It will then forward that request to the | ||
404 | + # user and retry. | ||
405 | + unless did_collision then | ||
406 | + DRbObject.new(nil, uri).collision | ||
407 | + did_collision = true | ||
408 | + end | ||
409 | + sleep(10) | ||
410 | + retry | ||
411 | + end | ||
412 | + end | ||
413 | + | ||
414 | + return true | ||
415 | + end | ||
416 | + | ||
417 | + # Deactivates a running Breakpoint service. | ||
418 | + def deactivate_drb | ||
419 | + Thread.exclusive do | ||
420 | + @service.stop_service unless @service.nil? | ||
421 | + @service = nil | ||
422 | + @use_drb = false | ||
423 | + @drb_service = nil | ||
424 | + end | ||
425 | + end | ||
426 | + | ||
427 | + # Returns true when Breakpoints are used over DRb. | ||
428 | + # Breakpoint.activate_drb causes this to be true. | ||
429 | + def use_drb? | ||
430 | + @use_drb == true | ||
431 | + end | ||
432 | +end | ||
433 | + | ||
434 | +module IRB # :nodoc: | ||
435 | + class << self; remove_method :start; end | ||
436 | + def self.start(ap_path = nil, main_context = nil, workspace = nil) | ||
437 | + $0 = File::basename(ap_path, ".rb") if ap_path | ||
438 | + | ||
439 | + # suppress some warnings about redefined constants | ||
440 | + old_verbose, $VERBOSE = $VERBOSE, nil | ||
441 | + IRB.setup(ap_path) | ||
442 | + $VERBOSE = old_verbose | ||
443 | + | ||
444 | + if @CONF[:SCRIPT] then | ||
445 | + irb = Irb.new(main_context, @CONF[:SCRIPT]) | ||
446 | + else | ||
447 | + irb = Irb.new(main_context) | ||
448 | + end | ||
449 | + | ||
450 | + if workspace then | ||
451 | + irb.context.workspace = workspace | ||
452 | + end | ||
453 | + | ||
454 | + @CONF[:IRB_RC].call(irb.context) if @CONF[:IRB_RC] | ||
455 | + @CONF[:MAIN_CONTEXT] = irb.context | ||
456 | + | ||
457 | + old_sigint = trap("SIGINT") do | ||
458 | + begin | ||
459 | + irb.signal_handle | ||
460 | + rescue RubyLex::TerminateLineInput | ||
461 | + # ignored | ||
462 | + end | ||
463 | + end | ||
464 | + | ||
465 | + catch(:IRB_EXIT) do | ||
466 | + irb.eval_input | ||
467 | + end | ||
468 | + ensure | ||
469 | + trap("SIGINT", old_sigint) | ||
470 | + end | ||
471 | + | ||
472 | + class << self | ||
473 | + alias :old_CurrentContext :CurrentContext | ||
474 | + remove_method :CurrentContext | ||
475 | + remove_method :parse_opts | ||
476 | + end | ||
477 | + | ||
478 | + def IRB.CurrentContext | ||
479 | + if old_CurrentContext.nil? and Breakpoint.use_drb? then | ||
480 | + result = Object.new | ||
481 | + def result.last_value; end | ||
482 | + return result | ||
483 | + else | ||
484 | + old_CurrentContext | ||
485 | + end | ||
486 | + end | ||
487 | + def IRB.parse_opts() end | ||
488 | + | ||
489 | + class Context # :nodoc: | ||
490 | + alias :old_evaluate :evaluate | ||
491 | + def evaluate(line, line_no) | ||
492 | + if line.chomp == "exit" then | ||
493 | + exit | ||
494 | + else | ||
495 | + old_evaluate(line, line_no) | ||
496 | + end | ||
497 | + end | ||
498 | + end | ||
499 | + | ||
500 | + class WorkSpace # :nodoc: | ||
501 | + alias :old_evaluate :evaluate | ||
502 | + | ||
503 | + def evaluate(*args) | ||
504 | + if Breakpoint.use_drb? then | ||
505 | + result = old_evaluate(*args) | ||
506 | + if args[0] != :no_proxy and | ||
507 | + not [true, false, nil].include?(result) | ||
508 | + then | ||
509 | + result.extend(DRbUndumped) rescue nil | ||
510 | + end | ||
511 | + return result | ||
512 | + else | ||
513 | + old_evaluate(*args) | ||
514 | + end | ||
515 | + end | ||
516 | + end | ||
517 | + | ||
518 | + module InputCompletor # :nodoc: | ||
519 | + def self.eval(code, context, *more) | ||
520 | + # Big hack, this assumes that InputCompletor | ||
521 | + # will only call eval() when it wants code | ||
522 | + # to be executed in the IRB context. | ||
523 | + IRB.conf[:MAIN_CONTEXT].workspace.evaluate(:no_proxy, code, *more) | ||
524 | + end | ||
525 | + end | ||
526 | +end | ||
527 | + | ||
528 | +module DRb # :nodoc: | ||
529 | + class DRbObject # :nodoc: | ||
530 | + undef :inspect if method_defined?(:inspect) | ||
531 | + undef :clone if method_defined?(:clone) | ||
532 | + end | ||
533 | +end | ||
534 | + | ||
535 | +# See Breakpoint.breakpoint | ||
536 | +def breakpoint(id = nil, &block) | ||
537 | + Binding.of_caller do |context| | ||
538 | + Breakpoint.breakpoint(id, context, &block) | ||
539 | + end | ||
540 | +end | ||
541 | + | ||
542 | +# See Breakpoint.assert | ||
543 | +def assert(&block) | ||
544 | + Binding.of_caller do |context| | ||
545 | + Breakpoint.assert(context, &block) | ||
546 | + end | ||
547 | +end |
vendor/gems/cucumber-0.3.98/examples/dos_line_endings/features/dos_line_endings.feature
1 | -Feature: DOS line endings | ||
2 | - In order to have less bug reports | ||
3 | - As a windows developer | ||
4 | - I want to write features with DOS line endigs | ||
5 | - | ||
6 | - Scenario: Just lots of DOS | ||
7 | - Given I am on DOS | ||
8 | - And Any version of Windows is really just DOS | ||
9 | - Then Windows still sucks | 1 | +Feature: DOS line endings |
2 | + In order to have less bug reports | ||
3 | + As a windows developer | ||
4 | + I want to write features with DOS line endigs | ||
5 | + | ||
6 | + Scenario: Just lots of DOS | ||
7 | + Given I am on DOS | ||
8 | + And Any version of Windows is really just DOS | ||
9 | + Then Windows still sucks |
vendor/gems/cucumber-0.3.98/spec/cucumber/treetop_parser/test_dos.feature
1 | -Feature: Search | ||
2 | - In order to learn cucumber | ||
3 | - As an engineer | ||
4 | - I want to run some simple tests | ||
5 | - | ||
6 | - Scenario: 1) Reverse a String | ||
7 | - Given a string "abc" | ||
8 | - When the string is reversed | ||
9 | - Then the string should be "cba" | ||
10 | - | ||
11 | - More Examples: | ||
12 | - |input |output| | ||
13 | - |a |a | | ||
14 | - |ab |ba | | ||
15 | - | ||
16 | - Scenario: 2) Upcase a String | ||
17 | - Given a string "abc" | ||
18 | - When the string is upcased | ||
19 | - Then the string should be "ABC" | ||
20 | - | ||
21 | - Scenario: 3) Combining 2 Methods | ||
22 | - Given a string "abc" | ||
23 | - When the string is upcased | ||
24 | - And the string is reversed | 1 | +Feature: Search |
2 | + In order to learn cucumber | ||
3 | + As an engineer | ||
4 | + I want to run some simple tests | ||
5 | + | ||
6 | + Scenario: 1) Reverse a String | ||
7 | + Given a string "abc" | ||
8 | + When the string is reversed | ||
9 | + Then the string should be "cba" | ||
10 | + | ||
11 | + More Examples: | ||
12 | + |input |output| | ||
13 | + |a |a | | ||
14 | + |ab |ba | | ||
15 | + | ||
16 | + Scenario: 2) Upcase a String | ||
17 | + Given a string "abc" | ||
18 | + When the string is upcased | ||
19 | + Then the string should be "ABC" | ||
20 | + | ||
21 | + Scenario: 3) Combining 2 Methods | ||
22 | + Given a string "abc" | ||
23 | + When the string is upcased | ||
24 | + And the string is reversed | ||
25 | Then the string should be "CBA" | 25 | Then the string should be "CBA" |
26 | \ No newline at end of file | 26 | \ No newline at end of file |
vendor/gems/fakeweb-1.2.5/test/fixtures/google_response_from_curl
1 | -HTTP/1.1 200 OK | ||
2 | -Cache-Control: private, max-age=0 | ||
3 | -Date: Sun, 01 Feb 2009 02:16:24 GMT | ||
4 | -Expires: -1 | ||
5 | -Content-Type: text/html; charset=ISO-8859-1 | ||
6 | -Set-Cookie: PREF=ID=a6d9b5f5a4056dfe:TM=1233454584:LM=1233454584:S=U9pSwSu4eQwOPenX; expires=Tue, 01-Feb-2011 02:16:24 GMT; path=/; domain=.google.com | ||
7 | -Server: gws | ||
8 | -Transfer-Encoding: chunked | ||
9 | - | 1 | +HTTP/1.1 200 OK |
2 | +Cache-Control: private, max-age=0 | ||
3 | +Date: Sun, 01 Feb 2009 02:16:24 GMT | ||
4 | +Expires: -1 | ||
5 | +Content-Type: text/html; charset=ISO-8859-1 | ||
6 | +Set-Cookie: PREF=ID=a6d9b5f5a4056dfe:TM=1233454584:LM=1233454584:S=U9pSwSu4eQwOPenX; expires=Tue, 01-Feb-2011 02:16:24 GMT; path=/; domain=.google.com | ||
7 | +Server: gws | ||
8 | +Transfer-Encoding: chunked | ||
9 | + | ||
10 | <html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><script>var _gjwl=location;function _gjuc(){var a=_gjwl.hash;if(a.indexOf("&q=")>0||a.indexOf("#q=")>=0){a=a.substring(1);if(a.indexOf("#")==-1){for(var c=0;c<a.length;){var d=c;if(a.charAt(d)=="&")++d;var b=a.indexOf("&",d);if(b==-1)b=a.length;var e=a.substring(d,b);if(e.indexOf("fp=")==0){a=a.substring(0,c)+a.substring(b,a.length);b=c}else if(e=="cad=h")return 0;c=b}_gjwl.href="search?"+a+"&cad=h";return 1}}return 0}; | 10 | <html><head><meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"><title>Google</title><script>var _gjwl=location;function _gjuc(){var a=_gjwl.hash;if(a.indexOf("&q=")>0||a.indexOf("#q=")>=0){a=a.substring(1);if(a.indexOf("#")==-1){for(var c=0;c<a.length;){var d=c;if(a.charAt(d)=="&")++d;var b=a.indexOf("&",d);if(b==-1)b=a.length;var e=a.substring(d,b);if(e.indexOf("fp=")==0){a=a.substring(0,c)+a.substring(b,a.length);b=c}else if(e=="cad=h")return 0;c=b}_gjwl.href="search?"+a+"&cad=h";return 1}}return 0}; |
11 | window._gjuc && location.hash && _gjuc();</script><style>body,td,a,p,.h{font-family:arial,sans-serif}.h{color:#36c;font-size:20px}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}#gbar{height:22px;padding-left:2px}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#gbi,#gbs{background:#fff;left:0;position:absolute;top:24px;visibility:hidden;z-index:1000}#gbi{border:1px solid;border-color:#c9d7f1 #36c #36c #a2bae7;z-index:1001}#guser{padding-bottom:7px !important}#gbar,#guser{font-size:13px;padding-top:1px !important}@media all{.gb1,.gb3{height:22px;margin-right:.73em;vertical-align:top}#gbar{float:left}}.gb2{display:block;padding:.2em .5em}a.gb1,a.gb2,a.gb3{color:#00c !important}.gb2,.gb3{text-decoration:none}a.gb2:hover{background:#36c;color:#fff !important}</style><script>window.google={kEI:"-AWFSZ6qFYuUswO9j5HIDQ",kEXPI:"17259,19547",kHL:"en"}; | 11 | window._gjuc && location.hash && _gjuc();</script><style>body,td,a,p,.h{font-family:arial,sans-serif}.h{color:#36c;font-size:20px}.q{color:#00c}.ts td{padding:0}.ts{border-collapse:collapse}#gbar{height:22px;padding-left:2px}.gbh,.gbd{border-top:1px solid #c9d7f1;font-size:1px}.gbh{height:0;position:absolute;top:24px;width:100%}#gbi,#gbs{background:#fff;left:0;position:absolute;top:24px;visibility:hidden;z-index:1000}#gbi{border:1px solid;border-color:#c9d7f1 #36c #36c #a2bae7;z-index:1001}#guser{padding-bottom:7px !important}#gbar,#guser{font-size:13px;padding-top:1px !important}@media all{.gb1,.gb3{height:22px;margin-right:.73em;vertical-align:top}#gbar{float:left}}.gb2{display:block;padding:.2em .5em}a.gb1,a.gb2,a.gb3{color:#00c !important}.gb2,.gb3{text-decoration:none}a.gb2:hover{background:#36c;color:#fff !important}</style><script>window.google={kEI:"-AWFSZ6qFYuUswO9j5HIDQ",kEXPI:"17259,19547",kHL:"en"}; |
12 | google.y={};google.x=function(e,g){google.y[e.id]=[e,g];return false};window.gbar={};(function(){var b=window.gbar,f,h;b.qs=function(a){var c=window.encodeURIComponent&&(document.forms[0].q||"").value;if(c)a.href=a.href.replace(/([?&])q=[^&]*|$/,function(i,g){return(g||"&")+"q="+encodeURIComponent(c)})};function j(a,c){a.visibility=h?"hidden":"visible";a.left=c+"px"}b.tg=function(a){a=a||window.event;var c=0,i,g=window.navExtra,d=document.getElementById("gbi"),e=a.target||a.srcElement;a.cancelBubble=true;if(!f){f=document.createElement(Array.every||window.createPopup?"iframe":"div");f.frameBorder="0";f.src="#";d.parentNode.appendChild(f).id="gbs";if(g)for(i in g)d.insertBefore(g[i],d.firstChild).className="gb2";document.onclick=b.close}if(e.className!="gb3")e=e.parentNode;do c+=e.offsetLeft;while(e=e.offsetParent);j(d.style,c);f.style.width=d.offsetWidth+"px";f.style.height=d.offsetHeight+"px";j(f.style,c);h=!h};b.close=function(a){h&&b.tg(a)}})();</script></head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onload="document.f.q.focus();if(document.images)new Image().src='/images/nav_logo3.png'" topmargin=3 marginheight=3><div id=gbar><nobr><b class=gb1>Web</b> <a href="http://images.google.com/imghp?hl=en&tab=wi" onclick=gbar.qs(this) class=gb1>Images</a> <a href="http://maps.google.com/maps?hl=en&tab=wl" onclick=gbar.qs(this) class=gb1>Maps</a> <a href="http://news.google.com/nwshp?hl=en&tab=wn" onclick=gbar.qs(this) class=gb1>News</a> <a href="http://www.google.com/prdhp?hl=en&tab=wf" onclick=gbar.qs(this) class=gb1>Shopping</a> <a href="http://mail.google.com/mail/?hl=en&tab=wm" class=gb1>Gmail</a> <a href="http://www.google.com/intl/en/options/" onclick="this.blur();gbar.tg(event);return !1" class=gb3><u>more</u> <small>▼</small></a><div id=gbi> <a href="http://video.google.com/?hl=en&tab=wv" onclick=gbar.qs(this) class=gb2>Video</a> <a href="http://groups.google.com/grphp?hl=en&tab=wg" onclick=gbar.qs(this) class=gb2>Groups</a> <a href="http://books.google.com/bkshp?hl=en&tab=wp" onclick=gbar.qs(this) class=gb2>Books</a> <a href="http://scholar.google.com/schhp?hl=en&tab=ws" onclick=gbar.qs(this) class=gb2>Scholar</a> <a href="http://finance.google.com/finance?hl=en&tab=we" onclick=gbar.qs(this) class=gb2>Finance</a> <a href="http://blogsearch.google.com/?hl=en&tab=wb" onclick=gbar.qs(this) class=gb2>Blogs</a> <div class=gb2><div class=gbd></div></div> <a href="http://www.youtube.com/?hl=en&tab=w1" onclick=gbar.qs(this) class=gb2>YouTube</a> <a href="http://www.google.com/calendar/render?hl=en&tab=wc" class=gb2>Calendar</a> <a href="http://picasaweb.google.com/home?hl=en&tab=wq" onclick=gbar.qs(this) class=gb2>Photos</a> <a href="http://docs.google.com/?hl=en&tab=wo" class=gb2>Documents</a> <a href="http://www.google.com/reader/view/?hl=en&tab=wy" class=gb2>Reader</a> <a href="http://sites.google.com/?hl=en&tab=w3" class=gb2>Sites</a> <div class=gb2><div class=gbd></div></div> <a href="http://www.google.com/intl/en/options/" class=gb2>even more »</a></div> </nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div><div align=right id=guser style="font-size:84%;padding:0 0 4px" width=100%><nobr><a href="/url?sa=p&pref=ig&pval=3&q=http://www.google.com/ig%3Fhl%3Den%26source%3Diglk&usg=AFQjCNFA18XPfgb7dKnXfKz7x7g1GDH1tg">iGoogle</a> | <a href="https://www.google.com/accounts/Login?continue=http://www.google.com/&hl=en">Sign in</a></nobr></div><center><br clear=all id=lgpd><img alt="Google" height=110 src="/intl/en_ALL/images/logo.gif" width=276><br><br><form action="/search" name=f><table cellpadding=0 cellspacing=0><tr valign=top><td width=25%> </td><td align=center nowrap><input name=hl type=hidden value=en><input type=hidden name=ie value="ISO-8859-1"><input autocomplete="off" maxlength=2048 name=q size=55 title="Google Search" value=""><br><input name=btnG type=submit value="Google Search"><input name=btnI type=submit value="I'm Feeling Lucky"></td><td nowrap width=25%><font size=-2> <a href=/advanced_search?hl=en>Advanced Search</a><br> <a href=/preferences?hl=en>Preferences</a><br> <a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><font size=-1>Share what you know. <a href="/aclk?sa=L&ai=CYhslHwSFSZH6LIHusAPEsc2eBfv77nqP3YC9CsHZnNkTEAEgwVRQypDftPn_____AWDJBqoECU_QbUVlfOdxZw&num=1&sig=AGiWqtwRgqw8y_kza6RGKxBrCstaXkDJ7A&q=http://knol.google.com">Write a Knol</a>.</font><br><br><br><font size=-1><a href="/intl/en/ads/">Advertising Programs</a> - <a href="/services/">Business Solutions</a> - <a href="/intl/en/about.html">About Google</a></font><p><font size=-2>©2009 - <a href="/intl/en/privacy.html">Privacy</a></font></p></center></body><script>if(google.y)google.y.first=[];window.setTimeout(function(){var xjs=document.createElement('script');xjs.src='/extern_js/f/CgJlbhICdXMgACswCjgVLCswDjgELCswGDgDLA/L3N5xu59nDE.js';document.getElementsByTagName('head')[0].appendChild(xjs)},0);google.y.first.push(function(){google.ac.i(document.f,document.f.q,'','')})</script><script>function _gjp() {!(location.hash && _gjuc()) && setTimeout(_gjp, 500);}window._gjuc && _gjp();</script></html> | 12 | google.y={};google.x=function(e,g){google.y[e.id]=[e,g];return false};window.gbar={};(function(){var b=window.gbar,f,h;b.qs=function(a){var c=window.encodeURIComponent&&(document.forms[0].q||"").value;if(c)a.href=a.href.replace(/([?&])q=[^&]*|$/,function(i,g){return(g||"&")+"q="+encodeURIComponent(c)})};function j(a,c){a.visibility=h?"hidden":"visible";a.left=c+"px"}b.tg=function(a){a=a||window.event;var c=0,i,g=window.navExtra,d=document.getElementById("gbi"),e=a.target||a.srcElement;a.cancelBubble=true;if(!f){f=document.createElement(Array.every||window.createPopup?"iframe":"div");f.frameBorder="0";f.src="#";d.parentNode.appendChild(f).id="gbs";if(g)for(i in g)d.insertBefore(g[i],d.firstChild).className="gb2";document.onclick=b.close}if(e.className!="gb3")e=e.parentNode;do c+=e.offsetLeft;while(e=e.offsetParent);j(d.style,c);f.style.width=d.offsetWidth+"px";f.style.height=d.offsetHeight+"px";j(f.style,c);h=!h};b.close=function(a){h&&b.tg(a)}})();</script></head><body bgcolor=#ffffff text=#000000 link=#0000cc vlink=#551a8b alink=#ff0000 onload="document.f.q.focus();if(document.images)new Image().src='/images/nav_logo3.png'" topmargin=3 marginheight=3><div id=gbar><nobr><b class=gb1>Web</b> <a href="http://images.google.com/imghp?hl=en&tab=wi" onclick=gbar.qs(this) class=gb1>Images</a> <a href="http://maps.google.com/maps?hl=en&tab=wl" onclick=gbar.qs(this) class=gb1>Maps</a> <a href="http://news.google.com/nwshp?hl=en&tab=wn" onclick=gbar.qs(this) class=gb1>News</a> <a href="http://www.google.com/prdhp?hl=en&tab=wf" onclick=gbar.qs(this) class=gb1>Shopping</a> <a href="http://mail.google.com/mail/?hl=en&tab=wm" class=gb1>Gmail</a> <a href="http://www.google.com/intl/en/options/" onclick="this.blur();gbar.tg(event);return !1" class=gb3><u>more</u> <small>▼</small></a><div id=gbi> <a href="http://video.google.com/?hl=en&tab=wv" onclick=gbar.qs(this) class=gb2>Video</a> <a href="http://groups.google.com/grphp?hl=en&tab=wg" onclick=gbar.qs(this) class=gb2>Groups</a> <a href="http://books.google.com/bkshp?hl=en&tab=wp" onclick=gbar.qs(this) class=gb2>Books</a> <a href="http://scholar.google.com/schhp?hl=en&tab=ws" onclick=gbar.qs(this) class=gb2>Scholar</a> <a href="http://finance.google.com/finance?hl=en&tab=we" onclick=gbar.qs(this) class=gb2>Finance</a> <a href="http://blogsearch.google.com/?hl=en&tab=wb" onclick=gbar.qs(this) class=gb2>Blogs</a> <div class=gb2><div class=gbd></div></div> <a href="http://www.youtube.com/?hl=en&tab=w1" onclick=gbar.qs(this) class=gb2>YouTube</a> <a href="http://www.google.com/calendar/render?hl=en&tab=wc" class=gb2>Calendar</a> <a href="http://picasaweb.google.com/home?hl=en&tab=wq" onclick=gbar.qs(this) class=gb2>Photos</a> <a href="http://docs.google.com/?hl=en&tab=wo" class=gb2>Documents</a> <a href="http://www.google.com/reader/view/?hl=en&tab=wy" class=gb2>Reader</a> <a href="http://sites.google.com/?hl=en&tab=w3" class=gb2>Sites</a> <div class=gb2><div class=gbd></div></div> <a href="http://www.google.com/intl/en/options/" class=gb2>even more »</a></div> </nobr></div><div class=gbh style=left:0></div><div class=gbh style=right:0></div><div align=right id=guser style="font-size:84%;padding:0 0 4px" width=100%><nobr><a href="/url?sa=p&pref=ig&pval=3&q=http://www.google.com/ig%3Fhl%3Den%26source%3Diglk&usg=AFQjCNFA18XPfgb7dKnXfKz7x7g1GDH1tg">iGoogle</a> | <a href="https://www.google.com/accounts/Login?continue=http://www.google.com/&hl=en">Sign in</a></nobr></div><center><br clear=all id=lgpd><img alt="Google" height=110 src="/intl/en_ALL/images/logo.gif" width=276><br><br><form action="/search" name=f><table cellpadding=0 cellspacing=0><tr valign=top><td width=25%> </td><td align=center nowrap><input name=hl type=hidden value=en><input type=hidden name=ie value="ISO-8859-1"><input autocomplete="off" maxlength=2048 name=q size=55 title="Google Search" value=""><br><input name=btnG type=submit value="Google Search"><input name=btnI type=submit value="I'm Feeling Lucky"></td><td nowrap width=25%><font size=-2> <a href=/advanced_search?hl=en>Advanced Search</a><br> <a href=/preferences?hl=en>Preferences</a><br> <a href=/language_tools?hl=en>Language Tools</a></font></td></tr></table></form><br><font size=-1>Share what you know. <a href="/aclk?sa=L&ai=CYhslHwSFSZH6LIHusAPEsc2eBfv77nqP3YC9CsHZnNkTEAEgwVRQypDftPn_____AWDJBqoECU_QbUVlfOdxZw&num=1&sig=AGiWqtwRgqw8y_kza6RGKxBrCstaXkDJ7A&q=http://knol.google.com">Write a Knol</a>.</font><br><br><br><font size=-1><a href="/intl/en/ads/">Advertising Programs</a> - <a href="/services/">Business Solutions</a> - <a href="/intl/en/about.html">About Google</a></font><p><font size=-2>©2009 - <a href="/intl/en/privacy.html">Privacy</a></font></p></center></body><script>if(google.y)google.y.first=[];window.setTimeout(function(){var xjs=document.createElement('script');xjs.src='/extern_js/f/CgJlbhICdXMgACswCjgVLCswDjgELCswGDgDLA/L3N5xu59nDE.js';document.getElementsByTagName('head')[0].appendChild(xjs)},0);google.y.first.push(function(){google.ac.i(document.f,document.f.q,'','')})</script><script>function _gjp() {!(location.hash && _gjuc()) && setTimeout(_gjp, 500);}window._gjuc && _gjp();</script></html> |
13 | \ No newline at end of file | 13 | \ No newline at end of file |
vendor/gems/polyglot-0.2.8/Rakefile
1 | -require 'config/requirements' | ||
2 | -require 'config/hoe' # setup Hoe + all gem configuration | ||
3 | - | 1 | +require 'config/requirements' |
2 | +require 'config/hoe' # setup Hoe + all gem configuration | ||
3 | + | ||
4 | Dir['tasks/**/*.rake'].each { |rake| load rake } | 4 | Dir['tasks/**/*.rake'].each { |rake| load rake } |
5 | \ No newline at end of file | 5 | \ No newline at end of file |
vendor/gems/thoughtbot-shoulda-2.10.1/MIT-LICENSE
1 | -Copyright (c) 2007, Tammer Saleh, Thoughtbot, Inc. | ||
2 | - | ||
3 | -Permission is hereby granted, free of charge, to any person | ||
4 | -obtaining a copy of this software and associated documentation | ||
5 | -files (the "Software"), to deal in the Software without | ||
6 | -restriction, including without limitation the rights to use, | ||
7 | -copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
8 | -copies of the Software, and to permit persons to whom the | ||
9 | -Software is furnished to do so, subject to the following | ||
10 | -conditions: | ||
11 | - | ||
12 | -The above copyright notice and this permission notice shall be | ||
13 | -included in all copies or substantial portions of the Software. | ||
14 | - | ||
15 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
16 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
17 | -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
18 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
19 | -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
20 | -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | -OTHER DEALINGS IN THE SOFTWARE. | 1 | +Copyright (c) 2007, Tammer Saleh, Thoughtbot, Inc. |
2 | + | ||
3 | +Permission is hereby granted, free of charge, to any person | ||
4 | +obtaining a copy of this software and associated documentation | ||
5 | +files (the "Software"), to deal in the Software without | ||
6 | +restriction, including without limitation the rights to use, | ||
7 | +copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
8 | +copies of the Software, and to permit persons to whom the | ||
9 | +Software is furnished to do so, subject to the following | ||
10 | +conditions: | ||
11 | + | ||
12 | +The above copyright notice and this permission notice shall be | ||
13 | +included in all copies or substantial portions of the Software. | ||
14 | + | ||
15 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
16 | +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
17 | +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
18 | +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
19 | +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
20 | +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | +OTHER DEALINGS IN THE SOFTWARE. |
vendor/plugins/hoptoad_notifier/MIT-LICENSE
1 | -Copyright (c) 2007, Tammer Saleh, Thoughtbot, Inc. | ||
2 | - | ||
3 | -Permission is hereby granted, free of charge, to any person | ||
4 | -obtaining a copy of this software and associated documentation | ||
5 | -files (the "Software"), to deal in the Software without | ||
6 | -restriction, including without limitation the rights to use, | ||
7 | -copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
8 | -copies of the Software, and to permit persons to whom the | ||
9 | -Software is furnished to do so, subject to the following | ||
10 | -conditions: | ||
11 | - | ||
12 | -The above copyright notice and this permission notice shall be | ||
13 | -included in all copies or substantial portions of the Software. | ||
14 | - | ||
15 | -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
16 | -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
17 | -OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
18 | -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
19 | -HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
20 | -WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | -FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | -OTHER DEALINGS IN THE SOFTWARE. | 1 | +Copyright (c) 2007, Tammer Saleh, Thoughtbot, Inc. |
2 | + | ||
3 | +Permission is hereby granted, free of charge, to any person | ||
4 | +obtaining a copy of this software and associated documentation | ||
5 | +files (the "Software"), to deal in the Software without | ||
6 | +restriction, including without limitation the rights to use, | ||
7 | +copy, modify, merge, publish, distribute, sublicense, and/or sell | ||
8 | +copies of the Software, and to permit persons to whom the | ||
9 | +Software is furnished to do so, subject to the following | ||
10 | +conditions: | ||
11 | + | ||
12 | +The above copyright notice and this permission notice shall be | ||
13 | +included in all copies or substantial portions of the Software. | ||
14 | + | ||
15 | +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | ||
16 | +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES | ||
17 | +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | ||
18 | +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | ||
19 | +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | ||
20 | +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING | ||
21 | +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR | ||
22 | +OTHER DEALINGS IN THE SOFTWARE. |