minimapper 0.2.0 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -1,4 +1,5 @@
1
1
  [![Build Status](https://secure.travis-ci.org/joakimk/minimapper.png)](http://travis-ci.org/joakimk/minimapper)
2
+ [![Code Climate](https://codeclimate.com/badge.png)](https://codeclimate.com/github/joakimk/minimapper)
2
3
 
3
4
  # Minimapper
4
5
 
@@ -49,10 +50,10 @@ Please avoid installing directly from the github repository. Code will be pushed
49
50
 
50
51
  ### Basics
51
52
 
52
- You can use the mappers like this (**it's runnable, try copy and pasting it into a ruby file** or [use this gist](https://gist.github.com/3904952)):
53
+ You can use the mappers like this (<strong>it's runnable, try copy and pasting it into a ruby file</strong> or [use this gist](https://gist.github.com/3904952)):
53
54
 
54
55
  ``` ruby
55
- # minimapper_test.rb
56
+ # minimapper_example.rb
56
57
  require "rubygems"
57
58
  require "minimapper"
58
59
  require "minimapper/entity"
@@ -75,20 +76,20 @@ user_mapper.create(user)
75
76
 
76
77
  ## Finding
77
78
  user = user_mapper.find(user.id)
78
- puts user.name # => Joe
79
- puts user_mapper.first.name # => Joe
79
+ p user.name # => Joe
80
+ p user_mapper.first.name # => Joe
80
81
 
81
82
  ## Updating
82
83
  user.name = "Joey"
83
84
  user_mapper.update(user)
84
- puts user_mapper.first.name # => Joey
85
+ p user_mapper.first.name # => Joey
85
86
 
86
87
  ## Deleting
87
88
  old_id = user.id
88
89
  user_mapper.delete(user)
89
- puts user.id # => nil
90
- puts user_mapper.find_by_id(old_id) # => nil
91
- # user_mapper.find(old_id) # raises Minimapper::Common::CanNotFindEntity
90
+ p user.id # => nil
91
+ p user_mapper.find_by_id(old_id) # => nil
92
+ # user_mapper.find(old_id) # raises Minimapper::Common::CanNotFindEntity
92
93
  # user_mapper.delete_all
93
94
  # user_mapper.delete_by_id(1)
94
95
 
@@ -102,13 +103,14 @@ repository = Minimapper::Repository.build({
102
103
 
103
104
  user = User.new(:name => "Joe")
104
105
  repository.users.create(user)
105
- puts repository.users.find(user.id).name # => Joe
106
+ p repository.users.find(user.id).name # => Joe
107
+ repository.users.delete_all
106
108
 
107
109
  ## Using ActiveModel validations
108
110
  user = User.new
109
111
  repository.users.create(user)
110
- puts repository.users.count # => 0
111
- puts user.errors.full_messages # Name can't be blank
112
+ p repository.users.count # => 0
113
+ p user.errors.full_messages # Name can't be blank
112
114
  ```
113
115
 
114
116
  ### ActiveRecord
@@ -165,7 +167,7 @@ And then use it like this:
165
167
  ``` ruby
166
168
  # repository = Minimapper::Repository.build(...)
167
169
  repository.projects.waiting_for_review.each do |project|
168
- puts project.name
170
+ p project.name
169
171
  end
170
172
  ```
171
173
 
@@ -210,6 +212,10 @@ User.new(:reminder_on => "2012-01-01").reminder # => #<Date: 2012-01-01 ...>
210
212
 
211
213
  Minimapper only calls #convert on non-empty strings. When the value is blank or nil, the attribute is set to nil.
212
214
 
215
+ ### Associations
216
+
217
+ There is no built in support for associations yet, but you can handle them manually (see https://github.com/joakimk/minimapper/issues/3).
218
+
213
219
  ### Custom entity class
214
220
 
215
221
  [Minimapper::Entity](https://github.com/joakimk/minimapper/blob/master/lib/minimapper/entity.rb) adds some convenience methods for when a model is used within a rails application. If you don't need that you can just include the core API from the [Minimapper::Entity::Core](https://github.com/joakimk/minimapper/blob/master/lib/minimapper/entity/core.rb) module (or implement your own version that behaves like [Minimapper::Entity::Core](https://github.com/joakimk/minimapper/blob/master/lib/minimapper/entity/core.rb)).
data/lib/minimapper/ar.rb CHANGED
@@ -2,6 +2,8 @@ require "minimapper/common"
2
2
 
3
3
  module Minimapper
4
4
  class AR
5
+ include Common
6
+
5
7
  # Create
6
8
  def create(entity)
7
9
  if entity.valid?
@@ -1,5 +1,7 @@
1
1
  module Minimapper
2
2
  module Common
3
3
  CanNotFindEntity = Class.new(StandardError)
4
+
5
+ attr_accessor :repository
4
6
  end
5
7
  end
@@ -13,6 +13,9 @@ module Minimapper
13
13
  @@converters[type] = converter
14
14
  end
15
15
 
16
+ register_converter :integer, ToInteger.new
17
+ register_converter :date_time, ToDateTime.new
18
+
16
19
  def to(type)
17
20
  return nil if value.blank?
18
21
  return value unless value.is_a?(String)
@@ -20,9 +23,6 @@ module Minimapper
20
23
  converter_for(type).convert(value)
21
24
  end
22
25
 
23
- register_converter :integer, ToInteger.new
24
- register_converter :date_time, ToDateTime.new
25
-
26
26
  private
27
27
 
28
28
  def converter_for(type)
@@ -2,6 +2,8 @@ require 'minimapper/common'
2
2
 
3
3
  module Minimapper
4
4
  class Memory
5
+ include Common
6
+
5
7
  def initialize
6
8
  @store = []
7
9
  @last_id = 0
@@ -6,6 +6,7 @@ module Minimapper
6
6
 
7
7
  def initialize(mappers)
8
8
  @mappers = mappers
9
+ assign_repository_instance
9
10
  define_mapper_methods
10
11
  end
11
12
 
@@ -15,6 +16,12 @@ module Minimapper
15
16
 
16
17
  private
17
18
 
19
+ def assign_repository_instance
20
+ mappers.each do |name, instance|
21
+ instance.repository = self
22
+ end
23
+ end
24
+
18
25
  def define_mapper_methods
19
26
  mappers.each do |name, instance|
20
27
  singleton = (class << self; self end)
@@ -1,3 +1,3 @@
1
1
  module Minimapper
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
data/spec/ar_spec.rb CHANGED
@@ -24,7 +24,7 @@ class TestMapper < Minimapper::AR
24
24
  end
25
25
 
26
26
  describe Minimapper::AR do
27
- let(:repository) { TestMapper.new }
27
+ let(:mapper) { TestMapper.new }
28
28
  let(:entity_class) { TestEntity }
29
29
 
30
30
  include_examples :mapper
@@ -1,29 +1,34 @@
1
1
  shared_examples :mapper do
2
- # expects repository and entity_class to be defined
2
+ # expects mapper and entity_class to be defined
3
+
4
+ it "can set and get repository" do
5
+ mapper.repository = :repository_instance
6
+ mapper.repository.should == :repository_instance
7
+ end
3
8
 
4
9
  describe "#create" do
5
10
  it "sets an id on the entity" do
6
11
  entity1 = build_valid_entity
7
12
  entity1.id.should be_nil
8
- repository.create(entity1)
13
+ mapper.create(entity1)
9
14
  entity1.id.should > 0
10
15
 
11
16
  entity2 = build_valid_entity
12
- repository.create(entity2)
17
+ mapper.create(entity2)
13
18
  entity2.id.should == entity1.id + 1
14
19
  end
15
20
 
16
21
  it "returns the id" do
17
- id = repository.create(build_valid_entity)
22
+ id = mapper.create(build_valid_entity)
18
23
  id.should be_kind_of(Fixnum)
19
24
  id.should > 0
20
25
  end
21
26
 
22
27
  it "does not store by reference" do
23
28
  entity = build_valid_entity
24
- repository.create(entity)
25
- repository.last.object_id.should_not == entity.object_id
26
- repository.last.attributes[:name].should == "test"
29
+ mapper.create(entity)
30
+ mapper.last.object_id.should_not == entity.object_id
31
+ mapper.last.attributes[:name].should == "test"
27
32
  end
28
33
 
29
34
  it "validates the record before saving" do
@@ -31,15 +36,15 @@ shared_examples :mapper do
31
36
  def entity.valid?
32
37
  false
33
38
  end
34
- repository.create(entity).should be_false
39
+ mapper.create(entity).should be_false
35
40
  end
36
41
  end
37
42
 
38
43
  describe "#find" do
39
44
  it "returns an entity matching the id" do
40
45
  entity = build_valid_entity
41
- repository.create(entity)
42
- found_entity = repository.find(entity.id)
46
+ mapper.create(entity)
47
+ found_entity = mapper.find(entity.id)
43
48
  found_entity.attributes[:name].should == "test"
44
49
  found_entity.id.should == entity.id
45
50
  found_entity.should be_kind_of(Minimapper::Entity::Core)
@@ -47,27 +52,27 @@ shared_examples :mapper do
47
52
 
48
53
  it "supports string ids" do
49
54
  entity = build_valid_entity
50
- repository.create(entity)
51
- repository.find(entity.id.to_s)
55
+ mapper.create(entity)
56
+ mapper.find(entity.id.to_s)
52
57
  end
53
58
 
54
59
  it "does not return the same instance" do
55
60
  entity = build_valid_entity
56
- repository.create(entity)
57
- repository.find(entity.id).object_id.should_not == entity.object_id
58
- repository.find(entity.id).object_id.should_not == repository.find(entity.id).object_id
61
+ mapper.create(entity)
62
+ mapper.find(entity.id).object_id.should_not == entity.object_id
63
+ mapper.find(entity.id).object_id.should_not == mapper.find(entity.id).object_id
59
64
  end
60
65
 
61
66
  it "fails when an entity can not be found" do
62
- lambda { repository.find(-1) }.should raise_error(Minimapper::Common::CanNotFindEntity)
67
+ lambda { mapper.find(-1) }.should raise_error(Minimapper::Common::CanNotFindEntity)
63
68
  end
64
69
  end
65
70
 
66
71
  describe "#find_by_id" do
67
72
  it "returns an entity matching the id" do
68
73
  entity = build_valid_entity
69
- repository.create(entity)
70
- found_entity = repository.find_by_id(entity.id)
74
+ mapper.create(entity)
75
+ found_entity = mapper.find_by_id(entity.id)
71
76
  found_entity.attributes[:name].should == "test"
72
77
  found_entity.id.should == entity.id
73
78
  found_entity.should be_kind_of(Minimapper::Entity::Core)
@@ -75,19 +80,19 @@ shared_examples :mapper do
75
80
 
76
81
  it "supports string ids" do
77
82
  entity = build_valid_entity
78
- repository.create(entity)
79
- repository.find_by_id(entity.id.to_s)
83
+ mapper.create(entity)
84
+ mapper.find_by_id(entity.id.to_s)
80
85
  end
81
86
 
82
87
  it "does not return the same instance" do
83
88
  entity = build_valid_entity
84
- repository.create(entity)
85
- repository.find_by_id(entity.id).object_id.should_not == entity.object_id
86
- repository.find_by_id(entity.id).object_id.should_not == repository.find_by_id(entity.id).object_id
89
+ mapper.create(entity)
90
+ mapper.find_by_id(entity.id).object_id.should_not == entity.object_id
91
+ mapper.find_by_id(entity.id).object_id.should_not == mapper.find_by_id(entity.id).object_id
87
92
  end
88
93
 
89
94
  it "returns nil when an entity can not be found" do
90
- repository.find_by_id(-1).should be_nil
95
+ mapper.find_by_id(-1).should be_nil
91
96
  end
92
97
  end
93
98
 
@@ -95,9 +100,9 @@ shared_examples :mapper do
95
100
  it "returns all entities in undefined order" do
96
101
  first_created_entity = build_valid_entity
97
102
  second_created_entity = build_valid_entity
98
- repository.create(first_created_entity)
99
- repository.create(second_created_entity)
100
- all_entities = repository.all
103
+ mapper.create(first_created_entity)
104
+ mapper.create(second_created_entity)
105
+ all_entities = mapper.all
101
106
  all_entities.map(&:id).should include(first_created_entity.id)
102
107
  all_entities.map(&:id).should include(second_created_entity.id)
103
108
  all_entities.first.should be_kind_of(Minimapper::Entity::Core)
@@ -105,103 +110,103 @@ shared_examples :mapper do
105
110
 
106
111
  it "does not return the same instances" do
107
112
  entity = build_valid_entity
108
- repository.create(entity)
109
- repository.all.first.object_id.should_not == entity.object_id
110
- repository.all.first.object_id.should_not == repository.all.first.object_id
113
+ mapper.create(entity)
114
+ mapper.all.first.object_id.should_not == entity.object_id
115
+ mapper.all.first.object_id.should_not == mapper.all.first.object_id
111
116
  end
112
117
  end
113
118
 
114
119
  describe "#first" do
115
120
  it "returns the first entity" do
116
121
  first_created_entity = build_valid_entity
117
- repository.create(first_created_entity)
118
- repository.create(build_valid_entity)
119
- repository.first.id.should == first_created_entity.id
120
- repository.first.should be_kind_of(entity_class)
122
+ mapper.create(first_created_entity)
123
+ mapper.create(build_valid_entity)
124
+ mapper.first.id.should == first_created_entity.id
125
+ mapper.first.should be_kind_of(entity_class)
121
126
  end
122
127
 
123
128
  it "does not return the same instance" do
124
129
  entity = build_valid_entity
125
- repository.create(entity)
126
- repository.first.object_id.should_not == entity.object_id
127
- repository.first.object_id.should_not == repository.first.object_id
130
+ mapper.create(entity)
131
+ mapper.first.object_id.should_not == entity.object_id
132
+ mapper.first.object_id.should_not == mapper.first.object_id
128
133
  end
129
134
 
130
135
  it "returns nil when there is no entity" do
131
- repository.first.should be_nil
136
+ mapper.first.should be_nil
132
137
  end
133
138
  end
134
139
 
135
140
  describe "#last" do
136
141
  it "returns the last entity" do
137
142
  last_created_entity = build_valid_entity
138
- repository.create(build_valid_entity)
139
- repository.create(last_created_entity)
140
- repository.last.id.should == last_created_entity.id
141
- repository.last.should be_kind_of(entity_class)
143
+ mapper.create(build_valid_entity)
144
+ mapper.create(last_created_entity)
145
+ mapper.last.id.should == last_created_entity.id
146
+ mapper.last.should be_kind_of(entity_class)
142
147
  end
143
148
 
144
149
  it "does not return the same instance" do
145
150
  entity = build_valid_entity
146
- repository.create(entity)
147
- repository.last.object_id.should_not == entity.object_id
148
- repository.last.object_id.should_not == repository.last.object_id
151
+ mapper.create(entity)
152
+ mapper.last.object_id.should_not == entity.object_id
153
+ mapper.last.object_id.should_not == mapper.last.object_id
149
154
  end
150
155
 
151
156
  it "returns nil when there is no entity" do
152
- repository.last.should be_nil
157
+ mapper.last.should be_nil
153
158
  end
154
159
  end
155
160
 
156
161
  describe "#count" do
157
162
  it "returns the number of entities" do
158
- repository.create(build_valid_entity)
159
- repository.create(build_valid_entity)
160
- repository.count.should == 2
163
+ mapper.create(build_valid_entity)
164
+ mapper.create(build_valid_entity)
165
+ mapper.count.should == 2
161
166
  end
162
167
  end
163
168
 
164
169
  describe "#update" do
165
170
  it "updates" do
166
171
  entity = build_valid_entity
167
- repository.create(entity)
172
+ mapper.create(entity)
168
173
 
169
174
  entity.attributes = { :name => "Updated" }
170
- repository.last.attributes[:name].should == "test"
175
+ mapper.last.attributes[:name].should == "test"
171
176
 
172
- repository.update(entity)
173
- repository.last.id.should == entity.id
174
- repository.last.attributes[:name].should == "Updated"
177
+ mapper.update(entity)
178
+ mapper.last.id.should == entity.id
179
+ mapper.last.attributes[:name].should == "Updated"
175
180
  end
176
181
 
177
182
  it "does not update and returns false when the entity isn't valid" do
178
183
  entity = build_valid_entity
179
- repository.create(entity)
184
+ mapper.create(entity)
180
185
 
181
186
  def entity.valid?
182
187
  false
183
188
  end
184
189
 
185
- repository.update(entity).should be_false
186
- repository.last.attributes[:name].should == "test"
190
+ mapper.update(entity).should be_false
191
+ mapper.last.attributes[:name].should == "test"
187
192
  end
188
193
 
189
194
  it "returns true" do
190
195
  entity = build_valid_entity
191
- repository.create(entity)
192
- repository.update(entity).should == true
196
+ mapper.create(entity)
197
+ mapper.update(entity).should == true
193
198
  end
194
199
 
195
200
  it "fails when the entity does not have an id" do
196
201
  entity = build_valid_entity
197
- lambda { repository.update(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
202
+ lambda { mapper.update(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
198
203
  end
199
204
 
200
205
  it "fails when the entity no longer exists" do
201
206
  entity = build_valid_entity
202
- repository.create(entity)
203
- repository.delete_all
204
- lambda { repository.update(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
207
+ mapper.create(entity)
208
+ mapper.delete_all
209
+ lambda { mapper.update(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
205
210
  end
206
211
  end
207
212
 
@@ -209,53 +214,53 @@ shared_examples :mapper do
209
214
  it "removes the entity" do
210
215
  entity = build_valid_entity
211
216
  removed_entity_id = entity.id
212
- repository.create(entity)
213
- repository.create(build_valid_entity)
214
- repository.delete(entity)
215
- repository.all.size.should == 1
216
- repository.first.id.should_not == removed_entity_id
217
+ mapper.create(entity)
218
+ mapper.create(build_valid_entity)
219
+ mapper.delete(entity)
220
+ mapper.all.size.should == 1
221
+ mapper.first.id.should_not == removed_entity_id
217
222
  end
218
223
 
219
224
  it "clears the entity id" do
220
225
  entity = build_valid_entity
221
- repository.create(entity)
226
+ mapper.create(entity)
222
227
  entity.id.should_not be_nil
223
- repository.delete(entity)
228
+ mapper.delete(entity)
224
229
  entity.id.should be_nil
225
230
  end
226
231
 
227
232
  it "fails when the entity does not have an id" do
228
233
  entity = entity_class.new
229
- lambda { repository.delete(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
234
+ lambda { mapper.delete(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
230
235
  end
231
236
 
232
237
  it "fails when the entity can not be found" do
233
238
  entity = entity_class.new
234
239
  entity.id = -1
235
- lambda { repository.delete(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
240
+ lambda { mapper.delete(entity) }.should raise_error(Minimapper::Common::CanNotFindEntity)
236
241
  end
237
242
  end
238
243
 
239
244
  describe "#delete_by_id" do
240
245
  it "removes the entity" do
241
246
  entity = build_valid_entity
242
- repository.create(entity)
243
- repository.create(build_valid_entity)
244
- repository.delete_by_id(entity.id)
245
- repository.all.size.should == 1
246
- repository.first.id.should_not == entity.id
247
+ mapper.create(entity)
248
+ mapper.create(build_valid_entity)
249
+ mapper.delete_by_id(entity.id)
250
+ mapper.all.size.should == 1
251
+ mapper.first.id.should_not == entity.id
247
252
  end
248
253
 
249
254
  it "fails when an entity can not be found" do
250
- lambda { repository.delete_by_id(-1) }.should raise_error(Minimapper::Common::CanNotFindEntity)
255
+ lambda { mapper.delete_by_id(-1) }.should raise_error(Minimapper::Common::CanNotFindEntity)
251
256
  end
252
257
  end
253
258
 
254
259
  describe "#delete_all" do
255
- it "empties the repository" do
256
- repository.create(build_valid_entity)
257
- repository.delete_all
258
- repository.all.should == []
260
+ it "empties the mapper" do
261
+ mapper.create(build_valid_entity)
262
+ mapper.delete_all
263
+ mapper.all.should == []
259
264
  end
260
265
  end
261
266
 
data/unit/entity_spec.rb CHANGED
@@ -45,6 +45,12 @@ describe Minimapper::Entity do
45
45
  entity.id.should == 15
46
46
  end
47
47
 
48
+ it "sets blank values to nil" do
49
+ user = TestUser.new
50
+ user.name = " "
51
+ user.name.should be_nil
52
+ end
53
+
48
54
  it "symbolizes keys" do
49
55
  entity = TestEntity.new
50
56
  entity.attributes = { "id" => "15" }
data/unit/memory_spec.rb CHANGED
@@ -6,7 +6,7 @@ class BasicEntity
6
6
  end
7
7
 
8
8
  describe Minimapper::Memory do
9
- let(:repository) { described_class.new }
9
+ let(:mapper) { described_class.new }
10
10
  let(:entity_class) { BasicEntity }
11
11
 
12
12
  include_examples :mapper
@@ -18,18 +18,26 @@ describe Minimapper::Repository, "self.build" do
18
18
  repository.projects.object_id.should == repository.projects.object_id
19
19
  end
20
20
 
21
+ it "adds a reference to the repository" do
22
+ mapper = Test::ProjectMapper.new
23
+ repository = described_class.build(:projects => mapper)
24
+ mapper.repository.should == repository
25
+ end
26
+
21
27
  it "does not leak between instances" do
22
- repository1 = described_class.build(:projects => :foo)
23
- repository2 = described_class.build(:projects => :bar)
24
- repository1.projects.should == :foo
25
- repository2.projects.should == :bar
28
+ mapper1 = mock.as_null_object
29
+ mapper2 = mock.as_null_object
30
+ repository1 = described_class.build(:projects => mapper1)
31
+ repository2 = described_class.build(:projects => mapper2)
32
+ repository1.projects.should == mapper1
33
+ repository2.projects.should == mapper2
26
34
  end
27
35
  end
28
36
 
29
37
  describe Minimapper::Repository, "#delete_all!" do
30
38
  it "removes all records by calling delete_all on all mappers" do
31
- project_mapper = mock
32
- user_mapper = mock
39
+ project_mapper = mock.as_null_object
40
+ user_mapper = mock.as_null_object
33
41
 
34
42
  project_mapper.should_receive(:delete_all)
35
43
  user_mapper.should_receive(:delete_all)
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: minimapper
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-11-18 00:00:00.000000000 Z
12
+ date: 2012-11-19 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rake
16
- requirement: &70328752668500 !ruby/object:Gem::Requirement
16
+ requirement: &70175304808520 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,7 +21,7 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70328752668500
24
+ version_requirements: *70175304808520
25
25
  description: A minimalistic way of separating your models from ORMs like ActiveRecord.
26
26
  email:
27
27
  - joakim.kolsjo@gmail.com
@@ -77,7 +77,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
77
77
  version: '0'
78
78
  segments:
79
79
  - 0
80
- hash: -4540271108059572460
80
+ hash: 899466324574471464
81
81
  required_rubygems_version: !ruby/object:Gem::Requirement
82
82
  none: false
83
83
  requirements:
@@ -86,7 +86,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
86
86
  version: '0'
87
87
  segments:
88
88
  - 0
89
- hash: -4540271108059572460
89
+ hash: 899466324574471464
90
90
  requirements: []
91
91
  rubyforge_project:
92
92
  rubygems_version: 1.8.5