plyushkin 0.0.3 → 0.0.4

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: f3ffa197a5ec8d8b23b72ba77444540524c17062
4
+ data.tar.gz: cfd45839d46278a89f81904eee6cc4cedb490b97
5
+ SHA512:
6
+ metadata.gz: 20a5449a85d1753e8a08ec0bac1063827a1ddc3d1325edfd57d805072f9f90d4cf6bf581e2da6a51457daaf7c493543e750e9652b08e62b1f4dd1782b575ae8a
7
+ data.tar.gz: 0e26387d0792ec1ec44f78d8f5e1e738dd1f7c51cc1163305087dc76d52b0d6a67be1f84ad8674828452d2fcbcacb281ddebe85c113d29e0d3edcda897e9c28a
data/README.md CHANGED
@@ -18,7 +18,30 @@ Or install it yourself as:
18
18
 
19
19
  ## Usage
20
20
 
21
- TODO: Write usage instructions here
21
+ Configure the backend service that plyushkin will use in your environments/<environment>.rb file.
22
+ For example, to configure the stub service for running specs, the following code would go in your
23
+ config/environments/test.rb file of a Rails application.
24
+
25
+ config.before_initialize do |c|
26
+ Plyushkin::Service.service = Plyushkin::Service::Stub.new
27
+ end
28
+
29
+ To use plyushkin against a live web service,
30
+ assign an instance of ``Plyushkin::Service::Web.new(:url => 'http://yourservice.com')``
31
+
32
+ ## Testing
33
+
34
+ Plyushkin provides RSpec matchers for testing class macros. To use these matchers,
35
+ add ``config.include Plyushkin::Test::Matchers`` to your RSpec.configure in spec_helper.
36
+
37
+ To test Plyushkin configuration in your model:
38
+
39
+ describe YourModel do
40
+ it { should persist_attribute(:your_attribute) }
41
+ it { should_not persist_attribute(:your_non_plyushkin_attribute) }
42
+ it { should persist_attribute(:your_attribute).with_format(:to_date) }
43
+ it { should_not persist_attribute(:your_attribute).with_format(:not_a_formatter) }
44
+ end
22
45
 
23
46
  ## Contributing
24
47
 
data/lib/plyushkin.rb CHANGED
@@ -3,6 +3,7 @@ require "active_record"
3
3
 
4
4
  module Plyushkin; end
5
5
  path = File.dirname(File.expand_path(__FILE__))
6
+ require path + "/plyushkin/error.rb"
6
7
  require path + "/plyushkin/base_value"
7
8
  require path + "/plyushkin/string_value"
8
9
  require path + "/plyushkin/nil_value"
@@ -9,12 +9,19 @@ class Plyushkin::BaseValue
9
9
  end
10
10
  end
11
11
 
12
+ def formatters
13
+ @formatters.dup
14
+ end
15
+
12
16
  def self.persisted_attr(*attributes)
13
17
  opts = attributes.last.is_a?(Hash) ? attributes.pop : {}
14
18
  names = attributes
15
19
  formatter = opts[:formatter]
16
20
 
21
+ names.each{|name| formatters[name] = formatter}
22
+
17
23
  persisted_attributes.concat(names)
24
+
18
25
  attr_writer *names
19
26
  names.each do |name|
20
27
  define_method(name) do
@@ -29,16 +36,24 @@ class Plyushkin::BaseValue
29
36
  end
30
37
 
31
38
  def self.persisted_attributes
32
- if self.superclass == Object
39
+ if self.superclass == Object && self.superclass.class == Class
33
40
  @persisted_attributes ||= []
34
41
  else
35
42
  @persisted_attributes ||= superclass.persisted_attributes.dup
36
43
  end
37
44
  end
38
45
 
46
+ def self.formatters
47
+ if self.superclass == Object
48
+ @formatters ||= {}
49
+ else
50
+ @formatters ||= superclass.formatters.dup
51
+ end
52
+ end
53
+
39
54
  persisted_attr :date, :formatter => :to_date
40
55
  validates_each :date do |record, attr_name, value|
41
- record.errors.add(attr_name, "cannot be in the future") unless value < DateTime.now
56
+ record.errors.add(attr_name, "cannot be in the future") unless value <= Time.now
42
57
  end
43
58
 
44
59
  def equal_value?(other)
@@ -49,11 +64,28 @@ class Plyushkin::BaseValue
49
64
  end
50
65
 
51
66
  def to_i(value)
52
- value.to_i
67
+ value =~ /\A\d+\Z/ ? value.to_i : value
68
+ end
69
+
70
+ #TODO: Maybe this can be nicer.
71
+ def to_f(value)
72
+ begin
73
+ Float(value)
74
+ rescue ArgumentError => e
75
+ value
76
+ rescue TypeError => e
77
+ value
78
+ end
53
79
  end
54
80
 
55
81
  def to_date(value)
56
82
  value.is_a?(String) ? DateTime.parse(value) : value
57
83
  end
58
84
 
85
+ def to_bool(value)
86
+ return true if value == "true"
87
+ return false if value == "false"
88
+ return value
89
+ end
90
+
59
91
  end
@@ -7,7 +7,7 @@ ActiveRecord::Base.instance_eval do
7
7
  end
8
8
  validates name, :plyushkin => true
9
9
 
10
- plyushkin_model.register(name, opts[:type], opts)
10
+ plyushkin_model.register(name, opts[:type] || Plyushkin::StringValue, opts)
11
11
  plyushkin_model.register_callback(name, :after_create, opts[:after_create]) if opts[:after_create]
12
12
  end
13
13
 
@@ -0,0 +1 @@
1
+ class Plyushkin::Error < StandardError; end
@@ -2,6 +2,10 @@ class Plyushkin::Model
2
2
  attr_reader :service, :name, :cache
3
3
 
4
4
  def initialize(service, name, cache)
5
+ raise Plyushkin::Error.new <<-ERROR unless service
6
+ Service cannot be nil. Set Plyushkin::Service.service to a service instance in an initializer.
7
+ ERROR
8
+
5
9
  @service = service
6
10
  @types = {}
7
11
  @ignore_unchanged_values = {}
@@ -80,4 +80,8 @@ class Plyushkin::Property
80
80
 
81
81
  value_hashes == {} ? [] : [value_hashes]
82
82
  end
83
+
84
+ def nil?
85
+ last.is_a?(Plyushkin::NilValue)
86
+ end
83
87
  end
@@ -1 +1,2 @@
1
1
  require File.dirname(File.expand_path(__FILE__)) + "/test/value_types.rb"
2
+ require File.dirname(File.expand_path(__FILE__)) + "/test/matchers.rb"
@@ -0,0 +1,98 @@
1
+ module Plyushkin::Test
2
+ class HoardedAttributeMatcher < Plyushkin::Test::MatcherBase
3
+ def initialize(attribute)
4
+ @attribute = attribute
5
+ end
6
+
7
+ def of_type(type)
8
+ matchers << OfTypeMatcher.new(@attribute, type)
9
+ self
10
+ end
11
+
12
+ def and_ignore_unchanged_values
13
+ matchers << IgnoreUnchangedMatcher.new(@attribute)
14
+ self
15
+ end
16
+
17
+ def and_after_create_call(sym)
18
+ matchers << CallbackMatcher.new(@attribute, sym)
19
+ self
20
+ end
21
+
22
+ def matches?(subject)
23
+ unless subject.class.plyushkin_model.registered_types.keys.include?(@attribute)
24
+ @failure_message = "Plyushkin: does not hoard attribute #{@attribute}"
25
+ @negative_failure_message = "Plyushkin: hoards attribute #{@attribute}"
26
+ end
27
+ super
28
+ end
29
+
30
+ class OfTypeMatcher
31
+ def initialize(attr_name, type)
32
+ @attr_name, @type = attr_name, type
33
+ end
34
+
35
+ def match(subject)
36
+ subject.class.plyushkin_model.registered_types[@attr_name] == @type
37
+ end
38
+
39
+ def failure_message
40
+ message(false)
41
+ end
42
+
43
+ def negative_failure_message
44
+ message(true)
45
+ end
46
+
47
+ private
48
+ def message(negate)
49
+ "Plyushkin: Hoarded attribute #{@attr_name} is #{negate ? "" : "not"} of type #{@type}"
50
+ end
51
+ end
52
+
53
+ class IgnoreUnchangedMatcher
54
+ def initialize(attr_name)
55
+ @attr_name = attr_name
56
+ end
57
+
58
+ def match(subject)
59
+ subject.class.plyushkin_model.ignore_unchanged_values[@attr_name]
60
+ end
61
+
62
+ def failure_message
63
+ message(true)
64
+ end
65
+
66
+ def negative_failure_message
67
+ message(false)
68
+ end
69
+
70
+ def message(negate)
71
+ "Plyushkin:: Hoarded attribute #{@attr_name} #{negate ? "ignores" : "does not ignore"} unchanged values"
72
+ end
73
+ end
74
+
75
+ class CallbackMatcher
76
+ def initialize(attr_name, callback)
77
+ @attr_name, @callback = attr_name, callback
78
+ end
79
+
80
+ def match(subject)
81
+ callbacks = subject.class.plyushkin_model.callbacks[@attr_name]
82
+ callbacks && (callbacks[:after_create] == @callback)
83
+ end
84
+
85
+ def failure_message
86
+ message(true)
87
+ end
88
+
89
+ def negative_failure_message
90
+ message(false)
91
+ end
92
+
93
+ def message(negate)
94
+ "Plyushkin:: Hoarded attribute #{@attr_name} #{negate ? "does not callback" : "calls back"} #{@callback}"
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,30 @@
1
+ module Plyushkin::Test
2
+ class MatcherBase
3
+ def matchers
4
+ @matchers ||= []
5
+ end
6
+
7
+ def matches?(subject)
8
+ matchers.each do |m|
9
+ unless m.match(subject)
10
+ @failure_message = m.failure_message
11
+ @negative_failure_message = m.negative_failure_message
12
+ break
13
+ end
14
+ end
15
+ return @failure_message.nil?
16
+ end
17
+
18
+ def failure_message
19
+ @failure_message
20
+ end
21
+
22
+ def negative_failure_message
23
+ @negative_failure_message
24
+ end
25
+
26
+ def description
27
+ "Description not set"
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,15 @@
1
+ require_relative "matcher_base.rb"
2
+ require_relative "persisted_attribute_matcher.rb"
3
+ require_relative "hoarded_attribute_matcher.rb"
4
+
5
+ module Plyushkin::Test
6
+ module Matchers
7
+ def persist_attribute(name)
8
+ Plyushkin::Test::PersistedAttributeMatcher.new(name)
9
+ end
10
+
11
+ def hoard(attribute)
12
+ Plyushkin::Test::HoardedAttributeMatcher.new(attribute)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,37 @@
1
+ module Plyushkin::Test
2
+ class PersistedAttributeMatcher < Plyushkin::Test::MatcherBase
3
+ def initialize(attr_name)
4
+ @attr_name = attr_name
5
+ end
6
+
7
+ def with_format(formatter)
8
+ matchers << WithFormatMatcher.new(@attr_name, formatter)
9
+ self
10
+ end
11
+
12
+ def matches?(subject)
13
+ @failure_message = "Plyushkin: no persisted attribute with name '#{@attr_name}'" unless subject.class.persisted_attributes.include?(@attr_name)
14
+ @negative_failure_message = "Plyushkin: persisted attribute with name '#{@attr_name}' exists" unless subject.class.persisted_attributes.include?(@attr_name)
15
+ super
16
+ end
17
+
18
+ class WithFormatMatcher
19
+ def initialize(attr_name, formatter)
20
+ @attr_name, @formatter = attr_name, formatter
21
+ end
22
+
23
+ def match(subject)
24
+ subject.class.formatters[@attr_name] == @formatter
25
+ end
26
+
27
+ def failure_message
28
+ "Plyushkin: attribute #{@attr_name} is not formatting with #{@formatter}"
29
+ end
30
+
31
+ def negative_failure_message
32
+ "Plyushkin: attribute #{@attr_name} is formatting with #{@formatter}"
33
+ end
34
+ end
35
+ end
36
+ end
37
+
@@ -12,8 +12,18 @@ module Plyushkin::Test
12
12
  class Plyushkin::Test::Member < ActiveRecord::Base; end
13
13
  class Plyushkin::Test::WidgetOne < ActiveRecord::Base; hoards :apples; end
14
14
  class Plyushkin::Test::WidgetTwo < ActiveRecord::Base; hoards :beans; end
15
+ class Plyushkin::Test::IgnoresUnchangedWidget < ActiveRecord::Base
16
+ hoards :apples, :ignore_unchanged_values => true
17
+ hoards :beans
18
+ end
19
+
20
+ class Plyushkin::Test::CallbackWidget < ActiveRecord::Base
21
+ hoards :apples, :after_create => :core
22
+ hoards :beans
23
+ end
15
24
 
16
25
  class Plyushkin::Test::DateValue < Plyushkin::BaseValue
17
26
  persisted_attr :value, :formatter => :to_date
18
27
  end
28
+
19
29
  end
@@ -1,3 +1,3 @@
1
1
  module Plyushkin
2
- VERSION = "0.0.3"
2
+ VERSION = "0.0.4"
3
3
  end
@@ -19,6 +19,31 @@ describe Plyushkin::BaseValue do
19
19
  value.should_not be_valid
20
20
  value.errors.full_messages.should == ["Date cannot be in the future"]
21
21
  end
22
+
23
+ it 'should be valid if date is equal to now' do
24
+ Timecop.freeze(DateTime.now) do
25
+ Plyushkin::StringValue.new.should be_valid
26
+ end
27
+ end
28
+
29
+ it 'should be valid if date is equal to current' do
30
+ Timecop.freeze(DateTime.current) do
31
+ Plyushkin::StringValue.new.should be_valid
32
+ end
33
+ end
34
+
35
+ describe '#numericality' do
36
+ it 'should not be valid if not an integer' do
37
+ clazz = Class.new(Plyushkin::StringValue) do
38
+ validates :value, :numericality => true
39
+ end
40
+ clazz.stub(:name).and_return("Clazz")
41
+
42
+ c = clazz.new
43
+ c.value = 'abcd'
44
+ c.should_not be_valid
45
+ end
46
+ end
22
47
  end
23
48
 
24
49
  describe '##persisted_attr' do
@@ -78,6 +103,48 @@ describe Plyushkin::BaseValue do
78
103
  value.my_attr.should == 5
79
104
  value.my_attr2.should == 9999
80
105
  end
106
+ end
107
+
108
+ describe 'formatter methods' do
109
+ describe '#to_i' do
110
+ it 'should return the same value if it contains non-numeric characters' do
111
+ Plyushkin::BaseValue.new.to_i("abcd").should == "abcd"
112
+ end
113
+
114
+ it 'should return an integer if string is a number' do
115
+ Plyushkin::BaseValue.new.to_i("1234").should == 1234
116
+ end
117
+
118
+ it 'should return an integer if arg is an integer' do
119
+ Plyushkin::BaseValue.new.to_i(1234).should == 1234
120
+ end
121
+
122
+ it 'should return nil when arg is nil' do
123
+ Plyushkin::BaseValue.new.to_i(nil).should be_nil
124
+ end
125
+ end
126
+
127
+ describe '#to_f' do
128
+ it 'should return the same value if it contains non-numeric characters' do
129
+ Plyushkin::BaseValue.new.to_f("abcd").should == "abcd"
130
+ end
131
+
132
+ it 'should return a float if string is a number' do
133
+ Plyushkin::BaseValue.new.to_f("12.34").should == 12.34
134
+ end
135
+
136
+ it 'should return a float if arg is a float' do
137
+ Plyushkin::BaseValue.new.to_f(123.4).should == 123.4
138
+ end
139
+
140
+ it 'should return a float if arg is an integer' do
141
+ Plyushkin::BaseValue.new.to_f(455).should == 455.0
142
+ end
143
+
144
+ it 'should return nil when arg is nil' do
145
+ Plyushkin::BaseValue.new.to_f(nil).should be_nil
146
+ end
147
+ end
81
148
 
82
149
  describe '#to_date' do
83
150
  it 'format a json string to a date' do
@@ -87,6 +154,24 @@ describe Plyushkin::BaseValue do
87
154
  end
88
155
  end
89
156
 
157
+ describe '#to_bool' do
158
+ it 'should return true if string true is passed in' do
159
+ Plyushkin::BaseValue.new.to_bool("true").should be_true
160
+ end
161
+
162
+ it 'should return false if string false is passed in' do
163
+ Plyushkin::BaseValue.new.to_bool("false").should be_false
164
+ end
165
+
166
+ it 'should return nil if nil is passed in' do
167
+ Plyushkin::BaseValue.new.to_bool(nil).should be_nil
168
+ end
169
+
170
+ it 'should return the same value if it cannot covert to boolean' do
171
+ Plyushkin::BaseValue.new.to_bool('railsconf').should == 'railsconf'
172
+ end
173
+ end
174
+
90
175
  end
91
176
 
92
177
  describe '#equal_value' do
@@ -20,7 +20,7 @@ describe ActiveRecord::Base do
20
20
  hoards :geolocation, :type => Plyushkin::Test::CoordinateValue
21
21
  end
22
22
 
23
- clazz.plyushkin_model.registered_types[:login_date].should be_nil
23
+ clazz.plyushkin_model.registered_types[:login_date].should == Plyushkin::StringValue
24
24
  clazz.plyushkin_model.registered_types[:geolocation].should == Plyushkin::Test::CoordinateValue
25
25
  end
26
26
 
@@ -0,0 +1,10 @@
1
+ require 'spec_helper'
2
+
3
+ describe Plyushkin::Model do
4
+ describe '#initialize' do
5
+ it 'should raise an error if no service is provided' do
6
+ expect {Plyushkin::Model.new(nil, 'name', nil)}
7
+ .to raise_error(Plyushkin::Error, /Service cannot be nil/)
8
+ end
9
+ end
10
+ end
@@ -167,6 +167,19 @@ describe Plyushkin::Property do
167
167
  end
168
168
  end
169
169
 
170
+ describe '#nil?' do
171
+ it 'should be true if last value is NilValue' do
172
+ property = Plyushkin::Property.new(:property_name, :type => Plyushkin::Test::PresenceTestValue)
173
+ property.should be_nil
174
+ end
175
+
176
+ it 'should be false if last value is not a NilValue' do
177
+ property = Plyushkin::Property.new(:property_name, :type => Plyushkin::Test::PresenceTestValue)
178
+ property.create
179
+ property.should_not be_nil
180
+ end
181
+ end
182
+
170
183
  it '#insert_position' do
171
184
  property = Plyushkin::Property.new(:property_name)
172
185
  value1 = property.create(:value => 7, :date => DateTime.now - 7.days)
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ describe Plyushkin::Test::DateValue do
4
+ it { should persist_attribute(:value) }
5
+ it { should_not persist_attribute(:value2) }
6
+ it { should persist_attribute(:value).with_format(:to_date) }
7
+ it { should_not persist_attribute(:value).with_format(:to_datetime) }
8
+ end
9
+
10
+ describe Plyushkin::Test::WidgetOne do
11
+ it { should hoard(:apples) }
12
+ it { should hoard(:apples).of_type(Plyushkin::StringValue) }
13
+ it { should_not hoard(:beans) }
14
+ it { should_not hoard(:apples).of_type(Plyushkin::Test::DateValue) }
15
+ end
16
+
17
+ describe Plyushkin::Test::IgnoresUnchangedWidget do
18
+ it { should hoard(:apples).and_ignore_unchanged_values }
19
+ it {
20
+ should hoard(:beans)
21
+ should_not hoard(:beans).and_ignore_unchanged_values
22
+ }
23
+ end
24
+
25
+ describe Plyushkin::Test::CallbackWidget do
26
+ it { should hoard(:apples).of_type(Plyushkin::StringValue).and_after_create_call(:core) }
27
+ it { should hoard(:apples)
28
+ should_not hoard(:apples).and_after_create_call(:core2) }
29
+ it { should hoard(:beans)
30
+ should_not hoard(:beans).and_after_create_call(:core) }
31
+ end
data/spec/spec_helper.rb CHANGED
@@ -28,6 +28,7 @@ RSpec.configure do |config|
28
28
  # the seed, which is printed after each run.
29
29
  # --seed 1234
30
30
  config.order = 'random'
31
+ config.include Plyushkin::Test::Matchers
31
32
 
32
33
  config.after(:each) do
33
34
  Plyushkin::Cache.cache.clear
@@ -13,6 +13,12 @@ class CreateMembers < ActiveRecord::Migration
13
13
  create_table :widget_twos do |t|
14
14
  t.timestamps
15
15
  end
16
+ create_table :ignores_unchanged_widgets do |t|
17
+ t.timestamps
18
+ end
19
+ create_table :callback_widgets do |t|
20
+ t.timestamps
21
+ end
16
22
  end
17
23
  end
18
24
  CreateMembers.up
metadata CHANGED
@@ -1,8 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: plyushkin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
5
- prerelease:
4
+ version: 0.0.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - Craig Israel
@@ -10,12 +9,11 @@ authors:
10
9
  autorequire:
11
10
  bindir: bin
12
11
  cert_chain: []
13
- date: 2014-01-31 00:00:00.000000000 Z
12
+ date: 2014-02-28 00:00:00.000000000 Z
14
13
  dependencies:
15
14
  - !ruby/object:Gem::Dependency
16
15
  name: activerecord
17
16
  requirement: !ruby/object:Gem::Requirement
18
- none: false
19
17
  requirements:
20
18
  - - ~>
21
19
  - !ruby/object:Gem::Version
@@ -23,7 +21,6 @@ dependencies:
23
21
  type: :runtime
24
22
  prerelease: false
25
23
  version_requirements: !ruby/object:Gem::Requirement
26
- none: false
27
24
  requirements:
28
25
  - - ~>
29
26
  - !ruby/object:Gem::Version
@@ -31,7 +28,6 @@ dependencies:
31
28
  - !ruby/object:Gem::Dependency
32
29
  name: bundler
33
30
  requirement: !ruby/object:Gem::Requirement
34
- none: false
35
31
  requirements:
36
32
  - - ~>
37
33
  - !ruby/object:Gem::Version
@@ -39,7 +35,6 @@ dependencies:
39
35
  type: :development
40
36
  prerelease: false
41
37
  version_requirements: !ruby/object:Gem::Requirement
42
- none: false
43
38
  requirements:
44
39
  - - ~>
45
40
  - !ruby/object:Gem::Version
@@ -47,17 +42,15 @@ dependencies:
47
42
  - !ruby/object:Gem::Dependency
48
43
  name: rake
49
44
  requirement: !ruby/object:Gem::Requirement
50
- none: false
51
45
  requirements:
52
- - - ! '>='
46
+ - - '>='
53
47
  - !ruby/object:Gem::Version
54
48
  version: '0'
55
49
  type: :development
56
50
  prerelease: false
57
51
  version_requirements: !ruby/object:Gem::Requirement
58
- none: false
59
52
  requirements:
60
- - - ! '>='
53
+ - - '>='
61
54
  - !ruby/object:Gem::Version
62
55
  version: '0'
63
56
  description: Provides active record extension to capture historical property data
@@ -82,6 +75,7 @@ files:
82
75
  - lib/plyushkin/cache/stub.rb
83
76
  - lib/plyushkin/core_ext/active_record_base.rb
84
77
  - lib/plyushkin/core_ext/plyushkin_extensions.rb
78
+ - lib/plyushkin/error.rb
85
79
  - lib/plyushkin/model.rb
86
80
  - lib/plyushkin/nil_value.rb
87
81
  - lib/plyushkin/persistence.rb
@@ -91,6 +85,10 @@ files:
91
85
  - lib/plyushkin/service/web.rb
92
86
  - lib/plyushkin/string_value.rb
93
87
  - lib/plyushkin/test.rb
88
+ - lib/plyushkin/test/hoarded_attribute_matcher.rb
89
+ - lib/plyushkin/test/matcher_base.rb
90
+ - lib/plyushkin/test/matchers.rb
91
+ - lib/plyushkin/test/persisted_attribute_matcher.rb
94
92
  - lib/plyushkin/test/value_types.rb
95
93
  - lib/plyushkin/validators/presence.rb
96
94
  - lib/plyushkin/version.rb
@@ -98,48 +96,51 @@ files:
98
96
  - spec/lib/base_value_spec.rb
99
97
  - spec/lib/cache/stub_spec.rb
100
98
  - spec/lib/core_ext/active_record_base_spec.rb
99
+ - spec/lib/model_spec.rb
101
100
  - spec/lib/nil_value_spec.rb
102
101
  - spec/lib/persistence_spec.rb
103
102
  - spec/lib/property_spec.rb
104
103
  - spec/lib/service/stub_spec.rb
105
104
  - spec/lib/service/web_spec.rb
105
+ - spec/lib/test/matchers_spec.rb
106
106
  - spec/lib/value_spec.rb
107
107
  - spec/spec_helper.rb
108
108
  - spec/support/sqlite.rb
109
109
  homepage: http://github.com/OnlifeHealth/plyushkin
110
110
  licenses:
111
111
  - MIT
112
+ metadata: {}
112
113
  post_install_message:
113
114
  rdoc_options: []
114
115
  require_paths:
115
116
  - lib
116
117
  required_ruby_version: !ruby/object:Gem::Requirement
117
- none: false
118
118
  requirements:
119
- - - ! '>='
119
+ - - '>='
120
120
  - !ruby/object:Gem::Version
121
121
  version: '0'
122
122
  required_rubygems_version: !ruby/object:Gem::Requirement
123
- none: false
124
123
  requirements:
125
- - - ! '>='
124
+ - - '>='
126
125
  - !ruby/object:Gem::Version
127
126
  version: '0'
128
127
  requirements: []
129
128
  rubyforge_project:
130
- rubygems_version: 1.8.23
129
+ rubygems_version: 2.0.3
131
130
  signing_key:
132
- specification_version: 3
131
+ specification_version: 4
133
132
  summary: Plyushkin - the attribute hoarder
134
133
  test_files:
135
134
  - spec/lib/base_value_spec.rb
136
135
  - spec/lib/cache/stub_spec.rb
137
136
  - spec/lib/core_ext/active_record_base_spec.rb
137
+ - spec/lib/model_spec.rb
138
138
  - spec/lib/nil_value_spec.rb
139
139
  - spec/lib/persistence_spec.rb
140
140
  - spec/lib/property_spec.rb
141
141
  - spec/lib/service/stub_spec.rb
142
142
  - spec/lib/service/web_spec.rb
143
+ - spec/lib/test/matchers_spec.rb
143
144
  - spec/lib/value_spec.rb
144
145
  - spec/spec_helper.rb
145
146
  - spec/support/sqlite.rb