subtle 0.3.8 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.rvmrc CHANGED
@@ -4,7 +4,7 @@
4
4
  # development environment upon cd'ing into the directory
5
5
 
6
6
  # First we specify our desired <ruby>[@<gemset>], the @gemset name is optional.
7
- environment_id="ruby-1.9.3-p0@subtle"
7
+ environment_id="ruby-1.8.7-p370@subtle"
8
8
 
9
9
  #
10
10
  # Uncomment following line if you want options to be set only for given project.
data/.travis.yml CHANGED
@@ -7,6 +7,5 @@ rvm:
7
7
  - jruby-19mode
8
8
  - rbx-18mode
9
9
  - rbx-19mode
10
- - ruby-head
11
10
  - jruby-head
12
11
  - ree
data/Gemfile CHANGED
@@ -5,7 +5,6 @@ gemspec
5
5
  gem 'blankslate'
6
6
  gem 'mocha'
7
7
 
8
-
9
8
  gem 'minitest'
10
9
  group :development do
11
10
  gem 'guard'
data/README.md CHANGED
@@ -1,21 +1,6 @@
1
- # Subtle
1
+ # Subtle [![Build Status](https://secure.travis-ci.org/darrencauthon/subtle.png?branch=master)](http://travis-ci.org/darrencauthon/subtle)
2
2
 
3
-
4
-
5
- I don't like "grab-bag" method libraries any more than anybody, but also like everybody: I'll make an exception for **MINE**. :)
6
-
7
- ## Installation
8
- Add this line to your application's Gemfile:
9
-
10
- gem 'subtle'
11
-
12
- And then execute:
13
-
14
- $ bundle
15
-
16
- Or install it yourself as:
17
-
18
- gem install subtle
3
+ This library contains methods that seem to cut down a litle bit of the code that I write daily.
19
4
 
20
5
  ## Usage
21
6
 
@@ -67,8 +52,6 @@ person = [:name].to_object subject
67
52
  person.name = "John Galt"
68
53
  person.name # Will be John Galt
69
54
  ````
70
-
71
-
72
55
  ### Safety Proc
73
56
 
74
57
  This feature was written because I hate wrapping code in begin/rescue/end blocks. If I have a line of code and I don't particularly care if it fails, I have to wrap it in three more lines of care to stop exceptions.
@@ -109,7 +92,7 @@ You can also pass a block to the constructor when it is instantiated, like this:
109
92
  ````ruby
110
93
  class Person
111
94
  params_constructor do
112
- self.first_name = 'Howard'
95
+ @first_name = 'Howard'
113
96
  end
114
97
  attr_accessor :first_name, :last_name
115
98
  end
@@ -136,7 +119,7 @@ person.first_name #= Howard
136
119
 
137
120
  ````
138
121
 
139
- ### Proc to Object
122
+ ### Lambda to Object
140
123
 
141
124
  I was inspired to write this feature while dealing with some bad Rails code. A programmer wrote a before_filter on ApplicationController that made a big, expensive web service call to pass the users current weather information to the view. This weather information was shown in various places on the site, but there were many pages on the site where the data was not being used at all.
142
125
 
data/lib/subtle.rb CHANGED
@@ -2,5 +2,4 @@ require File.dirname(__FILE__) + '/subtle/cover.rb'
2
2
  Dir[File.dirname(__FILE__) + '/subtle/*.rb'].each {|file| require file }
3
3
 
4
4
  module Subtle
5
- # Your code goes here...
6
5
  end
@@ -1,24 +1,36 @@
1
1
  class Array
2
2
 
3
- def to_object(subject = nil)
4
- subject = Object.new if subject.nil?
5
- self.each { |item| add_reader_for(subject, item, nil) }
3
+ def to_object(subject = Object.new)
4
+ self.each { |field| add_attr_accessor_for(subject, field) }
6
5
  subject
7
6
  end
8
7
 
9
- def to_objects(&blk)
10
- records = blk.call
8
+ def to_objects(type = Object, &block_that_returns_the_records)
9
+ records = block_that_returns_the_records.call
11
10
  return [] if records.empty?
12
- records.map { |record| create_object_for_this_record(record) }
11
+ records.map { |record| turn_this_data_into_a_filled_object(type, record) }
13
12
  end
14
13
 
15
14
  private
16
15
 
17
- def create_object_for_this_record(record)
18
- result = Object.new
19
- self.each_with_index do |property_name, index|
16
+ def turn_this_data_into_a_filled_object(type, record)
17
+ result = create_the_object(type)
18
+ fill_the_object_with_the_values(result, record)
19
+ result
20
+ end
21
+
22
+ def fill_the_object_with_the_values(result, record)
23
+ self.each_with_index do |field, index|
20
24
  value = get_the_value(record, index)
21
- add_reader_for(result, property_name, value)
25
+ result.send("#{field}=".to_sym, value)
26
+ end
27
+ end
28
+
29
+ def create_the_object(type)
30
+ result = type.new
31
+ return result if type != Object
32
+ self.each_with_index do |field, index|
33
+ add_attr_accessor_for(result, field)
22
34
  end
23
35
  result
24
36
  end
@@ -28,11 +40,10 @@ class Array
28
40
  value[index]
29
41
  end
30
42
 
31
- def add_reader_for(result, property_name, this_value)
32
- result.instance_variable_set("@#{property_name}", this_value)
43
+ def add_attr_accessor_for(result, property_name)
33
44
  result.instance_eval("
34
- class << self
35
- attr_accessor :#{property_name}
36
- end")
45
+ class << self
46
+ attr_accessor :#{property_name}
47
+ end")
37
48
  end
38
49
  end
@@ -2,8 +2,8 @@ module Subtle
2
2
  class LazyCover < Cover
3
3
  include Subtle::StrictCoverMethods
4
4
 
5
- def initialize(block)
6
- @block = block
5
+ def initialize(block_that_creates_the_object)
6
+ @block = block_that_creates_the_object
7
7
  end
8
8
 
9
9
  alias :the_original_subject_from_the_base_class :the_original_subject
@@ -3,7 +3,7 @@ class Object
3
3
  self.class_eval('
4
4
  def initialize(params={}, &block)
5
5
  params.each do |attr, value|
6
- self.public_send("#{attr}=", value)
6
+ self.send("#{attr}=", value)
7
7
  end if params
8
8
  unless block.nil?
9
9
  block.call(self)
@@ -1,3 +1,3 @@
1
1
  module Subtle
2
- VERSION = "0.3.8"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -2,98 +2,140 @@ require File.expand_path(File.dirname(__FILE__) + '/../spec_helper')
2
2
 
3
3
  describe "arrays to objects" do
4
4
 
5
- [:name, :street].each do |property|
6
- describe "with an array with one symbol named #{property.to_s}" do
7
- describe "and no data" do
8
- before do
9
- @values = [property].to_objects { [] }
5
+ describe "creating objects with matching attr_accessors and values" do
6
+ [:name, :street].each do |property|
7
+ describe "with an array with one symbol named #{property.to_s}" do
8
+ describe "and no data" do
9
+ before do
10
+ @values = [property].to_objects { [] }
11
+ end
12
+
13
+ it "should return an empty array" do
14
+ @values.must_be_empty
15
+ end
10
16
  end
11
17
 
12
- it "should return an empty array" do
13
- @values.must_be_empty
18
+ ["Dangy", "Taggart"].each do |name|
19
+ describe "and one record with #{name}" do
20
+ before do
21
+ @values = [property].to_objects { [name] }
22
+ end
23
+
24
+ it "should return one record" do
25
+ @values.count.must_equal 1
26
+ end
27
+
28
+ it "should have a property with the name of Dangy" do
29
+ @values[0].send(property).must_equal name
30
+ end
31
+ end
14
32
  end
15
- end
16
33
 
17
- ["Dangy", "Taggart"].each do |name|
18
- describe "and one record with #{name}" do
34
+ describe "and two records with John and Howard" do
19
35
  before do
20
- @values = [property].to_objects { [name] }
36
+ @values = [property].to_objects {["John", "Howard"]}
21
37
  end
22
38
 
23
- it "should return one record" do
24
- @values.count.must_equal 1
39
+ it "should return two records" do
40
+ @values.count.must_equal 2
25
41
  end
26
42
 
27
- it "should have a property with the name of Dangy" do
28
- @values[0].send(property).must_equal name
43
+ it "should set the first to John" do
44
+ @values[0].send(property).must_equal "John"
45
+ end
46
+
47
+ it "should set the second to Howard" do
48
+ @values[1].send(property).must_equal "Howard"
29
49
  end
30
50
  end
31
51
  end
32
52
 
33
- describe "and two records with John and Howard" do
34
- before do
35
- @values = [property].to_objects {["John", "Howard"]}
36
- end
53
+ describe "with an array with two symbols named first_name and last_name" do
54
+ describe "with 'Ellis' and 'Wyatt'" do
55
+ before do
56
+ @values = [:first_name, :last_name].to_objects { [['Ellis', 'Wyatt']] }
57
+ end
37
58
 
38
- it "should return two records" do
39
- @values.count.must_equal 2
40
- end
59
+ it "should return one record" do
60
+ @values.count.must_equal 1
61
+ end
41
62
 
42
- it "should set the first to John" do
43
- @values[0].send(property).must_equal "John"
44
- end
63
+ it "should set the first name to Ellis" do
64
+ @values[0].first_name.must_equal 'Ellis'
65
+ end
45
66
 
46
- it "should set the second to Howard" do
47
- @values[1].send(property).must_equal "Howard"
67
+ it "should set the last name to Wyatt" do
68
+ @values[0].last_name.must_equal 'Wyatt'
69
+ end
48
70
  end
49
- end
50
- end
51
71
 
52
- describe "with an array with two symbols named first_name and last_name" do
53
- describe "with 'Ellis' and 'Wyatt'" do
54
- before do
55
- @values = [:first_name, :last_name].to_objects { [['Ellis', 'Wyatt']] }
56
- end
72
+ describe "with 'Ellis' and 'Wyatt', then 'Dagny' and 'Taggart'" do
73
+ before do
74
+ @values = [:first_name, :last_name].to_objects { [['Ellis', 'Wyatt'], ['Dagny', 'Taggart']] }
75
+ end
57
76
 
58
- it "should return one record" do
59
- @values.count.must_equal 1
60
- end
77
+ it "should return one record" do
78
+ @values.count.must_equal 2
79
+ end
61
80
 
62
- it "should set the first name to Ellis" do
63
- @values[0].first_name.must_equal 'Ellis'
64
- end
81
+ it "should set the first name to Ellis on the first record" do
82
+ @values[0].first_name.must_equal 'Ellis'
83
+ end
65
84
 
66
- it "should set the last name to Wyatt" do
67
- @values[0].last_name.must_equal 'Wyatt'
68
- end
69
- end
85
+ it "should set the last name to Wyatt on the first record" do
86
+ @values[0].last_name.must_equal 'Wyatt'
87
+ end
70
88
 
71
- describe "with 'Ellis' and 'Wyatt', then 'Dagny' and 'Taggart'" do
72
- before do
73
- @values = [:first_name, :last_name].to_objects { [['Ellis', 'Wyatt'], ['Dagny', 'Taggart']] }
74
- end
89
+ it "should set the first name to Dagny on the second record" do
90
+ @values[1].first_name.must_equal 'Dagny'
91
+ end
75
92
 
76
- it "should return one record" do
77
- @values.count.must_equal 2
93
+ it "should set the last name to Wyatt on the second record" do
94
+ @values[1].last_name.must_equal 'Taggart'
95
+ end
78
96
  end
97
+ end
98
+ end
99
+ end
79
100
 
80
- it "should set the first name to Ellis on the first record" do
81
- @values[0].first_name.must_equal 'Ellis'
82
- end
101
+ class TestObject
102
+ attr_accessor :city, :state, :zip
103
+ end
83
104
 
84
- it "should set the last name to Wyatt on the first record" do
85
- @values[0].last_name.must_equal 'Wyatt'
86
- end
105
+ describe 'creating objects of a certain type' do
106
+ describe 'when attr_accessor exists for each property' do
107
+ before do
108
+ @results = [:city, :state, :zip].to_objects(TestObject) {[
109
+ ['Olathe', 'KS', '66061'], ['Kansas City', 'MO', '64125']
110
+ ]}
111
+ end
87
112
 
88
- it "should set the first name to Dagny on the second record" do
89
- @values[1].first_name.must_equal 'Dagny'
90
- end
113
+ it "should return objects of the type provided" do
114
+ @results[0].class.must_equal TestObject
115
+ end
91
116
 
92
- it "should set the last name to Wyatt on the second record" do
93
- @values[1].last_name.must_equal 'Taggart'
94
- end
117
+ it "should set the properties as expected" do
118
+ @results[0].city.must_equal 'Olathe'
119
+ @results[0].state.must_equal 'KS'
120
+ @results[0].zip.must_equal '66061'
121
+ @results[1].city.must_equal 'Kansas City'
122
+ @results[1].state.must_equal 'MO'
123
+ @results[1].zip.must_equal '64125'
124
+ end
125
+ end
126
+ end
127
+
128
+ describe 'when attr_accessor does not exist for each property' do
129
+ it "should throw an exception" do
130
+ error_thrown = false
131
+ begin
132
+ [:something_that_does_not_exist].to_objects(TestObject) {[
133
+ ['value']
134
+ ]}
135
+ rescue
136
+ error_thrown = true
95
137
  end
138
+ error_thrown.must_equal true
96
139
  end
97
140
  end
98
-
99
141
  end
@@ -4,7 +4,7 @@ describe "lambda to object" do
4
4
 
5
5
  describe "to_object on a lambda that returns nil" do
6
6
  before do
7
- @value = -> { nil }.to_object
7
+ @value = lambda { nil }.to_object
8
8
  end
9
9
 
10
10
  it "should remember the original value is nil" do
@@ -14,7 +14,7 @@ describe "lambda to object" do
14
14
 
15
15
  describe "to_object on a lambda that returns an integer" do
16
16
  before do
17
- @value = -> { 1 }.to_object
17
+ @value = lambda { 1 }.to_object
18
18
  end
19
19
 
20
20
  it "should remember the original value is 1" do
@@ -29,7 +29,7 @@ describe "lambda to object" do
29
29
  describe "to_object on a lambda, but never accessing the variable" do
30
30
  before do
31
31
  @was_called = false
32
- @value = -> { raise 'it was called' }.to_object
32
+ @value = lambda { raise 'it was called' }.to_object
33
33
  end
34
34
 
35
35
  it "should not be called" do
@@ -10,12 +10,12 @@ end
10
10
  describe Subtle::LazyCover do
11
11
 
12
12
  it "should not call the block passed to it" do
13
- lazy = Subtle::LazyCover.new(-> { raise 'was called' })
13
+ lazy = Subtle::LazyCover.new(lambda { raise 'was called' })
14
14
  end
15
15
 
16
16
  it "should call the block passed to it when things are references" do
17
17
  LazyCoverTest.was_called = false
18
- lazy = Subtle::LazyCover.new(-> { LazyCoverTest.was_called = true })
18
+ lazy = Subtle::LazyCover.new(lambda { LazyCoverTest.was_called = true })
19
19
  LazyCoverTest.was_called.must_equal false
20
20
  lazy.to_s
21
21
  LazyCoverTest.was_called.must_equal true
@@ -23,7 +23,7 @@ describe Subtle::LazyCover do
23
23
 
24
24
  it "should call the block passed to it only once" do
25
25
  LazyCoverTest.was_called = 0
26
- lazy = Subtle::LazyCover.new(-> { LazyCoverTest.was_called = LazyCoverTest.was_called + 1 })
26
+ lazy = Subtle::LazyCover.new(lambda { LazyCoverTest.was_called = LazyCoverTest.was_called + 1 })
27
27
  LazyCoverTest.was_called.must_equal 0
28
28
  lazy.to_s
29
29
  LazyCoverTest.was_called.must_equal 1
@@ -36,7 +36,7 @@ describe Subtle::LazyCover do
36
36
  object = Object.new
37
37
  object.stubs(:defined_method).returns("yes")
38
38
 
39
- lazy = Subtle::LazyCover.new(-> { object })
39
+ lazy = Subtle::LazyCover.new(lambda { object })
40
40
  lazy.defined_method.must_equal "yes"
41
41
  was_called = false
42
42
  begin
@@ -49,13 +49,13 @@ describe Subtle::LazyCover do
49
49
 
50
50
  describe "the original subject" do
51
51
  it "should call the block passed to it" do
52
- Subtle::LazyCover.new(-> { 0 }).the_original_subject.must_equal 0
53
- Subtle::LazyCover.new(-> { "x" }).the_original_subject.must_equal "x"
52
+ Subtle::LazyCover.new(lambda { 0 }).the_original_subject.must_equal 0
53
+ Subtle::LazyCover.new(lambda { "x" }).the_original_subject.must_equal "x"
54
54
  end
55
55
 
56
56
  it "should only call the block passed to it once" do
57
57
  LazyCoverTest.was_called = 0
58
- lazy = Subtle::LazyCover.new(-> { LazyCoverTest.was_called += 1 })
58
+ lazy = Subtle::LazyCover.new(lambda { LazyCoverTest.was_called += 1 })
59
59
  lazy.the_original_subject
60
60
  LazyCoverTest.was_called.must_equal 1
61
61
  lazy.the_original_subject
@@ -27,7 +27,7 @@ end
27
27
  describe "param_constructor" do
28
28
  describe 'just the constructor itself' do
29
29
  it "should let the object be instantiated with a hash" do
30
- test = ParamConstructorTest.new(first_name: "John", last_name: "Galt")
30
+ test = ParamConstructorTest.new(:first_name => "John", :last_name => "Galt")
31
31
  test.first_name.must_equal "John"
32
32
  test.last_name.must_equal "Galt"
33
33
  end
@@ -40,7 +40,7 @@ describe "param_constructor" do
40
40
 
41
41
  describe 'pass a block to the constructor' do
42
42
  it "should let the object be instantiated with a hash" do
43
- test = SecondParamConstructorTest.new(first_name: "Dagny", last_name: "Roark") do |o|
43
+ test = SecondParamConstructorTest.new(:first_name => "Dagny", :last_name => "Roark") do |o|
44
44
  o.first_name = 'Howard'
45
45
  end
46
46
  test.first_name.must_equal 'Howard'
@@ -50,14 +50,14 @@ describe "param_constructor" do
50
50
 
51
51
  describe 'pass a block with the constructor' do
52
52
  it "should let the object be instantiated with a hash" do
53
- test = ThirdParamConstructorTest.new(first_name: "Dagny", last_name: "Roark")
53
+ test = ThirdParamConstructorTest.new(:first_name => "Dagny", :last_name => "Roark")
54
54
  test.first_name.must_equal 'expected value'
55
55
  end
56
56
  end
57
57
 
58
58
  describe 'pass a block with the constructor AND to the constructor' do
59
59
  it "should run both and let the last one win" do
60
- test = FourthParamConstructorTest.new(first_name: "", last_name: "") do |o|
60
+ test = FourthParamConstructorTest.new(:first_name => "", :last_name => "") do |o|
61
61
  o.last_name = "second"
62
62
  o.first_name = "first"
63
63
  end
@@ -10,7 +10,7 @@ describe "Safety Proc" do
10
10
  describe "a proc that will throw an exception" do
11
11
  before do
12
12
  SafetyProc.called = false
13
- @proc = -> do
13
+ @proc = lambda do
14
14
  SafetyProc.called = true
15
15
  raise 'k'
16
16
  end
@@ -28,7 +28,7 @@ describe "Safety Proc" do
28
28
  end
29
29
 
30
30
  it "call the block" do
31
- @proc = -> { raise 'k' }.call_safely { SafetyProc.called = true }
31
+ @proc = lambda { raise 'k' }.call_safely { SafetyProc.called = true }
32
32
  SafetyProc.called.must_equal true
33
33
  end
34
34
  end
metadata CHANGED
@@ -1,71 +1,74 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: subtle
3
- version: !ruby/object:Gem::Version
4
- version: 0.3.8
3
+ version: !ruby/object:Gem::Version
4
+ hash: 23
5
5
  prerelease:
6
+ segments:
7
+ - 1
8
+ - 0
9
+ - 0
10
+ version: 1.0.0
6
11
  platform: ruby
7
- authors:
12
+ authors:
8
13
  - Darren Cauthon
9
14
  autorequire:
10
15
  bindir: bin
11
16
  cert_chain: []
12
- date: 2012-08-07 00:00:00.000000000 Z
13
- dependencies:
14
- - !ruby/object:Gem::Dependency
15
- name: blankslate
16
- requirement: !ruby/object:Gem::Requirement
17
+
18
+ date: 2012-08-17 00:00:00 Z
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ version_requirements: &id001 !ruby/object:Gem::Requirement
17
22
  none: false
18
- requirements:
19
- - - ! '>='
20
- - !ruby/object:Gem::Version
21
- version: '0'
22
- type: :runtime
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ hash: 3
27
+ segments:
28
+ - 0
29
+ version: "0"
23
30
  prerelease: false
24
- version_requirements: !ruby/object:Gem::Requirement
31
+ type: :runtime
32
+ name: blankslate
33
+ requirement: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ version_requirements: &id002 !ruby/object:Gem::Requirement
25
36
  none: false
26
- requirements:
27
- - - ! '>='
28
- - !ruby/object:Gem::Version
29
- version: '0'
30
- - !ruby/object:Gem::Dependency
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ hash: 3
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ prerelease: false
45
+ type: :development
31
46
  name: mocha
32
- requirement: !ruby/object:Gem::Requirement
47
+ requirement: *id002
48
+ - !ruby/object:Gem::Dependency
49
+ version_requirements: &id003 !ruby/object:Gem::Requirement
33
50
  none: false
34
- requirements:
35
- - - ! '>='
36
- - !ruby/object:Gem::Version
37
- version: '0'
38
- type: :development
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ hash: 3
55
+ segments:
56
+ - 0
57
+ version: "0"
39
58
  prerelease: false
40
- version_requirements: !ruby/object:Gem::Requirement
41
- none: false
42
- requirements:
43
- - - ! '>='
44
- - !ruby/object:Gem::Version
45
- version: '0'
46
- - !ruby/object:Gem::Dependency
47
- name: rake
48
- requirement: !ruby/object:Gem::Requirement
49
- none: false
50
- requirements:
51
- - - ! '>='
52
- - !ruby/object:Gem::Version
53
- version: '0'
54
59
  type: :development
55
- prerelease: false
56
- version_requirements: !ruby/object:Gem::Requirement
57
- none: false
58
- requirements:
59
- - - ! '>='
60
- - !ruby/object:Gem::Version
61
- version: '0'
60
+ name: rake
61
+ requirement: *id003
62
62
  description: A few small updates to make even more concise Ruby.
63
- email:
63
+ email:
64
64
  - darren@cauthon.com
65
65
  executables: []
66
+
66
67
  extensions: []
68
+
67
69
  extra_rdoc_files: []
68
- files:
70
+
71
+ files:
69
72
  - .gitignore
70
73
  - .rvmrc
71
74
  - .travis.yml
@@ -93,35 +96,38 @@ files:
93
96
  - subtle.gemspec
94
97
  homepage: http://www.github.com/darrencauthon/subtle
95
98
  licenses: []
99
+
96
100
  post_install_message:
97
101
  rdoc_options: []
98
- require_paths:
102
+
103
+ require_paths:
99
104
  - lib
100
- required_ruby_version: !ruby/object:Gem::Requirement
105
+ required_ruby_version: !ruby/object:Gem::Requirement
101
106
  none: false
102
- requirements:
103
- - - ! '>='
104
- - !ruby/object:Gem::Version
105
- version: '0'
106
- segments:
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ hash: 3
111
+ segments:
107
112
  - 0
108
- hash: 2130171851607825490
109
- required_rubygems_version: !ruby/object:Gem::Requirement
113
+ version: "0"
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
115
  none: false
111
- requirements:
112
- - - ! '>='
113
- - !ruby/object:Gem::Version
114
- version: '0'
115
- segments:
116
+ requirements:
117
+ - - ">="
118
+ - !ruby/object:Gem::Version
119
+ hash: 3
120
+ segments:
116
121
  - 0
117
- hash: 2130171851607825490
122
+ version: "0"
118
123
  requirements: []
124
+
119
125
  rubyforge_project:
120
126
  rubygems_version: 1.8.24
121
127
  signing_key:
122
128
  specification_version: 3
123
129
  summary: A few small updates to make even more concise Ruby.
124
- test_files:
130
+ test_files:
125
131
  - spec/spec_helper.rb
126
132
  - spec/subtle/array_to_object_spec.rb
127
133
  - spec/subtle/array_to_objects_spec.rb