HornsAndHooves-moribus 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: de348b300137b8ce46c31b042de38e77a0880a5b
4
- data.tar.gz: 675265b328868a116411c59fe89f7f89e369fcdd
3
+ metadata.gz: ff0aab79e8583ad02f5eeea9b364f1675d893399
4
+ data.tar.gz: 2c299a91b8eb26c99a91896b01100dcd04626409
5
5
  SHA512:
6
- metadata.gz: 0cfa65026b301739a2cb71b0027160f26978b1212f66df68d8dd681815a5e472a0f3a59d737a9e59a8c74cf9df77892093f4e16c32b0b58678880acc04bf3149
7
- data.tar.gz: 862712050f65298176c83c3191582b38574d10cdc12025574c8309c3056b9ca472bd1ed93892563037b51ca61ad8a0169cb7be876d9c96a8e6a0ebefb73028c1
6
+ metadata.gz: c66b62b01b54222d549dbd8e038d3b073cf850a9f394450dcde325bf32d644e796ce234720c53cbebd1c0f8cd156a5479571b5d59021798fc5b48f1a5ecdbbe8
7
+ data.tar.gz: 86c8695bd44971914bc00f5f60fd72a1a697a1625810cafd9575b2287ee3e2112b74b0c51e92411868609e5f3e3d48dba35e2bf81c032216efbf40fd9f1d2a16
data/.simplecov CHANGED
@@ -12,7 +12,7 @@ SimpleCov.start do
12
12
  # Fail the build when coverage is weak:
13
13
  at_exit do
14
14
  SimpleCov.result.format!
15
- threshold, actual = 98.475, SimpleCov.result.covered_percent
15
+ threshold, actual = 97.118, SimpleCov.result.covered_percent
16
16
  if actual < threshold
17
17
  msg = "\nLow coverage: "
18
18
  msg << red("#{actual}%")
data/Gemfile CHANGED
@@ -3,10 +3,14 @@ source "https://rubygems.org"
3
3
  # Specify your gem's dependencies in moribus.gemspec
4
4
  gemspec
5
5
 
6
+ group :development, :test do
7
+ gem "pry"
8
+ gem "pry-nav"
9
+ end
10
+
6
11
  group :development do
7
12
  gem "redcarpet"
8
13
  gem "yard"
9
- gem "pry"
10
14
  end
11
15
 
12
16
  group :test do
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
20
20
  s.require_paths = ["lib"]
21
21
 
22
22
  # specify any dependencies here; for example:
23
- s.add_dependency "rails", "~> 4.0.5"
23
+ s.add_dependency "rails", "> 4.0", "< 4.2"
24
24
  s.add_dependency "power_enum", ">= 2.7.0"
25
25
  s.add_dependency "yard", ">= 0"
26
26
 
@@ -19,11 +19,17 @@ module Moribus
19
19
 
20
20
  # Class methods for ActiveRecord::Base
21
21
  module ClassMethods
22
- # Aliases association reflection in reflections hash and
23
- # association-specific methods. See module description for example
22
+ # Aliases association reflection in ActiveRecord's (internal) reflections hash and
23
+ # association-specific methods. See module description for example.
24
24
  def alias_association(alias_name, association_name)
25
25
  if reflection = reflect_on_association(association_name)
26
- reflections[alias_name] = reflections[association_name]
26
+ # Use Rails 4.1.x+ behavior, if available:
27
+ if ActiveRecord::Reflection.respond_to? :add_reflection then
28
+ ActiveRecord::Reflection.add_reflection self, alias_name, reflection
29
+ else
30
+ # Rails 4.0.x behavior:
31
+ reflections[alias_name] = reflection
32
+ end
27
33
  alias_association_methods(alias_name, reflection)
28
34
  reflection
29
35
  end
@@ -92,6 +92,8 @@ module Moribus
92
92
  end
93
93
 
94
94
  reflection = has_one(name, scope, options)
95
+ # Rails 4.1 compatibility fix:
96
+ reflection = reflection[name] if reflection.respond_to? :[]
95
97
  reflection.options[:is_current] = true
96
98
  accepts_nested_attributes_for name
97
99
  define_effective_reader_for name
@@ -106,6 +108,8 @@ module Moribus
106
108
  # Extensions::HasAggregatedExtension)
107
109
  def has_aggregated(name, options = {})
108
110
  reflection = belongs_to(name, options)
111
+ # Rails 4.1 compatibility fix:
112
+ reflection = reflection[name] if reflection.respond_to? :[]
109
113
  reflection.options[:aggregated] = true
110
114
  accepts_nested_attributes_for name
111
115
  define_effective_reader_for name
@@ -77,13 +77,15 @@ module Moribus
77
77
 
78
78
  # Generate SQL statement to be used to update 'is_current' state of record to false.
79
79
  def current_to_false_sql_statement
80
- klass = self.class
81
- lock_col = klass.locking_column
82
- lock_value = respond_to?(lock_col) && send(lock_col).to_i
83
- "UPDATE #{klass.quoted_table_name} SET \"is_current\" = #{klass.quote_value(false)} ".tap do |sql|
84
- sql << ", #{klass.quoted_locking_column} = #{klass.quote_value(lock_value + 1)} " if lock_value
85
- sql << "WHERE #{klass.quoted_primary_key} = #{klass.quote_value(@_before_to_new_record_values[:id])} "
86
- sql << "AND #{klass.quoted_locking_column} = #{klass.quote_value(lock_value)}" if lock_value
80
+ klass = self.class
81
+ is_current_col = klass.columns.detect{|c| c.name == "is_current" }
82
+ lock_col = klass.locking_column
83
+ lock_value = respond_to?(lock_col) && send(lock_col).to_i
84
+ quoted_lock_col = klass.connection.quote_column_name(lock_col)
85
+ "UPDATE #{klass.quoted_table_name} SET \"is_current\" = #{klass.quote_value(false, is_current_col)} ".tap do |sql|
86
+ sql << ", #{quoted_lock_col} = #{klass.quote_value(lock_value + 1, lock_col)} " if lock_value
87
+ sql << "WHERE #{klass.quoted_primary_key} = #{klass.quote_value(@_before_to_new_record_values[:id], "id")} "
88
+ sql << "AND #{quoted_lock_col} = #{klass.quote_value(lock_value, lock_col)}" if lock_value
87
89
  end
88
90
  end
89
91
  private :current_to_false_sql_statement
@@ -1,3 +1,3 @@
1
1
  module Moribus # :nodoc:
2
- VERSION = "0.1.0" # :nodoc:
3
- end
2
+ VERSION = "0.2.0" # :nodoc:
3
+ end
@@ -38,51 +38,51 @@ describe Moribus::AliasAssociation do
38
38
 
39
39
  describe "reflection aliasing" do
40
40
  it "alias association name in reflections" do
41
- SpecPost.reflect_on_association(:author).should_not be_nil
41
+ expect(SpecPost.reflect_on_association(:author)).not_to be_nil
42
42
  end
43
43
 
44
44
  it "should not raise error when using aliased name in scopes" do
45
45
  expect{
46
46
  SpecPost.includes(:comments).first
47
- }.to_not raise_error
47
+ }.not_to raise_error
48
48
  end
49
49
  end
50
50
 
51
51
  describe "association accessor alias methods" do
52
52
  subject{ @post }
53
53
 
54
- it{ should respond_to :author }
55
- it{ should respond_to :author= }
56
- it{ should respond_to :comments }
57
- it{ should respond_to :comments= }
58
- it{ should respond_to :post_info }
59
- it{ should respond_to :post_info= }
54
+ it{ is_expected.to respond_to :author }
55
+ it{ is_expected.to respond_to :author= }
56
+ it{ is_expected.to respond_to :comments }
57
+ it{ is_expected.to respond_to :comments= }
58
+ it{ is_expected.to respond_to :post_info }
59
+ it{ is_expected.to respond_to :post_info= }
60
60
  end
61
61
 
62
62
  describe "singular association alias method" do
63
63
  subject{ @post }
64
64
 
65
- it{ should respond_to :build_author }
66
- it{ should respond_to :create_author }
67
- it{ should respond_to :create_author! }
65
+ it{ is_expected.to respond_to :build_author }
66
+ it{ is_expected.to respond_to :create_author }
67
+ it{ is_expected.to respond_to :create_author! }
68
68
 
69
- it{ should respond_to :build_post_info }
70
- it{ should respond_to :create_post_info }
71
- it{ should respond_to :create_post_info! }
69
+ it{ is_expected.to respond_to :build_post_info }
70
+ it{ is_expected.to respond_to :create_post_info }
71
+ it{ is_expected.to respond_to :create_post_info! }
72
72
  end
73
73
 
74
74
  describe "collection association alias method" do
75
75
  subject{ @post }
76
76
 
77
- it{ should respond_to :comment_ids }
78
- it{ should respond_to :comment_ids= }
77
+ it{ is_expected.to respond_to :comment_ids }
78
+ it{ is_expected.to respond_to :comment_ids= }
79
79
  end
80
80
 
81
81
  describe ":alias => alias_name shortcuts" do
82
82
  subject{ @post }
83
83
 
84
- it { should respond_to :creator }
85
- it { should respond_to :remarks }
86
- it { should respond_to :information }
84
+ it { is_expected.to respond_to :creator }
85
+ it { is_expected.to respond_to :remarks }
86
+ it { is_expected.to respond_to :information }
87
87
  end
88
88
  end
@@ -102,9 +102,9 @@ describe Moribus do
102
102
  }.not_to change(SpecCustomerInfo, :count)
103
103
  end
104
104
  expect(@info.new_record?).to eq false
105
- @info.id.should == old_id
106
- @info.updated_at.should == old_updated_at
107
- @info.created_at.should == old_created_at
105
+ expect(@info.id ).to eq old_id
106
+ expect(@info.updated_at ).to eq old_updated_at
107
+ expect(@info.created_at ).to eq old_created_at
108
108
  end
109
109
  end
110
110
 
@@ -140,7 +140,7 @@ describe Moribus do
140
140
  it "should lookup self and replace id with existing on create" do
141
141
  name = SpecPersonName.new :first_name => 'John', :last_name => 'Smith'
142
142
  name.save
143
- name.id.should == @existing.id
143
+ expect(name.id).to eq @existing.id
144
144
  end
145
145
 
146
146
  it "should create a new record if lookup fails" do
@@ -152,7 +152,7 @@ describe Moribus do
152
152
  it "should lookup self and replace id with existing on update" do
153
153
  name = SpecPersonName.create :first_name => 'Alice', :last_name => 'Smith'
154
154
  name.update_attributes :first_name => 'John'
155
- name.id.should == @existing.id
155
+ expect(name.id).to eq @existing.id
156
156
  end
157
157
 
158
158
  context "with caching" do
@@ -164,7 +164,7 @@ describe Moribus do
164
164
  it "should lookup the existing value and add it to the cache" do
165
165
  feature = SpecCustomerFeature.new :feature_name => @existing.feature_name
166
166
  expect{ feature.save }.to change(SpecCustomerFeature.aggregated_records_cache, :length).by(1)
167
- feature.id.should == @existing.id
167
+ expect(feature.id).to eq @existing.id
168
168
  end
169
169
 
170
170
  it "should add the freshly-created record to the cache" do
@@ -173,12 +173,12 @@ describe Moribus do
173
173
 
174
174
  it "should freeze the cached object" do
175
175
  feature = SpecCustomerFeature.create(:feature_name => 'Cancelled')
176
- SpecCustomerFeature.aggregated_records_cache[feature.feature_name].should be_frozen
176
+ expect(SpecCustomerFeature.aggregated_records_cache[feature.feature_name]).to be_frozen
177
177
  end
178
178
 
179
179
  it "should cache the clone of the record, not the record itself" do
180
180
  feature = SpecCustomerFeature.create(:feature_name => 'Returned')
181
- SpecCustomerFeature.aggregated_records_cache[feature.feature_name].object_id.should_not == feature.object_id
181
+ expect(SpecCustomerFeature.aggregated_records_cache[feature.feature_name].object_id).not_to eq feature.object_id
182
182
  end
183
183
  end
184
184
  end
@@ -198,7 +198,7 @@ describe Moribus do
198
198
  it "should replace itself with new id" do
199
199
  old_id = @info.id
200
200
  @info.update_attributes(:spec_person_name_id => 2)
201
- @info.id.should_not == old_id
201
+ expect(@info.id).not_to eq old_id
202
202
  end
203
203
 
204
204
  it "should set is_current record to false for superseded record" do
@@ -210,14 +210,14 @@ describe Moribus do
210
210
  it "should set previous_id to the id of the previous record" do
211
211
  old_id = @info.id
212
212
  @info.update_attributes(:spec_person_name_id => 2)
213
- @info.previous_id.should == old_id
213
+ expect(@info.previous_id).to eq old_id
214
214
  end
215
215
 
216
216
  it "assigning a new current record should change is_current to false for previous one" do
217
217
  new_info = SpecCustomerInfo.new :spec_person_name_id => 2, :is_current => true
218
218
  @customer.spec_customer_info = new_info
219
- new_info.spec_customer_id.should == @customer.id
220
- expect(@info.is_current).to eq false
219
+ expect(new_info.spec_customer_id).to eq @customer.id
220
+ expect(@info.is_current ).to eq false
221
221
  end
222
222
 
223
223
  it "should not crash on superseding with 'is_current' conditional constraint" do
@@ -234,14 +234,14 @@ describe Moribus do
234
234
 
235
235
  it "should be updated on change" do
236
236
  info = @customer.create_spec_customer_info :spec_person_name_id => 1
237
- info.updated_at.should == first_time
238
- info.created_at.should == first_time
237
+ expect(info.updated_at).to eq first_time
238
+ expect(info.created_at).to eq first_time
239
239
 
240
240
  Timecop.freeze(second_time)
241
241
  info.spec_person_name_id = 2
242
242
  info.save!
243
- info.updated_at.should == second_time
244
- info.created_at.should == second_time
243
+ expect(info.updated_at).to eq second_time
244
+ expect(info.created_at).to eq second_time
245
245
  end
246
246
  end
247
247
 
@@ -274,8 +274,8 @@ describe Moribus do
274
274
  old_id = @info.id
275
275
  @customer.spec_customer_info.spec_person_name.first_name = 'Alice'
276
276
  expect{ @customer.save }.to change(@info, :spec_person_name_id)
277
- @info.id.should_not == old_id
278
- @info.is_current.should == true
277
+ expect(@info.id).not_to eq old_id
278
+ expect(@info.is_current).to eq true
279
279
  expect(SpecCustomerInfo.find(old_id).is_current).to eq false
280
280
  end
281
281
  end
@@ -290,39 +290,39 @@ describe Moribus do
290
290
  end
291
291
 
292
292
  it "should have delegated column information" do
293
- @customer.column_for_attribute(:first_name).should_not be_nil
293
+ expect(@customer.column_for_attribute(:first_name)).not_to be_nil
294
294
  end
295
295
 
296
296
  it "should not delegate special methods" do
297
- @customer.should_not respond_to(:reset_first_name)
298
- @customer.should_not respond_to(:first_name_was)
299
- @customer.should_not respond_to(:first_name_before_type_cast)
300
- @customer.should_not respond_to(:first_name_will_change!)
301
- @customer.should_not respond_to(:first_name_changed?)
302
- @customer.should_not respond_to(:lock_version)
297
+ expect(@customer).not_to respond_to(:reset_first_name)
298
+ expect(@customer).not_to respond_to(:first_name_was)
299
+ expect(@customer).not_to respond_to(:first_name_before_type_cast)
300
+ expect(@customer).not_to respond_to(:first_name_will_change!)
301
+ expect(@customer).not_to respond_to(:first_name_changed?)
302
+ expect(@customer).not_to respond_to(:lock_version)
303
303
  end
304
304
 
305
305
  it "should delegate methods to aggregated parts" do
306
- @info.should respond_to(:first_name)
307
- @info.should respond_to(:first_name=)
308
- @info.should respond_to(:spec_suffix)
309
- @info.last_name.should == 'Smith'
306
+ expect(@info).to respond_to(:first_name)
307
+ expect(@info).to respond_to(:first_name=)
308
+ expect(@info).to respond_to(:spec_suffix)
309
+ expect(@info.last_name).to eq 'Smith'
310
310
  end
311
311
 
312
312
  it "should delegate methods to representation" do
313
- @customer.should respond_to(:first_name)
314
- @customer.should respond_to(:first_name=)
315
- @customer.should respond_to(:spec_suffix)
316
- @customer.last_name.should == 'Smith'
317
- @customer.should respond_to(:custom_field)
318
- @customer.should respond_to(:custom_field=)
313
+ expect(@customer).to respond_to(:first_name)
314
+ expect(@customer).to respond_to(:first_name=)
315
+ expect(@customer).to respond_to(:spec_suffix)
316
+ expect(@customer.last_name).to eq 'Smith'
317
+ expect(@customer).to respond_to(:custom_field)
318
+ expect(@customer).to respond_to(:custom_field=)
319
319
  end
320
320
 
321
321
  it 'should properly delegate enumerated attributes' do
322
- @customer.should respond_to(:spec_type)
323
- @customer.should respond_to(:spec_type=)
322
+ expect(@customer).to respond_to(:spec_type)
323
+ expect(@customer).to respond_to(:spec_type=)
324
324
  @customer.spec_type = :important
325
- @customer.spec_type.should === :important
325
+ expect(@customer.spec_type === :important).to eq true
326
326
  end
327
327
 
328
328
  it "should raise NoMethodError if unknown method received" do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: HornsAndHooves-moribus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - HornsAndHooves
@@ -10,22 +10,28 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2014-09-29 00:00:00.000000000 Z
13
+ date: 2015-01-20 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rails
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  requirements:
19
- - - "~>"
19
+ - - ">"
20
20
  - !ruby/object:Gem::Version
21
- version: 4.0.5
21
+ version: '4.0'
22
+ - - "<"
23
+ - !ruby/object:Gem::Version
24
+ version: '4.2'
22
25
  type: :runtime
23
26
  prerelease: false
24
27
  version_requirements: !ruby/object:Gem::Requirement
25
28
  requirements:
26
- - - "~>"
29
+ - - ">"
30
+ - !ruby/object:Gem::Version
31
+ version: '4.0'
32
+ - - "<"
27
33
  - !ruby/object:Gem::Version
28
- version: 4.0.5
34
+ version: '4.2'
29
35
  - !ruby/object:Gem::Dependency
30
36
  name: power_enum
31
37
  requirement: !ruby/object:Gem::Requirement