active_type 0.4.0 → 0.4.1

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: af57ff59af07cfdb0a8576c733da8aa2d0e254ce
4
- data.tar.gz: e1e04618118baf2b5260e20ed3685d695930e756
3
+ metadata.gz: 873fb9515c20f974ad20b3cd2b8f4fd787aa9649
4
+ data.tar.gz: 9fd4f0f639d4189fcd82778d94a63315733376a8
5
5
  SHA512:
6
- metadata.gz: 91477402f2df135aa9a2bef4a3b63f51c113be820940f83c350230af27b76dcc3c16d587c11874bd64320e1115f68b8fb25c7904e9d6579e3313853fddb8ad08
7
- data.tar.gz: 7f9fa15fc5ed489c5bee1350f07b97852e32732017c4bb0535d53f4e3fb36c928f20bb9b44dcb5ab6f1ebce5cb892a60e3c382e5e92044e38ef51c823409fb7b
6
+ metadata.gz: f6f51d7a8632c8701c5a1dc100aeadd769c0e646774533b3b4c459139eaa81a6144fca448d242c9da75dbb5968f1e2ef8a8eda034836a8b942ff6eb567bd0d2e
7
+ data.tar.gz: 1a581ee2b4c8dbab6f9d3be522f7a256b877dff9c1a98e7bef1ef294e4a154d48cbd09acc790425d73aa4844865b8902e90d82c520da6638094da1a58d7ba81e
data/.travis.yml CHANGED
@@ -9,8 +9,8 @@ gemfile:
9
9
  - gemfiles/Gemfile.3.2
10
10
  - gemfiles/Gemfile.4.0
11
11
  - gemfiles/Gemfile.4.1
12
- - gemfiles/Gemfile.4.2
13
- - gemfiles/Gemfile.4.2.pg
12
+ - gemfiles/Gemfile.4.2.1
13
+ - gemfiles/Gemfile.4.2.1.pg
14
14
  before_script:
15
15
  - psql -c 'create database active_type_test;' -U postgres
16
16
  script: bundle exec rspec spec
@@ -27,17 +27,19 @@ matrix:
27
27
  - rvm: "1.8.7"
28
28
  gemfile: gemfiles/Gemfile.4.1
29
29
  - rvm: "1.8.7"
30
- gemfile: gemfiles/Gemfile.4.2
30
+ gemfile: gemfiles/Gemfile.4.2.1
31
31
  - rvm: "1.8.7"
32
- gemfile: gemfiles/Gemfile.4.2.pg
32
+ gemfile: gemfiles/Gemfile.4.2.1.pg
33
33
  - rvm: "1.9.3"
34
- gemfile: gemfiles/Gemfile.4.2.pg
34
+ gemfile: gemfiles/Gemfile.4.2.1.pg
35
35
  - rvm: "2.0.0"
36
- gemfile: gemfiles/Gemfile.4.2.pg
36
+ gemfile: gemfiles/Gemfile.4.2.1.pg
37
+
37
38
  - rvm: "2.1.2"
38
39
  gemfile: gemfiles/Gemfile.3.2
39
40
  - rvm: "2.1.2"
40
41
  gemfile: gemfiles/Gemfile.4.0
42
+
41
43
  - rvm: "2.2.0"
42
44
  gemfile: gemfiles/Gemfile.3.2
43
45
  - rvm: "2.2.0"
data/CHANGELOG.md ADDED
@@ -0,0 +1,49 @@
1
+ # ActiveType Change Log
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ActiveType is in a pre-1.0 state. This means that its APIs and behavior are subject to breaking changes without deprecation notices. Until 1.0, version numbers will follow a [Semver][]-ish `0.y.z` format, where `y` is incremented when new features or breaking changes are introduced, and `z` is incremented for lesser changes or bug fixes.
6
+
7
+ ## [Unreleased]
8
+
9
+ * Your contribution here!
10
+
11
+ ## [0.4.0][] (2015-06-12)
12
+
13
+ * Add ActiveType.cast to cast ActiveRecord instances and relations to extended models
14
+
15
+ ## [0.3.5][] (2015-06-11)
16
+
17
+ * Make gem crash during loading with ActiveRecord 4.2.0 because [#31](https://github.com/makandra/active_type/issues/31)
18
+
19
+ ## [0.3.4][] (2015-03-14)
20
+
21
+ * Support belongs_to associations for ActiveRecord 4.2.1
22
+ * Ensure that ActiveType::Object correctly validates boolean attributes (issue [#34](https://github.com/makandra/active_type/issues/34))
23
+
24
+ ## [0.3.3][] (2015-01-23)
25
+
26
+ * Don't crash for database types without casting rules (fixes [#25](https://github.com/makandra/active_type/issues/25))
27
+
28
+ ## [0.3.2][] (2015-01-22)
29
+
30
+ * Making the gem to work with Rails version 4.0.0
31
+ * Use native database type for type casting in pg
32
+
33
+ ## [0.3.1][] (2014-11-19)
34
+
35
+ * Support nested attributes in extended records (fixes [#17](https://github.com/makandra/active_type/issues/17))
36
+
37
+ ## [0.3.0][] (2014-09-23)
38
+
39
+ * Add support for Rails 4.2beta
40
+
41
+ [Semver]: http://semver.org
42
+ [Unreleased]: https://github.com/makandra/active_type/compare/v0.4.0...HEAD
43
+ [0.4.0]: https://github.com/makandra/active_type/compare/v0.3.5...v0.4.0
44
+ [0.3.5]: https://github.com/makandra/active_type/compare/v0.3.4...v0.3.5
45
+ [0.3.4]: https://github.com/makandra/active_type/compare/v0.3.3...v0.3.4
46
+ [0.3.3]: https://github.com/makandra/active_type/compare/v0.3.2...v0.3.3
47
+ [0.3.2]: https://github.com/makandra/active_type/compare/v0.3.1...v0.3.2
48
+ [0.3.1]: https://github.com/makandra/active_type/compare/v0.3.0...v0.3.1
49
+ [0.3.0]: https://github.com/makandra/active_type/compare/v0.2.1...v0.3.0
data/README.md CHANGED
@@ -271,8 +271,8 @@ Supported options for `nests_many` / `nests_one` are:
271
271
  ```
272
272
 
273
273
 
274
- Casting
275
- -------
274
+ Casting records or relations
275
+ ----------------------------
276
276
 
277
277
  When working with ActiveType you will often find it useful to cast an ActiveRecord instance to its extended `ActiveType::Record` variant.
278
278
 
@@ -288,7 +288,7 @@ class SignUp < ActiveType::Record[User]
288
288
  end
289
289
 
290
290
  user = User.find(1)
291
- sign_up = ActiveType.cast(SignUp)
291
+ sign_up = ActiveType.cast(user, SignUp)
292
292
  sign_up.is_a?(SignUp) # => true
293
293
  ```
294
294
 
data/Rakefile CHANGED
@@ -4,7 +4,6 @@ require 'bundler/gem_tasks'
4
4
  desc 'Default: Run all specs.'
5
5
  task :default => 'all:spec'
6
6
 
7
-
8
7
  namespace :all do
9
8
 
10
9
  desc "Run specs on all versions"
data/gemfiles/Gemfile.3.2 CHANGED
@@ -5,3 +5,4 @@ gem 'rspec', '<2.99'
5
5
  gem 'sqlite3'
6
6
 
7
7
  gem 'active_type', :path => '..'
8
+ gem 'i18n', '=0.6.11' # 0.7 no longer builds for Ruby 1.8.7
@@ -21,7 +21,7 @@ GEM
21
21
  arel (3.0.3)
22
22
  builder (3.0.4)
23
23
  diff-lcs (1.2.5)
24
- i18n (0.7.0)
24
+ i18n (0.6.11)
25
25
  multi_json (1.11.1)
26
26
  rspec (2.14.1)
27
27
  rspec-core (~> 2.14.0)
@@ -40,5 +40,6 @@ PLATFORMS
40
40
  DEPENDENCIES
41
41
  active_type!
42
42
  activerecord (~> 3.2.0)
43
+ i18n (= 0.6.11)
43
44
  rspec (< 2.99)
44
45
  sqlite3
@@ -1,3 +1,3 @@
1
1
  module ActiveType
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
@@ -40,6 +40,8 @@ module ActiveType
40
40
  add_virtual_column(name, type, options)
41
41
  build_reader(name)
42
42
  build_writer(name)
43
+ build_value_was_method(name)
44
+ build_value_changed_method(name)
43
45
  end
44
46
 
45
47
  private
@@ -70,6 +72,22 @@ module ActiveType
70
72
  BODY
71
73
  end
72
74
 
75
+ def build_value_was_method(name)
76
+ @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
77
+ def #{name}_was
78
+ nil
79
+ end
80
+ BODY
81
+ end
82
+
83
+ def build_value_changed_method(name)
84
+ @module.module_eval <<-BODY, __FILE__, __LINE__ + 1
85
+ def #{name}_changed?
86
+ not #{name}.nil?
87
+ end
88
+ BODY
89
+ end
90
+
73
91
  def validate_attribute_name!(name)
74
92
  unless name.to_s =~ /\A[A-z0-9_]*\z/
75
93
  raise InvalidAttributeNameError.new("'#{name}' is not a valid name for a virtual attribute")
@@ -315,6 +315,10 @@ describe ActiveType::Object do
315
315
  it_should_behave_like "a class supporting dup for attributes", ActiveType::Object
316
316
  end
317
317
 
318
+ describe 'dirty tracking' do
319
+ it_should_behave_like 'a class supporting dirty tracking for virtual attributes', ActiveType::Object
320
+ end
321
+
318
322
  describe '#belongs_to' do
319
323
  subject { ObjectSpec::ObjectWithBelongsTo.new }
320
324
 
@@ -199,6 +199,10 @@ describe ActiveType::Record do
199
199
  it_should_behave_like "a class supporting dup for attributes", RecordSpec::Record
200
200
  end
201
201
 
202
+ describe 'dirty tracking' do
203
+ it_should_behave_like 'a class supporting dirty tracking for virtual attributes', RecordSpec::Record
204
+ end
205
+
202
206
  describe 'persistence' do
203
207
 
204
208
  it 'persists to the database' do
@@ -39,8 +39,8 @@ describe ActiveType::Util do
39
39
  describe 'for a relation' do
40
40
 
41
41
  it 'casts a scope to a scope of another class' do
42
- record = UtilSpec::BaseRecord.create!(persisted_string: 'foo')
43
- base_scope = UtilSpec::BaseRecord.where(persisted_string: 'foo')
42
+ record = UtilSpec::BaseRecord.create!(:persisted_string => 'foo')
43
+ base_scope = UtilSpec::BaseRecord.where(:persisted_string => 'foo')
44
44
  casted_scope = ActiveType::Util.cast(base_scope, UtilSpec::ExtendedRecord)
45
45
  casted_scope.build.should be_a(UtilSpec::ExtendedRecord)
46
46
  found_record = casted_scope.find(record.id)
@@ -49,9 +49,9 @@ describe ActiveType::Util do
49
49
  end
50
50
 
51
51
  it 'preserves existing scope conditions' do
52
- match = UtilSpec::BaseRecord.create!(persisted_string: 'foo')
53
- no_match = UtilSpec::BaseRecord.create!(persisted_string: 'bar')
54
- base_scope = UtilSpec::BaseRecord.where(persisted_string: 'foo')
52
+ match = UtilSpec::BaseRecord.create!(:persisted_string => 'foo')
53
+ no_match = UtilSpec::BaseRecord.create!(:persisted_string => 'bar')
54
+ base_scope = UtilSpec::BaseRecord.where(:persisted_string => 'foo')
55
55
  casted_scope = ActiveType::Util.cast(base_scope, UtilSpec::ExtendedRecord)
56
56
  casted_match = UtilSpec::ExtendedRecord.find(match.id)
57
57
  casted_scope.to_a.should == [casted_match]
@@ -62,7 +62,7 @@ describe ActiveType::Util do
62
62
  describe 'for a record type' do
63
63
 
64
64
  it 'casts a base record to an extended record' do
65
- base_record = UtilSpec::BaseRecord.create!(persisted_string: 'foo')
65
+ base_record = UtilSpec::BaseRecord.create!(:persisted_string => 'foo')
66
66
  extended_record = ActiveType::Util.cast(base_record, UtilSpec::ExtendedRecord)
67
67
  extended_record.should be_a(UtilSpec::ExtendedRecord)
68
68
  extended_record.should be_persisted
@@ -72,7 +72,7 @@ describe ActiveType::Util do
72
72
  end
73
73
 
74
74
  it 'casts an extended record to a base record' do
75
- extended_record = UtilSpec::ExtendedRecord.create!(persisted_string: 'foo')
75
+ extended_record = UtilSpec::ExtendedRecord.create!(:persisted_string => 'foo')
76
76
  base_record = ActiveType::Util.cast(extended_record, UtilSpec::BaseRecord)
77
77
  base_record.should be_a(UtilSpec::BaseRecord)
78
78
  base_record.should be_persisted
@@ -82,33 +82,33 @@ describe ActiveType::Util do
82
82
  end
83
83
 
84
84
  it 'calls after_initialize callbacks of the cast target' do
85
- base_record = UtilSpec::BaseRecord.create!(persisted_string: 'foo')
85
+ base_record = UtilSpec::BaseRecord.create!(:persisted_string => 'foo')
86
86
  extended_record = ActiveType::Util.cast(base_record, UtilSpec::ExtendedRecord)
87
87
  extended_record.virtual_string.should be_present
88
88
  end
89
89
 
90
90
  it 'lets after_initialize callbacks access attributes (bug in ActiveRecord#becomes)' do
91
- base_record = UtilSpec::BaseRecord.create!(persisted_string: 'foo')
91
+ base_record = UtilSpec::BaseRecord.create!(:persisted_string => 'foo')
92
92
  extended_record = ActiveType::Util.cast(base_record, UtilSpec::ExtendedRecord)
93
93
  extended_record.virtual_string.should == 'persisted_string is foo'
94
94
  end
95
95
 
96
96
  it 'preserves the #type of an STI record that is casted to an ExtendedRecord' do
97
- child_record = UtilSpec::Child.create!(persisted_string: 'foo')
97
+ child_record = UtilSpec::Child.create!(:persisted_string => 'foo')
98
98
  extended_child_record = ActiveType::Util.cast(child_record, UtilSpec::ExtendedChild)
99
99
  extended_child_record.should be_a(UtilSpec::ExtendedChild)
100
100
  extended_child_record.type.should == 'UtilSpec::Child'
101
101
  end
102
102
 
103
103
  it 'changes the #type of an STI record when casted to another type in the hierarchy' do
104
- child_record = UtilSpec::Child.create!(persisted_string: 'foo')
104
+ child_record = UtilSpec::Child.create!(:persisted_string => 'foo')
105
105
  child_sibling_record = ActiveType::Util.cast(child_record, UtilSpec::ChildSibling)
106
106
  child_sibling_record.should be_a(UtilSpec::ChildSibling)
107
107
  child_sibling_record.type.should == 'UtilSpec::Child'
108
108
  end
109
109
 
110
110
  it 'preserves dirty tracking flags' do
111
- base_record = UtilSpec::BaseRecord.create!(persisted_string: 'foo')
111
+ base_record = UtilSpec::BaseRecord.create!(:persisted_string => 'foo')
112
112
  base_record.changes.should == {}
113
113
  base_record.persisted_string = 'bar'
114
114
  base_record.changes.should == { 'persisted_string' => ['foo', 'bar'] }
@@ -0,0 +1,31 @@
1
+ shared_examples_for "a class supporting dirty tracking for virtual attributes" do |klass|
2
+
3
+ subject do
4
+ Class.new(klass) do
5
+ attribute :virtual_attribute
6
+ end.new
7
+ end
8
+
9
+ describe '#virtual_attribute_was' do
10
+
11
+ it 'always returns nil, since there can be no previously saved value' do
12
+ subject.virtual_attribute_was.should be_nil
13
+ end
14
+
15
+ end
16
+
17
+ describe '#virtual_attribute_changed?' do
18
+
19
+ it 'returns true if the attribute is not nil' do
20
+ subject.virtual_attribute = 'foo'
21
+ subject.virtual_attribute_changed?.should be_true
22
+ end
23
+
24
+ it 'returns false if the attribute is nil' do
25
+ subject.virtual_attribute = nil
26
+ subject.virtual_attribute_changed?.should be_false
27
+ end
28
+
29
+ end
30
+
31
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_type
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Tobias Kraze
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2015-06-12 00:00:00.000000000 Z
12
+ date: 2015-09-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler
@@ -62,6 +62,7 @@ files:
62
62
  - ".gitignore"
63
63
  - ".ruby-version"
64
64
  - ".travis.yml"
65
+ - CHANGELOG.md
65
66
  - LICENSE
66
67
  - README.md
67
68
  - Rakefile
@@ -106,6 +107,7 @@ files:
106
107
  - spec/shared_examples/coercible_columns.rb
107
108
  - spec/shared_examples/constructor.rb
108
109
  - spec/shared_examples/defaults.rb
110
+ - spec/shared_examples/dirty_tracking.rb
109
111
  - spec/shared_examples/dupable.rb
110
112
  - spec/shared_examples/mass_assignment.rb
111
113
  - spec/spec_helper.rb
@@ -134,7 +136,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
134
136
  version: '0'
135
137
  requirements: []
136
138
  rubyforge_project:
137
- rubygems_version: 2.2.2
139
+ rubygems_version: 2.4.8
138
140
  signing_key:
139
141
  specification_version: 4
140
142
  summary: Make any Ruby object quack like ActiveRecord
@@ -154,6 +156,7 @@ test_files:
154
156
  - spec/shared_examples/coercible_columns.rb
155
157
  - spec/shared_examples/constructor.rb
156
158
  - spec/shared_examples/defaults.rb
159
+ - spec/shared_examples/dirty_tracking.rb
157
160
  - spec/shared_examples/dupable.rb
158
161
  - spec/shared_examples/mass_assignment.rb
159
162
  - spec/spec_helper.rb