property_sets 0.0.12 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Gemfile CHANGED
@@ -1,7 +1,9 @@
1
1
  source "http://rubygems.org"
2
2
  # Add dependencies required to use your gem here.
3
3
  # Example:
4
- # gem "activesupport", ">= 2.3.5"
4
+
5
+ gem "activesupport", "~> 2.3.5"
6
+ gem "activerecord", "~> 2.3.5"
5
7
 
6
8
  # Add dependencies to develop your gem here.
7
9
  # Include everything needed to run rake, tests, features, etc.
@@ -9,5 +11,5 @@ group :development do
9
11
  gem "shoulda", ">= 0"
10
12
  gem "bundler", "~> 1.0.0"
11
13
  gem "jeweler", "~> 1.5.1"
12
- gem "rcov", ">= 0"
14
+ gem "ruby-debug"
13
15
  end
data/Gemfile.lock ADDED
@@ -0,0 +1,31 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ activerecord (2.3.10)
5
+ activesupport (= 2.3.10)
6
+ activesupport (2.3.10)
7
+ columnize (0.3.2)
8
+ git (1.2.5)
9
+ jeweler (1.5.2)
10
+ bundler (~> 1.0.0)
11
+ git (>= 1.2.5)
12
+ rake
13
+ linecache (0.43)
14
+ rake (0.8.7)
15
+ ruby-debug (0.10.4)
16
+ columnize (>= 0.1)
17
+ ruby-debug-base (~> 0.10.4.0)
18
+ ruby-debug-base (0.10.4)
19
+ linecache (>= 0.3)
20
+ shoulda (2.11.3)
21
+
22
+ PLATFORMS
23
+ ruby
24
+
25
+ DEPENDENCIES
26
+ activerecord (~> 2.3.5)
27
+ activesupport (~> 2.3.5)
28
+ bundler (~> 1.0.0)
29
+ jeweler (~> 1.5.1)
30
+ ruby-debug
31
+ shoulda
data/README.rdoc CHANGED
@@ -20,33 +20,17 @@ You configure the allowed stored properties by specifying these in the model:
20
20
 
21
21
  The declared properties can then be accessed runtime via the defined association:
22
22
 
23
- # Return the version record for this account - or a new record if none exists
23
+ # Return the value of the version record for this account, or the default value if not set
24
24
  account.settings.version
25
25
 
26
- # Create (or update) the version record with default value
27
- account.settings.version.create
26
+ # Update the version record with given value
27
+ account.settings.version = "v1.1"
28
28
 
29
- # Create (or update) the version record with the given value
30
- account.settings.version.create(:value => "v1.1")
31
-
32
- # Destroy the version record
33
- account.settings.version.destroy
34
-
35
- === Convenience methods
36
-
37
- On top of the basic access paths, there are some short cuts, mainly convenience methods for dealing with booleans:
38
-
39
- # immediately changes the value of the setting
40
- account.settings.version=("v3.0")
41
-
42
- # coerces the setting to boolean AR style
29
+ # Query the truth value of the property
43
30
  account.settings.featured?
44
31
 
45
- # sets the value of this setting to a true value
46
- account.settings.featured.enable
47
-
48
- # sets the value of this setting to a false value
49
- account.settings.featured.disable
32
+ # Short hand for setting one or more values
33
+ account.settings.set(:version => "v1.2", :activated => true)
50
34
 
51
35
  === Bulk operations
52
36
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.12
1
+ 0.1.0
@@ -3,75 +3,55 @@ require 'delegate'
3
3
  module PropertySets
4
4
  module ActiveRecordExtension
5
5
 
6
- class PropertySetProxy < Delegator
7
- attr_accessor :record
8
-
9
- def initialize(record)
10
- self.record = record
11
- end
12
-
13
- def __getobj__
14
- record
15
- end
16
-
17
- def id
18
- record.id
19
- end
20
-
21
- def create(args = {})
22
- record.attributes = args
23
- record.save
24
- record
25
- end
26
- end
27
-
28
6
  module ClassMethods
29
7
  def property_set(association, &block)
30
8
  raise "Invalid association name, letters only" unless association.to_s =~ /[a-z]+/
31
9
  property_class = PropertySets.ensure_property_set_class(association, self)
32
10
  property_class.instance_eval(&block)
33
11
 
34
- has_many association.to_s.pluralize.to_sym, :class_name => property_class.name, :dependent => :destroy do
12
+ has_many association, :class_name => property_class.name, :dependent => :destroy do
35
13
 
36
14
  # Accepts a name value pair hash { :name => 'value', :pairs => true } and builds a property for each key
37
- def bulk(property_pairs, with_protection = false)
15
+ def set(property_pairs, with_protection = false)
38
16
  property_pairs.keys.each do |name|
39
- record = lookup(name).record
17
+ record = lookup(name)
40
18
  if with_protection && record.protected?
41
19
  logger.warn("Someone tried to update the protected #{name} property to #{property_pairs[name]}")
42
20
  else
43
- record.value = property_pairs[name]
44
- self << record
21
+ send("#{name}=", property_pairs[name])
45
22
  end
46
23
  end
47
24
  end
48
25
 
49
- # Define the settings query methods, e.g. +account.settings.wiffle?+
50
26
  property_class.keys.each do |key|
51
- raise "Invalid key #{key}" if self.respond_to?(key)
27
+ raise "Invalid property key #{key}" if self.respond_to?(key)
52
28
 
53
- # Reports the coerced truth valye of the property
29
+ # Reports the coerced truth value of the property
54
30
  define_method "#{key}?" do
55
31
  lookup(key).true?
56
32
  end
57
33
 
34
+ # Returns the value of the property
35
+ define_method "#{key}" do
36
+ lookup(key).value
37
+ end
38
+
39
+ define_method "protected?" do |arg|
40
+ lookup(arg).protected?
41
+ end
42
+
58
43
  # Assigns a new value to the property
59
44
  define_method "#{key}=" do |value|
60
45
  instance = lookup(key)
61
46
  instance.value = value
62
- instance.save
63
- end
64
-
65
- # Returns the value of the property
66
- define_method "#{key}" do
67
- lookup(key)
47
+ @owner.send(association) << instance
48
+ value
68
49
  end
69
50
 
70
51
  # The finder method which returns the property if present, otherwise a new instance with defaults
71
52
  define_method "lookup" do |arg|
72
- instance = detect { |property| property.name.to_sym == arg }
73
- instance ||= property_class.new(@owner.class.name.underscore.to_sym => @owner, :name => arg.to_s, :value => property_class.default(arg))
74
- PropertySetProxy.new(instance)
53
+ instance = detect { |property| property.name.to_sym == arg }
54
+ instance ||= property_class.new(:name => arg.to_s, :value => property_class.default(arg))
75
55
  end
76
56
  end
77
57
  end
@@ -92,7 +72,7 @@ module PropertySets
92
72
  def update_property_set_attributes(attributes)
93
73
  if attributes && property_sets = attributes.delete(:property_sets)
94
74
  property_sets.each do |property_set, property_set_attributes|
95
- send(property_set).bulk(property_set_attributes, true)
75
+ send(property_set).set(property_set_attributes, true)
96
76
  end
97
77
  end
98
78
  end
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{property_sets}
8
- s.version = "0.0.12"
8
+ s.version = "0.1.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Morten Primdahl"]
12
- s.date = %q{2011-01-17}
12
+ s.date = %q{2011-01-18}
13
13
  s.description = %q{This gem is an ActiveRecord extension which provides a convenient interface for managing per row properties}
14
14
  s.email = %q{morten@zendesk.com}
15
15
  s.extra_rdoc_files = [
@@ -19,6 +19,7 @@ Gem::Specification.new do |s|
19
19
  s.files = [
20
20
  ".document",
21
21
  "Gemfile",
22
+ "Gemfile.lock",
22
23
  "LICENSE.txt",
23
24
  "README.rdoc",
24
25
  "Rakefile",
@@ -52,23 +53,29 @@ Gem::Specification.new do |s|
52
53
  s.specification_version = 3
53
54
 
54
55
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
56
+ s.add_runtime_dependency(%q<activesupport>, ["~> 2.3.5"])
57
+ s.add_runtime_dependency(%q<activerecord>, ["~> 2.3.5"])
55
58
  s.add_development_dependency(%q<shoulda>, [">= 0"])
56
59
  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
57
60
  s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
58
- s.add_development_dependency(%q<rcov>, [">= 0"])
61
+ s.add_development_dependency(%q<ruby-debug>, [">= 0"])
59
62
  s.add_development_dependency(%q<thoughtbot-shoulda>, [">= 0"])
60
63
  else
64
+ s.add_dependency(%q<activesupport>, ["~> 2.3.5"])
65
+ s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
61
66
  s.add_dependency(%q<shoulda>, [">= 0"])
62
67
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
63
68
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
64
- s.add_dependency(%q<rcov>, [">= 0"])
69
+ s.add_dependency(%q<ruby-debug>, [">= 0"])
65
70
  s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
66
71
  end
67
72
  else
73
+ s.add_dependency(%q<activesupport>, ["~> 2.3.5"])
74
+ s.add_dependency(%q<activerecord>, ["~> 2.3.5"])
68
75
  s.add_dependency(%q<shoulda>, [">= 0"])
69
76
  s.add_dependency(%q<bundler>, ["~> 1.0.0"])
70
77
  s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
71
- s.add_dependency(%q<rcov>, [">= 0"])
78
+ s.add_dependency(%q<ruby-debug>, [">= 0"])
72
79
  s.add_dependency(%q<thoughtbot-shoulda>, [">= 0"])
73
80
  end
74
81
  end
data/test/helper.rb CHANGED
@@ -4,6 +4,7 @@ require 'active_support'
4
4
  require 'active_record'
5
5
  require 'active_record/fixtures'
6
6
  require 'shoulda'
7
+ require 'ruby-debug'
7
8
 
8
9
  ActiveRecord::Base.configurations = YAML::load(IO.read(File.dirname(__FILE__) + '/database.yml'))
9
10
  ActiveRecord::Base.establish_connection('test')
@@ -1,4 +1,4 @@
1
- require 'helper'
1
+ require File.expand_path(File.dirname(__FILE__) + '/helper')
2
2
 
3
3
  class Account < ActiveRecord::Base
4
4
  property_set :settings do
@@ -6,8 +6,7 @@ class Account < ActiveRecord::Base
6
6
  property :bar
7
7
  property :baz
8
8
  property :hep, :default => 'skep'
9
- property :bob
10
- property :bla, :protected => true
9
+ property :pro, :protected => true
11
10
  end
12
11
 
13
12
  property_set :texts do
@@ -33,20 +32,25 @@ class TestPropertySets < ActiveSupport::TestCase
33
32
  end
34
33
 
35
34
  should "support protecting attributes" do
36
- assert @account.settings.bla.protected?
35
+ assert @account.settings.protected?(:pro)
36
+ assert !@account.settings.protected?(:foo)
37
37
  end
38
38
 
39
39
  should "be empty on a new account" do
40
40
  assert @account.settings.empty?
41
41
  assert @account.texts.empty?
42
+
43
+ assert !@account.texts.foo?
44
+ assert !@account.texts.bar?
45
+ assert @account.texts.foo.nil?
46
+ assert @account.texts.bar.nil?
42
47
  end
43
48
 
44
- should "respond to defaults" do
49
+ should "respond with defaults" do
45
50
  assert_equal false, @account.settings.bar?
46
- assert_equal nil, @account.settings.bar.value
51
+ assert_equal nil, @account.settings.bar
47
52
  assert_equal true, @account.settings.hep?
48
- assert_equal 'skep', @account.settings.hep.value
49
- assert @account.settings.hep.id.nil?
53
+ assert_equal 'skep', @account.settings.hep
50
54
  end
51
55
 
52
56
  should "reject settings with an invalid name" do
@@ -64,113 +68,75 @@ class TestPropertySets < ActiveSupport::TestCase
64
68
  end
65
69
 
66
70
  should "validate uniqueness of settings" do
67
- AccountSetting.create!(:account => @account, :name => 'unique')
71
+ @account.settings.create!(:name => "unique")
68
72
  assert_raise ActiveRecord::RecordInvalid do
69
- AccountSetting.create!(:account => @account, :name => 'unique')
73
+ @account.settings.create!(:name => "unique")
70
74
  end
71
75
  end
72
76
 
73
77
  should "be creatable using the = operator" do
74
78
  assert !@account.settings.foo?
75
- assert @account.settings.foo = "1"
76
- assert @account.settings.size == 1
77
- assert @account.texts.size == 0
78
- assert @account.settings.foo?
79
- assert @account.settings.foo = "2"
80
- assert @account.settings.size == 1
81
- assert @account.settings.foo?
82
- end
79
+ [ "1", "2" ].each do |value|
80
+ assert @account.settings.foo = value
81
+ assert @account.settings.foo?
82
+ assert @account.settings.size == 1
83
+ end
83
84
 
84
- should "be creatable through association" do
85
- assert @account.settings.foo.create.id
86
- @account.settings.foo.destroy
87
- @account.reload
88
- assert @account.settings.foo.new_record?
89
- assert @account.settings.foo.create(:value => 8)
90
- assert @account.settings.foo.id
91
- assert @account.settings.foo.value == "8"
92
- assert @account.settings.hep.create
93
- assert_equal @account.settings.hep.value, "skep"
85
+ assert @account.texts.empty?
94
86
  end
95
87
 
96
- should "be destroyable through association" do
97
- assert !@account.settings.foo?
98
- assert @account.settings.foo = "1"
99
- assert @account.settings.foo?
100
- assert @account.settings.foo.destroy
101
- @account.settings.reload
102
- assert !@account.settings.foo?
88
+ should "coerce everything but nil to string" do
89
+ @account.settings.foo = 3
90
+ assert @account.settings.foo == "3"
91
+ @account.settings.foo = nil
92
+ assert @account.settings.foo.nil?
103
93
  end
104
94
 
105
- should "support enable/disable semantics" do
106
- assert !@account.settings.foo?
107
- assert @account.settings.foo.id.nil?
108
- @account.settings.foo.enable
109
- assert @account.settings.foo.id.present?
110
- assert @account.settings.foo?
111
- @account.settings.foo.disable
112
- assert !@account.settings.foo?
113
- end
95
+ context "#set" do
96
+ should "support writing multiple values to the association" do
97
+ assert !@account.settings.foo?
98
+ assert !@account.settings.bar?
114
99
 
115
- should "coerce everything but nil to string" do
116
- assert @account.settings.foo.create(:value => 3)
117
- assert @account.settings.foo.value == "3"
118
- assert @account.settings.foo.create(:value => nil)
119
- assert @account.settings.foo.value.nil?
120
- end
100
+ @account.settings.set(:foo => "123", :bar => "456")
121
101
 
122
- context "bulk updates" do
123
- should "support bulk create/update of multiple properties in one go" do
102
+ assert @account.settings.foo?
103
+ assert @account.settings.bar?
104
+ end
105
+
106
+ should "work identically for new and existing owner objects" do
124
107
  [ @account, Account.new(:name => "Mibble") ].each do |account|
125
- account.settings.bulk(:foo => "123", :bar => "456")
126
- account.save!
127
-
128
- assert_equal account.reload.settings.size, 2
129
- assert_equal account.settings.foo.value, "123"
130
- assert_equal account.settings.foo.name, "foo"
131
- assert_equal account.settings.bar.value, "456"
132
- assert_equal account.settings.bar.name, "bar"
133
-
134
- account.settings.bulk(:bar => "789", :baz => "012")
135
- account.save!
136
-
137
- assert_equal account.reload.settings.size, 3
138
- assert_equal account.settings.foo.value, "123"
139
- assert_equal account.settings.bar.value, "789"
140
- assert_equal account.settings.baz.value, "012"
108
+ account.settings.set(:foo => "123", :bar => "456")
109
+
110
+ assert_equal account.settings.size, 2
111
+ assert_equal account.settings.foo, "123"
112
+ assert_equal account.settings.bar, "456"
113
+
114
+ account.settings.set(:bar => "789", :baz => "012")
115
+
116
+ assert_equal account.settings.size, 3
117
+ assert_equal account.settings.foo, "123"
118
+ assert_equal account.settings.bar, "789"
119
+ assert_equal account.settings.baz, "012"
141
120
  end
142
121
  end
143
122
 
144
123
  should "be updateable as AR nested attributes" do
145
- assert !@account.texts.foo?
146
- assert !@account.texts.bar?
147
- assert !@account.texts.foo.id
148
- assert !@account.texts.bar.id
149
- assert @account.texts.empty?
150
-
151
124
  assert @account.texts_attributes = [{ :name => "foo", :value => "1" }, { :name => "bar", :value => "0" }]
152
125
  @account.save!
153
126
 
154
- assert @account.texts.foo?
155
- assert !@account.texts.bar?
156
- assert @account.texts.foo.id
157
- assert @account.texts.bar.id
127
+ assert @account.texts.foo == "1"
128
+ assert @account.texts.bar == "0"
158
129
 
159
130
  @account.update_attributes!(:texts_attributes => [
160
- { :id => @account.texts.foo.id, :name => "foo", :value => "0" },
161
- { :id => @account.texts.bar.id, :name => "bar", :value => "1" }
131
+ { :id => @account.texts.lookup(:foo).id, :name => "foo", :value => "0" },
132
+ { :id => @account.texts.lookup(:bar).id, :name => "bar", :value => "1" }
162
133
  ])
163
- assert !@account.texts.foo?
164
- assert @account.texts.bar?
134
+
135
+ assert @account.texts.foo == "0"
136
+ assert @account.texts.bar == "1"
165
137
  end
166
138
 
167
139
  should "be updateable as a nested structure" do
168
- assert !@account.settings.foo?
169
- assert !@account.settings.bar?
170
- assert !@account.settings.foo.id
171
- assert !@account.settings.bar.id
172
- assert @account.settings.empty?
173
-
174
140
  attribs = {
175
141
  :name => "Kim",
176
142
  :property_sets => {
@@ -183,15 +149,14 @@ class TestPropertySets < ActiveSupport::TestCase
183
149
 
184
150
  assert @account.settings.foo?
185
151
  assert !@account.settings.bar?
186
- assert @account.settings.foo.id
187
- assert @account.settings.bar.id
188
- assert @account.settings.foo.value == "1"
189
- assert @account.settings.bar.value == "0"
152
+ assert @account.settings.foo == "1"
153
+ assert @account.settings.bar == "0"
154
+ assert !@account.settings.pro?
190
155
 
191
156
  attribs = {
192
157
  :name => "Kim",
193
158
  :property_sets => {
194
- :settings => { :foo => "1", :bar => "1", :baz => "1", :bla => "1" }
159
+ :settings => { :foo => "1", :bar => "1", :baz => "1", :pro => "1" }
195
160
  }
196
161
  }
197
162
 
@@ -200,7 +165,7 @@ class TestPropertySets < ActiveSupport::TestCase
200
165
  assert @account.settings.foo?
201
166
  assert @account.settings.bar?
202
167
  assert @account.settings.baz?
203
- assert !@account.settings.bla?
168
+ assert !@account.settings.pro?
204
169
  end
205
170
  end
206
171
 
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: property_sets
3
3
  version: !ruby/object:Gem::Version
4
- hash: 7
4
+ hash: 27
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
+ - 1
8
9
  - 0
9
- - 12
10
- version: 0.0.12
10
+ version: 0.1.0
11
11
  platform: ruby
12
12
  authors:
13
13
  - Morten Primdahl
@@ -15,14 +15,46 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-01-17 00:00:00 -08:00
18
+ date: 2011-01-18 00:00:00 -08:00
19
19
  default_executable:
20
20
  dependencies:
21
+ - !ruby/object:Gem::Dependency
22
+ prerelease: false
23
+ type: :runtime
24
+ name: activesupport
25
+ version_requirements: &id001 !ruby/object:Gem::Requirement
26
+ none: false
27
+ requirements:
28
+ - - ~>
29
+ - !ruby/object:Gem::Version
30
+ hash: 9
31
+ segments:
32
+ - 2
33
+ - 3
34
+ - 5
35
+ version: 2.3.5
36
+ requirement: *id001
37
+ - !ruby/object:Gem::Dependency
38
+ prerelease: false
39
+ type: :runtime
40
+ name: activerecord
41
+ version_requirements: &id002 !ruby/object:Gem::Requirement
42
+ none: false
43
+ requirements:
44
+ - - ~>
45
+ - !ruby/object:Gem::Version
46
+ hash: 9
47
+ segments:
48
+ - 2
49
+ - 3
50
+ - 5
51
+ version: 2.3.5
52
+ requirement: *id002
21
53
  - !ruby/object:Gem::Dependency
22
54
  prerelease: false
23
55
  type: :development
24
56
  name: shoulda
25
- version_requirements: &id001 !ruby/object:Gem::Requirement
57
+ version_requirements: &id003 !ruby/object:Gem::Requirement
26
58
  none: false
27
59
  requirements:
28
60
  - - ">="
@@ -31,12 +63,12 @@ dependencies:
31
63
  segments:
32
64
  - 0
33
65
  version: "0"
34
- requirement: *id001
66
+ requirement: *id003
35
67
  - !ruby/object:Gem::Dependency
36
68
  prerelease: false
37
69
  type: :development
38
70
  name: bundler
39
- version_requirements: &id002 !ruby/object:Gem::Requirement
71
+ version_requirements: &id004 !ruby/object:Gem::Requirement
40
72
  none: false
41
73
  requirements:
42
74
  - - ~>
@@ -47,12 +79,12 @@ dependencies:
47
79
  - 0
48
80
  - 0
49
81
  version: 1.0.0
50
- requirement: *id002
82
+ requirement: *id004
51
83
  - !ruby/object:Gem::Dependency
52
84
  prerelease: false
53
85
  type: :development
54
86
  name: jeweler
55
- version_requirements: &id003 !ruby/object:Gem::Requirement
87
+ version_requirements: &id005 !ruby/object:Gem::Requirement
56
88
  none: false
57
89
  requirements:
58
90
  - - ~>
@@ -63,12 +95,12 @@ dependencies:
63
95
  - 5
64
96
  - 1
65
97
  version: 1.5.1
66
- requirement: *id003
98
+ requirement: *id005
67
99
  - !ruby/object:Gem::Dependency
68
100
  prerelease: false
69
101
  type: :development
70
- name: rcov
71
- version_requirements: &id004 !ruby/object:Gem::Requirement
102
+ name: ruby-debug
103
+ version_requirements: &id006 !ruby/object:Gem::Requirement
72
104
  none: false
73
105
  requirements:
74
106
  - - ">="
@@ -77,12 +109,12 @@ dependencies:
77
109
  segments:
78
110
  - 0
79
111
  version: "0"
80
- requirement: *id004
112
+ requirement: *id006
81
113
  - !ruby/object:Gem::Dependency
82
114
  prerelease: false
83
115
  type: :development
84
116
  name: thoughtbot-shoulda
85
- version_requirements: &id005 !ruby/object:Gem::Requirement
117
+ version_requirements: &id007 !ruby/object:Gem::Requirement
86
118
  none: false
87
119
  requirements:
88
120
  - - ">="
@@ -91,7 +123,7 @@ dependencies:
91
123
  segments:
92
124
  - 0
93
125
  version: "0"
94
- requirement: *id005
126
+ requirement: *id007
95
127
  description: This gem is an ActiveRecord extension which provides a convenient interface for managing per row properties
96
128
  email: morten@zendesk.com
97
129
  executables: []
@@ -104,6 +136,7 @@ extra_rdoc_files:
104
136
  files:
105
137
  - .document
106
138
  - Gemfile
139
+ - Gemfile.lock
107
140
  - LICENSE.txt
108
141
  - README.rdoc
109
142
  - Rakefile