leap 0.5.7 → 0.5.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ unreleased
2
+
3
+ * Enhancements
4
+
5
+ * Stop requiring blockenspiel - just instance_eval is enough
6
+ * Switch to minitest
7
+ * Test on MRI 1.8, MRI 1.9, and JRuby 1.6.7+
data/Rakefile CHANGED
@@ -1,27 +1,20 @@
1
- require 'rubygems'
2
-
3
- begin
4
- require 'bundler'
5
- rescue LoadError
6
- $stderr.puts "You must install bundler - run `gem install bundler`"
7
- end
8
-
9
- begin
10
- Bundler.setup
11
- rescue Bundler::BundlerError => e
12
- $stderr.puts e.message
13
- $stderr.puts "Run `bundle install` to install missing gems"
14
- exit e.status_code
15
- end
16
-
17
- require 'bueller'
18
- Bueller::Tasks.new
1
+ #!/usr/bin/env rake
2
+ require "bundler/gem_tasks"
19
3
 
20
4
  require 'rake'
21
5
  require 'rake/testtask'
22
6
  Rake::TestTask.new(:test) do |test|
23
- test.libs << 'lib' << 'test'
7
+ test.libs << 'test'
24
8
  test.pattern = 'test/**/test_*.rb'
25
9
  test.verbose = true
26
10
  end
11
+
12
+ require 'bueller'
13
+ Bueller::Tasks.new
14
+
27
15
  task :default => :test
16
+
17
+ require 'yard'
18
+ YARD::Rake::YardocTask.new do |y|
19
+ y.options << '--no-private'
20
+ end
@@ -1,28 +1,26 @@
1
- # -*- encoding: utf-8 -*-
2
- $:.push File.expand_path("../lib", __FILE__)
3
- require "leap/version"
4
-
5
- Gem::Specification.new do |s|
6
- s.name = "leap"
7
- s.version = Leap::VERSION
8
- s.platform = Gem::Platform::RUBY
9
- s.authors = ["Andy Rossmeissl", "Seamus Abshere", "Derek Kastner"]
10
- s.email = "andy@rossmeissl.net"
11
- s.homepage = "http://github.com/rossmeissl/leap"
12
- s.summary = %Q{A heuristics engine for your Ruby objects}
13
- s.description = %Q{Leap to conclusions}
14
-
15
- s.files = `git ls-files`.split("\n")
16
- s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
17
- s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
18
- s.require_paths = ["lib"]
19
-
20
- s.add_development_dependency "charisma", '~>0.2.0'
21
- s.add_development_dependency "shoulda"
22
- s.add_development_dependency 'bueller'
23
- s.add_dependency 'blockenspiel', '>=0.3.2'
24
- s.add_dependency 'activesupport', '>=2.3.4'
25
- # sabshere 1/27/11 for activesupport - http://groups.google.com/group/ruby-bundler/browse_thread/thread/b4a2fc61ac0b5438
26
- s.add_dependency 'i18n'
27
- s.add_dependency 'builder'
28
- end
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path("../lib/leap/version", __FILE__)
3
+
4
+ Gem::Specification.new do |s|
5
+ s.name = "leap"
6
+ s.version = Leap::VERSION
7
+ s.authors = ["Andy Rossmeissl", "Seamus Abshere", "Derek Kastner"]
8
+ s.email = "andy@rossmeissl.net"
9
+ s.homepage = "https://github.com/rossmeissl/leap"
10
+ s.summary = %Q{A heuristics engine for your Ruby objects}
11
+ s.description = %Q{Leap to conclusions}
12
+
13
+ s.files = `git ls-files`.split("\n")
14
+ s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
15
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
16
+ s.require_paths = ["lib"]
17
+
18
+ s.add_development_dependency 'charisma'
19
+ s.add_development_dependency 'minitest'
20
+ s.add_development_dependency 'minitest-reporters'
21
+ s.add_development_dependency 'bueller'
22
+ s.add_dependency 'yard'
23
+ s.add_dependency 'activesupport', '>=2.3.4'
24
+ # sabshere 1/27/11 for activesupport - http://groups.google.com/group/ruby-bundler/browse_thread/thread/b4a2fc61ac0b5438
25
+ s.add_dependency 'i18n'
26
+ end
@@ -1,12 +1,8 @@
1
+ require 'active_support'
1
2
  require 'active_support/version'
2
- %w{
3
- active_support/core_ext/hash/slice
4
- active_support/core_ext/array/wrap
5
- active_support/core_ext/array/extract_options
6
- }.each do |active_support_3_requirement|
7
- require active_support_3_requirement
8
- end if ActiveSupport::VERSION::MAJOR == 3
9
- require 'blockenspiel'
3
+ if ActiveSupport::VERSION::MAJOR >= 3
4
+ require 'active_support/core_ext'
5
+ end
10
6
 
11
7
  require 'leap/subject'
12
8
  require 'leap/committee'
@@ -49,7 +49,7 @@ module Leap
49
49
  Leap.log.committee "Convening committee", name
50
50
  quorums.each do |quorum|
51
51
  Leap.log.quorum "Assessing quorum", quorum.name
52
- next unless quorum.satisfied_by? characteristics and quorum.complies_with? Array.wrap(options[:comply])
52
+ next unless quorum.satisfied_by? characteristics and quorum.complies_with? options[:comply]
53
53
  Leap.log.quorum "Acknowledging quorum", quorum.name
54
54
  if conclusion = quorum.acknowledge(characteristics.slice(*quorum.characteristics), considerations.dup)
55
55
  Leap.log.quorum "Success", quorum.name
@@ -59,8 +59,6 @@ module Leap
59
59
  nil
60
60
  end
61
61
 
62
- include ::Blockenspiel::DSL
63
-
64
62
  # Defines a quorum within this committee.
65
63
  #
66
64
  # A quorum encapsulate a specific methodology for drawing the committe's conclusion.
@@ -48,8 +48,6 @@ module Leap
48
48
  end
49
49
  end
50
50
 
51
- include ::Blockenspiel::DSL
52
-
53
51
  # Define a committee within the decision.
54
52
  #
55
53
  # Used within a <tt>Leap::Subject#decide</tt> block to define a new committee. See <tt>Leap::Committee</tt> for details.
@@ -58,7 +56,7 @@ module Leap
58
56
  def committee(name, options = {}, &blk)
59
57
  committee = ::Leap::Committee.new(name, options)
60
58
  @committees << committee
61
- ::Blockenspiel.invoke blk, committee
59
+ committee.instance_eval(&blk)
62
60
  end
63
61
  end
64
62
  end
@@ -36,10 +36,32 @@ module Leap
36
36
  end
37
37
 
38
38
  # Does the quorum comply with the given set of protocols?
39
- # @param [Array] guideines The list of protocols we're for which we're checking compliance.
39
+ # @param [Array, Hash, Object] guidelines The list of protocols for which we're checking compliance.
40
40
  # @return [TrueClass, NilClass]
41
41
  def complies_with?(guidelines)
42
- (guidelines - compliance).empty?
42
+ case guidelines
43
+ when Hash
44
+ inversion = guidelines.inject({}) do |memo, pair|
45
+ protocol, committees = pair
46
+ Array.wrap(committees).each do |committee|
47
+ if memo[committee]
48
+ memo[committee] << protocol
49
+ else
50
+ memo[committee] = [protocol]
51
+ end
52
+ end
53
+ memo
54
+ end
55
+ inversion.values.any? do |committee_guidelines|
56
+ (committee_guidelines - compliance).empty?
57
+ end
58
+ when Array
59
+ (guidelines - compliance).empty?
60
+ when NilClass
61
+ true
62
+ else
63
+ compliance.include? guidelines
64
+ end
43
65
  end
44
66
 
45
67
  # Perform the quorum's methodology using the given characteristics.
@@ -48,30 +48,31 @@ module Leap
48
48
  # @see Leap::ImplicitAttributes
49
49
  def decide(goal, options = {}, &blk)
50
50
  decisions[goal] = ::Leap::Decision.new goal, options
51
- Blockenspiel.invoke(blk, decisions[goal])
51
+ decisions[goal].instance_eval(&blk)
52
52
  define_method goal do |*considerations|
53
+ decision = self.class.decisions[goal]
54
+ options = considerations.extract_options!
55
+ @deliberations ||= {}
53
56
  Leap.instrument.decision goal do
54
- options = considerations.extract_options!
55
- @deliberations ||= {}
56
- decision = self.class.decisions[goal]
57
57
  characteristics = send(decision.signature_method)
58
58
  @deliberations[goal] = decision.make(characteristics, options, *considerations)
59
- if decision.mastered? and @deliberations[goal][goal].nil?
60
- raise ::Leap::NoSolutionError, :goal => goal, :deliberation => @deliberations[goal]
61
- elsif decision.mastered?
62
- Leap.log.decision "Success", goal
63
- @deliberations[goal][goal]
64
- elsif options[:comply].is_a? Hash
65
- options[:comply].each do |protocol, committees|
66
- [committees].flatten.each do |committee|
67
- @deliberations[goal].compliance(committee).include?(protocol) or raise ::Leap::NoSolutionError, :goal => committee, :deliberation => @deliberations[goal]
68
- end
59
+ end
60
+ if decision.mastered? and @deliberations[goal][goal].nil?
61
+ raise ::Leap::NoSolutionError, :goal => goal, :deliberation => @deliberations[goal]
62
+ elsif decision.mastered?
63
+ Leap.log.decision "Success", goal
64
+ @deliberations[goal][goal]
65
+ elsif options[:comply].is_a? Hash
66
+ options[:comply].each do |protocol, committees|
67
+ [committees].flatten.each do |committee|
68
+ @deliberations[goal].compliance(committee).include?(protocol) or raise ::Leap::NoSolutionError, :goal => committee, :deliberation => @deliberations[goal]
69
69
  end
70
- Leap.log.decision "Success", goal
71
- else
72
- Leap.log.decision "Success", goal
73
- @deliberations[goal]
74
70
  end
71
+ Leap.log.decision "Success", goal
72
+ @deliberations[goal]
73
+ else
74
+ Leap.log.decision "Success", goal
75
+ @deliberations[goal]
75
76
  end
76
77
  end
77
78
  end
@@ -1,3 +1,3 @@
1
- module Leap
2
- VERSION = "0.5.7"
3
- end
1
+ module Leap
2
+ VERSION = "0.5.8"
3
+ end
@@ -43,13 +43,28 @@ module Leap
43
43
  # @param [String, Symbol] name The quorum's name
44
44
  # @param [Proc] blk A proc wrapping the quorum activity to instrument
45
45
  def quorum(name, &blk)
46
- Leap.log.quorum instrument(&blk), name
46
+ message, result = instrument(true, &blk)
47
+ Leap.log.quorum message, name
48
+ result
47
49
  end
48
-
50
+
49
51
  private
50
52
 
51
- def instrument(&blk)
52
- 'Completed in ' + Benchmark.measure(&blk).format('%10.6r').gsub(/[()]/,'').strip + 's'
53
+ # Give Procs the capacity to remember their result.
54
+ module Registered
55
+ # Result storage
56
+ attr_reader :result
57
+
58
+ # Override Proc#call here to ensure storage
59
+ def call
60
+ @result = super
61
+ end
62
+ end
63
+
64
+ def instrument(return_result_of_measured_block = false, &blk)
65
+ blk = blk.dup.extend Registered
66
+ message = 'Completed in ' + Benchmark.measure { blk.call }.format('%10.6r').gsub(/[()]/,'').strip + 's'
67
+ return_result_of_measured_block ? [message, blk.result] : message
53
68
  end
54
69
  end
55
70
 
@@ -1,23 +1,22 @@
1
1
  require 'rubygems'
2
- require 'bundler'
3
- Bundler.setup
4
- require 'test/unit'
5
- require 'shoulda'
6
- require 'charisma'
7
- require 'active_support/version'
8
- %w{
9
- active_support/core_ext/hash/except
10
- }.each do |active_support_3_requirement|
11
- require active_support_3_requirement
12
- end if ActiveSupport::VERSION::MAJOR == 3
13
-
14
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
15
- $LOAD_PATH.unshift(File.dirname(__FILE__))
16
- require File.expand_path(File.join(File.dirname(__FILE__), '..', 'lib', 'leap'))
2
+ require 'bundler/setup'
17
3
 
18
- class Test::Unit::TestCase
4
+ if Bundler.definition.specs['debugger'].first
5
+ require 'debugger'
6
+ elsif Bundler.definition.specs['ruby-debug'].first
7
+ require 'ruby-debug'
19
8
  end
20
9
 
10
+ require 'minitest/unit'
11
+ require 'minitest/autorun'
12
+ require 'minitest/reporters'
13
+ MiniTest::Unit.runner = MiniTest::SuiteRunner.new
14
+ MiniTest::Unit.runner.reporters << MiniTest::Reporters::SpecReporter.new
15
+
16
+ require 'charisma'
17
+
18
+ require 'leap'
19
+
21
20
  class Person
22
21
  attr_reader :name
23
22
  attr_reader :age
@@ -121,7 +120,7 @@ class Seamus
121
120
  end
122
121
 
123
122
  class Idea < Struct.new(:gotchas, :caveats)
124
- def to_hash() Hash[members.zip(values)].reject {|_,v| v.nil?} end
123
+ def to_hash() Hash[members.map(&:to_sym).zip(values)].reject {|_,v| v.nil?} end
125
124
 
126
125
  include Leap
127
126
  decide :value, :with => :to_hash do
@@ -1,149 +1,161 @@
1
1
  require 'helper'
2
2
 
3
- class TestLeap < Test::Unit::TestCase
4
- context "A generic person" do
5
- setup do
3
+ describe Leap do
4
+ describe "A generic person" do
5
+ before do
6
6
  @person = Person.new
7
7
  end
8
8
 
9
- should 'still have a lucky number' do
9
+ it 'still has a lucky number' do
10
10
  assert_equal 0, @person.lucky_number
11
11
  end
12
12
 
13
- should 'naturally receive an International Psychics Association-compliant lucky number' do
13
+ it 'naturally receives an International Psychics Association-compliant lucky number' do
14
14
  assert_equal [:ipa], @person.deliberations[:lucky_number].compliance
15
15
  end
16
16
  end
17
17
 
18
- context "An aged person" do
19
- setup do
18
+ describe "An aged person" do
19
+ before do
20
20
  @person = Person.new :age => 5
21
21
  end
22
22
 
23
- should 'indeed have a lucky number' do
23
+ it 'indeed has a lucky number' do
24
24
  assert_equal 36, @person.lucky_number
25
25
  end
26
26
 
27
- should 'nevertheless remember how his lucky number was determined' do
28
- assert_equal(@person.deliberations[:lucky_number].characteristics, { :magic_integer => 6, :lucky_number => 36, :age => 5, :litmus => {}})
27
+ it 'nevertheless remembers how his lucky number was determined' do
28
+ assert_equal({:magic_integer => 6, :lucky_number => 36, :age => 5, :litmus => {}}, @person.deliberations[:lucky_number].characteristics)
29
29
  assert_equal 'ninja style', @person.deliberations[:lucky_number].reports.find{ |r| r.committee.name == :magic_integer }.quorum.name
30
30
  end
31
31
 
32
- should 'only give quorums what they ask for' do
32
+ it 'only gives quorums what they ask for' do
33
33
  assert_equal({}, @person.deliberations[:lucky_number].reports.find{ |r| r.committee.name == :litmus }.conclusion)
34
34
  end
35
35
 
36
- should 'not receive an International Psychics Association-compliant lucky number unless he asks for it' do
36
+ it "doesn't receive an International Psychics Association-compliant lucky number unless he asks for it" do
37
37
  assert_equal [], @person.deliberations[:lucky_number].compliance
38
38
  end
39
39
  end
40
40
 
41
- context "A clever aged person" do
42
- setup do
41
+ describe "A clever aged person" do
42
+ before do
43
43
  @person = Person.new :magic_integer => 42, :age => 5
44
44
  end
45
45
 
46
- should 'be able to use his own magic integer in determining his lucky number' do
46
+ it 'can use his own magic integer in determining his lucky number' do
47
47
  assert_equal 1764, @person.lucky_number
48
48
  end
49
49
  end
50
50
 
51
- context "A named person" do
52
- setup do
51
+ describe "A named person" do
52
+ before do
53
53
  @person = Person.new :name => 'Matz'
54
54
  end
55
55
 
56
- should 'have access to the super magic method' do
56
+ it 'has access to the super magic method' do
57
57
  assert_equal 1, @person.lucky_number
58
58
  end
59
59
 
60
- should 'be able to stay in compliance with International Psychics Association guidelines' do
60
+ it 'can stay in compliance with International Psychics Association guidelines' do
61
61
  assert_equal 0, @person.lucky_number(:comply => :ipa)
62
62
  end
63
63
  end
64
64
 
65
- context "A generic place" do
66
- setup do
65
+ describe "A generic place" do
66
+ before do
67
67
  @place = Place.new
68
68
  end
69
69
 
70
- should 'have decent weather' do
70
+ it 'has decent weather' do
71
71
  assert_equal :decent, @place.weather
72
72
  end
73
73
  end
74
74
 
75
- context "Vermont" do
76
- setup do
75
+ describe "Vermont" do
76
+ before do
77
77
  @place = Place.new :name => 'Vermont', :seasonality => { :summer => :warm, :winter => :cold }
78
78
  end
79
79
 
80
- should 'be warm in the summer' do
80
+ it 'is warm in the summer' do
81
81
  assert_equal :warm, @place.weather(:summer)
82
82
  end
83
83
  end
84
84
 
85
- context "A lazy subject" do
86
- setup do
85
+ describe "A lazy subject" do
86
+ before do
87
87
  @thing = Thing.new
88
88
  @thing.anything rescue nil
89
89
  end
90
90
 
91
- should 'have proper implicit characteristics' do
91
+ it 'has proper implicit characteristics' do
92
92
  assert_equal Hash.new, @thing.deliberations[:anything].characteristics
93
93
  end
94
94
  end
95
95
 
96
- context "An impossible decision" do
97
- setup do
96
+ describe "An impossible decision" do
97
+ before do
98
98
  @thing = Thing.new
99
99
  end
100
100
 
101
- should 'be impossible to make' do
102
- exception = assert_raise ::Leap::NoSolutionError do
101
+ it 'is impossible to make' do
102
+ assert_raises(::Leap::NoSolutionError, /No solution was found for "anything"/) do
103
103
  @thing.anything
104
104
  end
105
-
106
- assert_match(/No solution was found for "anything"/, exception.message)
107
105
  end
108
106
  end
109
107
 
110
- context "A difficult decision" do
111
- setup do
108
+ describe "A difficult decision" do
109
+ before do
112
110
  @person = Person.new :name => 'Bozo'
113
111
  end
114
112
 
115
- should 'provide details about its apparent impossibility' do
116
- exception = assert_raise ::Leap::NoSolutionError do
113
+ it 'provides details about its apparent impossibility' do
114
+ assert_raises(::Leap::NoSolutionError, /No solution was found for "lucky_number".*magic_float: ancient recipe, name: provided as input/) do
117
115
  @person.lucky_number :comply => :zeus
118
116
  end
119
-
120
- assert_match(/No solution was found for "lucky_number"/, exception.message)
121
- assert_match(/magic_float: ancient recipe, name: provided as input/, exception.message)
117
+ end
118
+ end
119
+
120
+ describe "Instrumentation" do
121
+ before do
122
+ @old_stdout = $stdout
123
+ $stdout = StringIO.new
124
+ Leap.instrument!
125
+ end
126
+ after do
127
+ $stdout = @old_stdout
128
+ Leap.send :remove_class_variable, :@@logger
129
+ Leap.send :remove_class_variable, :@@whip
130
+ end
131
+ it "doesn't interfere with computation" do
132
+ @person = Person.new :age => 5
133
+ assert_equal 36, @person.lucky_number.to_i
122
134
  end
123
135
  end
124
136
 
125
- context 'Seamus deciding about whether he can commit to a date' do
126
- setup do
137
+ describe 'Seamus deciding about whether he can commit to a date' do
138
+ before do
127
139
  @seamus = Seamus.new
128
140
  end
129
141
 
130
- should 'work for most people' do
142
+ it 'works for most people' do
131
143
  assert_equal :maybe, @seamus.can_i_commit_to_that_date
132
144
  end
133
145
 
134
- should 'work for BenT, who is easygoing' do
146
+ it 'works for BenT, who is easygoing' do
135
147
  assert_equal :maybe, @seamus.can_i_commit_to_that_date(:comply => :bent)
136
148
  end
137
149
 
138
- should 'never work for andy' do
139
- assert_raise ::Leap::NoSolutionError do
150
+ it 'never works for andy' do
151
+ assert_raises ::Leap::NoSolutionError do
140
152
  @seamus.can_i_commit_to_that_date(:comply => :andy)
141
153
  end
142
154
  end
143
155
  end
144
156
 
145
- context 'A committee' do
146
- setup do
157
+ describe 'A committee' do
158
+ before do
147
159
  class Owl
148
160
  include Leap
149
161
  decide :eye_size do
@@ -153,27 +165,27 @@ class TestLeap < Test::Unit::TestCase
153
165
  end
154
166
  end
155
167
 
156
- should 'remember options that it was given when it was created' do
168
+ it 'remembers options that it was given when it was created' do
157
169
  assert_equal :length, Owl.decisions[:eye_size].committees.first.options[:measures]
158
170
  end
159
171
  end
160
172
 
161
- context 'A decision without a master committee' do
162
- setup do
173
+ describe 'A decision without a master committee' do
174
+ before do
163
175
  @idea = Idea.new
164
176
  @bad_idea = Idea.new(100, 10) # gotchas, caveats
165
177
  end
166
178
 
167
- should 'still compute' do
179
+ it 'still computes' do
168
180
  @idea.value
169
181
  assert_equal({:cost => 0, :benefit => 9, :caveats => 1, :hangups => 0}, @idea.deliberations[:value].characteristics)
170
182
  end
171
183
 
172
- should 'provide easy access to committee reports' do
184
+ it 'provides easy access to committee reports' do
173
185
  assert_equal 0, @idea.value[:cost]
174
186
  end
175
187
 
176
- should 'provide compliance specific to a certain conclusion' do
188
+ it 'provides compliance specific to a certain conclusion' do
177
189
  # If hangups does not comply with common sense, neither should cost
178
190
  assert_equal [], @idea.deliberations[:value].compliance(:hangups)
179
191
  assert_equal [], @idea.deliberations[:value].compliance(:benefit)
@@ -187,7 +199,7 @@ class TestLeap < Test::Unit::TestCase
187
199
  assert_equal [:wisdom], @bad_idea.deliberations[:value].compliance(:benefit)
188
200
  end
189
201
 
190
- should 'only return compliant values when compliance is requested and endpoint is unknown' do
202
+ it 'only returns compliant values when compliance is requested and endpoint is unknown' do
191
203
  # Nothing complies
192
204
  assert_equal({}, @idea.value(:comply => :common_sense).characteristics)
193
205
 
@@ -195,16 +207,18 @@ class TestLeap < Test::Unit::TestCase
195
207
  assert_equal({:gotchas => 100, :caveats => 10, :hangups => 100, :cost => 100}, @bad_idea.value(:comply => :common_sense).characteristics)
196
208
  end
197
209
 
198
- should 'return an error message when known endpoint cannot be achieved' do
199
- exception = assert_raise ::Leap::NoSolutionError do
210
+ it 'returns an error message when known endpoint cannot be achieved' do
211
+ assert_raises(::Leap::NoSolutionError, /No solution was found for "benefit"/) do
200
212
  @idea.value(:comply => { :common_sense => :benefit })
201
213
  end
202
- assert_match(/No solution was found for "benefit"/, exception.message)
203
214
 
204
- exception = assert_raise ::Leap::NoSolutionError do
215
+ assert_raises(::Leap::NoSolutionError, /No solution was found for "benefit"/) do
205
216
  @bad_idea.value(:comply => { :common_sense => :benefit })
206
217
  end
207
- assert_match(/No solution was found for "benefit"/, exception.message)
218
+ end
219
+
220
+ it 'returns compliant values when compliance is requested for specific committees' do
221
+ assert_equal 100, @bad_idea.value(:comply => { :common_sense => :cost })[:cost]
208
222
  end
209
223
  end
210
224
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leap
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.7
4
+ version: 0.5.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,22 +11,27 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2011-12-15 00:00:00.000000000 Z
14
+ date: 2012-09-13 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: charisma
18
- requirement: &6662508 !ruby/object:Gem::Requirement
18
+ requirement: !ruby/object:Gem::Requirement
19
19
  none: false
20
20
  requirements:
21
- - - ~>
21
+ - - ! '>='
22
22
  - !ruby/object:Gem::Version
23
- version: 0.2.0
23
+ version: '0'
24
24
  type: :development
25
25
  prerelease: false
26
- version_requirements: *6662508
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ none: false
28
+ requirements:
29
+ - - ! '>='
30
+ - !ruby/object:Gem::Version
31
+ version: '0'
27
32
  - !ruby/object:Gem::Dependency
28
- name: shoulda
29
- requirement: &6662088 !ruby/object:Gem::Requirement
33
+ name: minitest
34
+ requirement: !ruby/object:Gem::Requirement
30
35
  none: false
31
36
  requirements:
32
37
  - - ! '>='
@@ -34,10 +39,31 @@ dependencies:
34
39
  version: '0'
35
40
  type: :development
36
41
  prerelease: false
37
- version_requirements: *6662088
42
+ version_requirements: !ruby/object:Gem::Requirement
43
+ none: false
44
+ requirements:
45
+ - - ! '>='
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ - !ruby/object:Gem::Dependency
49
+ name: minitest-reporters
50
+ requirement: !ruby/object:Gem::Requirement
51
+ none: false
52
+ requirements:
53
+ - - ! '>='
54
+ - !ruby/object:Gem::Version
55
+ version: '0'
56
+ type: :development
57
+ prerelease: false
58
+ version_requirements: !ruby/object:Gem::Requirement
59
+ none: false
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
38
64
  - !ruby/object:Gem::Dependency
39
65
  name: bueller
40
- requirement: &6661620 !ruby/object:Gem::Requirement
66
+ requirement: !ruby/object:Gem::Requirement
41
67
  none: false
42
68
  requirements:
43
69
  - - ! '>='
@@ -45,21 +71,31 @@ dependencies:
45
71
  version: '0'
46
72
  type: :development
47
73
  prerelease: false
48
- version_requirements: *6661620
74
+ version_requirements: !ruby/object:Gem::Requirement
75
+ none: false
76
+ requirements:
77
+ - - ! '>='
78
+ - !ruby/object:Gem::Version
79
+ version: '0'
49
80
  - !ruby/object:Gem::Dependency
50
- name: blockenspiel
51
- requirement: &6661068 !ruby/object:Gem::Requirement
81
+ name: yard
82
+ requirement: !ruby/object:Gem::Requirement
52
83
  none: false
53
84
  requirements:
54
85
  - - ! '>='
55
86
  - !ruby/object:Gem::Version
56
- version: 0.3.2
87
+ version: '0'
57
88
  type: :runtime
58
89
  prerelease: false
59
- version_requirements: *6661068
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ none: false
92
+ requirements:
93
+ - - ! '>='
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
60
96
  - !ruby/object:Gem::Dependency
61
97
  name: activesupport
62
- requirement: &6660456 !ruby/object:Gem::Requirement
98
+ requirement: !ruby/object:Gem::Requirement
63
99
  none: false
64
100
  requirements:
65
101
  - - ! '>='
@@ -67,10 +103,15 @@ dependencies:
67
103
  version: 2.3.4
68
104
  type: :runtime
69
105
  prerelease: false
70
- version_requirements: *6660456
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ none: false
108
+ requirements:
109
+ - - ! '>='
110
+ - !ruby/object:Gem::Version
111
+ version: 2.3.4
71
112
  - !ruby/object:Gem::Dependency
72
113
  name: i18n
73
- requirement: &6660096 !ruby/object:Gem::Requirement
114
+ requirement: !ruby/object:Gem::Requirement
74
115
  none: false
75
116
  requirements:
76
117
  - - ! '>='
@@ -78,18 +119,12 @@ dependencies:
78
119
  version: '0'
79
120
  type: :runtime
80
121
  prerelease: false
81
- version_requirements: *6660096
82
- - !ruby/object:Gem::Dependency
83
- name: builder
84
- requirement: &6659700 !ruby/object:Gem::Requirement
122
+ version_requirements: !ruby/object:Gem::Requirement
85
123
  none: false
86
124
  requirements:
87
125
  - - ! '>='
88
126
  - !ruby/object:Gem::Version
89
127
  version: '0'
90
- type: :runtime
91
- prerelease: false
92
- version_requirements: *6659700
93
128
  description: Leap to conclusions
94
129
  email: andy@rossmeissl.net
95
130
  executables: []
@@ -98,6 +133,7 @@ extra_rdoc_files: []
98
133
  files:
99
134
  - .document
100
135
  - .gitignore
136
+ - CHANGELOG
101
137
  - Gemfile
102
138
  - README.markdown
103
139
  - Rakefile
@@ -118,7 +154,7 @@ files:
118
154
  - lib/leap/whip.rb
119
155
  - test/helper.rb
120
156
  - test/test_leap.rb
121
- homepage: http://github.com/rossmeissl/leap
157
+ homepage: https://github.com/rossmeissl/leap
122
158
  licenses: []
123
159
  post_install_message:
124
160
  rdoc_options: []
@@ -132,7 +168,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
132
168
  version: '0'
133
169
  segments:
134
170
  - 0
135
- hash: 545920577
171
+ hash: 75148912892819623
136
172
  required_rubygems_version: !ruby/object:Gem::Requirement
137
173
  none: false
138
174
  requirements:
@@ -141,11 +177,14 @@ required_rubygems_version: !ruby/object:Gem::Requirement
141
177
  version: '0'
142
178
  segments:
143
179
  - 0
144
- hash: 545920577
180
+ hash: 75148912892819623
145
181
  requirements: []
146
182
  rubyforge_project:
147
- rubygems_version: 1.8.11
183
+ rubygems_version: 1.8.24
148
184
  signing_key:
149
185
  specification_version: 3
150
186
  summary: A heuristics engine for your Ruby objects
151
- test_files: []
187
+ test_files:
188
+ - test/helper.rb
189
+ - test/test_leap.rb
190
+ has_rdoc: