activerecord-typedstore 1.0.0.beta1 → 1.0.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 64a197e045ec0a6c19581176c6a62aaf1800ce77
4
- data.tar.gz: ffcf6bcc94d684da15ed877cf9bda5244934145d
3
+ metadata.gz: ed8f250e16de47101a01c8633fb6587e58626ee0
4
+ data.tar.gz: e5dd919d347fb854e5d03f8aac3786f334645a15
5
5
  SHA512:
6
- metadata.gz: ac1eca590e2d1e0daea3a72281219ae43d0ad47c1376bd5f155b1e66ef93e8a6cd3f0403d94d7a92de1791846b9b9df19cf1c017138eb37e767d1ad46dda2da5
7
- data.tar.gz: 99169aeeafe4c40c39357d16e8cf6dd54de65fa97a9213635a686d5afe0da1848b00735f55fd73c77b4bd8be165c2b949b287d76334a2a82200732800be36f25
6
+ metadata.gz: 5cce7b2e70c3abf6df76ca6007c3d21e072f38b34a1d281fda28bdb514d2eb30bad2e2e9564833c28e82e8232fe68a8af5389211e4ac28f63b549a2005baf13e
7
+ data.tar.gz: 3a6498ef57cd94fcf86120c59ce5f8d40a006c4740e30f90d8b25e8482fa1bcb59ce857e2258e2eb9938e2ec9b2362251f9a3657d1a85e0654d23004008224a0
@@ -6,6 +6,8 @@ module ActiveRecord::TypedStore
6
6
 
7
7
  def initialize(options)
8
8
  @coder = options.fetch(:coder) { default_coder }
9
+ @accessors = options[:accessors]
10
+ @accessors = [] if options[:accessors] == false
9
11
  @fields = {}
10
12
  yield self
11
13
  end
@@ -15,7 +17,7 @@ module ActiveRecord::TypedStore
15
17
  end
16
18
 
17
19
  def accessors
18
- @fields.values.select { |v| v.accessor }.map(&:name)
20
+ @accessors || @fields.values.select(&:accessor).map(&:name)
19
21
  end
20
22
 
21
23
  delegate :keys, to: :@fields
@@ -18,7 +18,7 @@ module ActiveRecord::TypedStore
18
18
 
19
19
  def typed_store(store_attribute, options={}, &block)
20
20
  dsl = DSL.new(options, &block)
21
- self.typed_stores = {}
21
+ self.typed_stores ||= {}
22
22
  self.typed_stores[store_attribute] = dsl
23
23
 
24
24
  typed_klass = TypedHash.create(dsl.fields.values)
@@ -1,5 +1,5 @@
1
1
  module ActiveRecord
2
2
  module TypedStore
3
- VERSION = '1.0.0.beta1'
3
+ VERSION = '1.0.0'
4
4
  end
5
5
  end
@@ -526,6 +526,16 @@ shared_examples 'a store' do |retain_type=true|
526
526
  stores = model.class.typed_stores
527
527
  expect(stores[:settings].keys).to eq [:no_default, :name, :email, :cell_phone, :public, :enabled, :age, :max_length, :rate, :price, :published_on, :remind_on, :published_at, :remind_at, :total_price, :shipping_cost, :grades, :tags, :nickname, :author, :source, :signup, :country]
528
528
  end
529
+
530
+ it "can access keys even when accessors are not defined" do
531
+ stores = model.class.typed_stores
532
+ expect(stores[:explicit_settings].keys).to eq [:ip_address, :user_agent, :signup]
533
+ end
534
+
535
+ it "can access keys even when accessors are partially defined" do
536
+ stores = model.class.typed_stores
537
+ expect(stores[:partial_settings].keys).to eq [:tax_rate_key, :tax_rate]
538
+ end
529
539
  end
530
540
 
531
541
  it 'does not include blank attribute' do
@@ -645,6 +655,43 @@ shared_examples 'a store' do |retain_type=true|
645
655
 
646
656
  end
647
657
 
658
+ describe 'with no accessors' do
659
+
660
+ it 'cannot be accessed as a model attribute' do
661
+ expect(model).not_to respond_to :ip_address
662
+ expect(model).not_to respond_to :ip_address=
663
+ end
664
+
665
+ it 'cannot be queried' do
666
+ expect(model).not_to respond_to :ip_address?
667
+ end
668
+
669
+ it 'cannot be reset' do
670
+ expect(model).not_to respond_to :reset_ip_address!
671
+ end
672
+
673
+ it 'does not have dirty accessors' do
674
+ expect(model).not_to respond_to :ip_address_was
675
+ end
676
+
677
+ it 'still has casting a default handling' do
678
+ expect(model.explicit_settings[:ip_address]).to be == '127.0.0.1'
679
+ end
680
+
681
+ end
682
+
683
+ describe 'with some accessors' do
684
+
685
+ it 'does not define an attribute' do
686
+ expect(model).not_to respond_to :tax_rate_key
687
+ end
688
+
689
+ it 'define an attribute when included in the accessors array' do
690
+ expect(model).to respond_to :tax_rate
691
+ end
692
+
693
+ end
694
+
648
695
  describe '`any` attributes' do
649
696
 
650
697
  it 'accept any type' do
@@ -666,6 +713,12 @@ shared_examples 'a store' do |retain_type=true|
666
713
  expect(model.settings[:signup][:counter]).to eq 123
667
714
  end
668
715
 
716
+ it 'works with default hash without affecting unaccessible attributes' do
717
+ model.signup[:counter] = 123
718
+ model.save!
719
+ expect(model.explicit_settings[:signup][:counter]).to be_nil
720
+ end
721
+
669
722
  end
670
723
  end
671
724
 
@@ -51,12 +51,29 @@ def define_columns(t)
51
51
  t.string :nickname, blank: false, default: 'Please enter your nickname'
52
52
  end
53
53
 
54
- def define_store_columns(t)
55
- define_columns(t)
56
- t.any :author
57
- t.any :source, blank: false, default: 'web'
58
- t.any :signup, default: {}
59
- t.string :country, blank: false, default: 'Canada', accessor: false
54
+ def define_store_with_no_attributes(**options)
55
+ typed_store :explicit_settings, accessors: false, **options do |t|
56
+ t.string :ip_address, default: '127.0.0.1'
57
+ t.string :user_agent
58
+ t.any :signup, default: {}
59
+ end
60
+ end
61
+
62
+ def define_store_with_partial_attributes(**options)
63
+ typed_store :partial_settings, accessors: [:tax_rate], **options do |t|
64
+ t.string :tax_rate_key
65
+ t.string :tax_rate
66
+ end
67
+ end
68
+
69
+ def define_store_with_attributes(**options)
70
+ typed_store :settings, **options do |t|
71
+ define_columns(t)
72
+ t.any :author
73
+ t.any :source, blank: false, default: 'web'
74
+ t.any :signup, default: {}
75
+ t.string :country, blank: false, default: 'Canada', accessor: false
76
+ end
60
77
  end
61
78
 
62
79
  class CreateAllTables < ActiveRecord::Migration
@@ -89,9 +106,9 @@ class CreateAllTables < ActiveRecord::Migration
89
106
 
90
107
  ActiveRecord::Base.establish_connection(:test_sqlite3)
91
108
  recreate_table(:sqlite3_regular_ar_models) { |t| define_columns(t); t.text :untyped_settings }
92
- recreate_table(:yaml_typed_store_models) { |t| t.text :settings; t.text :untyped_settings }
93
- recreate_table(:json_typed_store_models) { |t| t.text :settings; t.text :untyped_settings }
94
- recreate_table(:marshal_typed_store_models) { |t| t.text :settings; t.text :untyped_settings }
109
+ recreate_table(:yaml_typed_store_models) { |t| t.text :settings; t.text :explicit_settings; t.text :partial_settings; t.text :untyped_settings }
110
+ recreate_table(:json_typed_store_models) { |t| t.text :settings; t.text :explicit_settings; t.text :partial_settings; t.text :untyped_settings }
111
+ recreate_table(:marshal_typed_store_models) { |t| t.text :settings; t.text :explicit_settings; t.text :partial_settings; t.text :untyped_settings }
95
112
  end
96
113
  end
97
114
  ActiveRecord::Migration.verbose = true
@@ -147,9 +164,10 @@ if ENV['POSTGRES']
147
164
  class PostgresHstoreTypedStoreModel < ActiveRecord::Base
148
165
  establish_connection ENV['POSTGRES_URL'] || :test_postgresql
149
166
  store :untyped_settings, accessors: [:title]
150
- typed_store :settings, coder: ColumnCoder.new(AsJson) do |s|
151
- define_store_columns(s)
152
- end
167
+
168
+ define_store_with_attributes(coder: ColumnCoder.new(AsJson))
169
+ define_store_with_no_attributes(coder: ColumnCoder.new(AsJson))
170
+ define_store_with_partial_attributes(coder: ColumnCoder.new(AsJson))
153
171
  end
154
172
 
155
173
  if ENV['POSTGRES_JSON']
@@ -159,9 +177,10 @@ if ENV['POSTGRES']
159
177
  class PostgresJsonTypedStoreModel < ActiveRecord::Base
160
178
  establish_connection ENV['POSTGRES_URL'] || :test_postgresql
161
179
  store :untyped_settings, accessors: [:title]
162
- typed_store :settings, coder: false do |s|
163
- define_store_columns(s)
164
- end
180
+
181
+ define_store_with_attributes(coder: false)
182
+ define_store_with_no_attributes(coder: false)
183
+ define_store_with_partial_attributes(coder: false)
165
184
  end
166
185
 
167
186
  else
@@ -169,9 +188,10 @@ if ENV['POSTGRES']
169
188
  class PostgresJsonTypedStoreModel < ActiveRecord::Base
170
189
  establish_connection ENV['POSTGRES_URL'] || :test_postgresql
171
190
  store :untyped_settings, accessors: [:title]
172
- typed_store :settings, coder: ColumnCoder.new(AsJson) do |s|
173
- define_store_columns(s)
174
- end
191
+
192
+ define_store_with_attributes(coder: ColumnCoder.new(AsJson))
193
+ define_store_with_no_attributes(coder: ColumnCoder.new(AsJson))
194
+ define_store_with_partial_attributes(coder: ColumnCoder.new(AsJson))
175
195
  end
176
196
 
177
197
  end
@@ -189,17 +209,19 @@ end
189
209
  class YamlTypedStoreModel < ActiveRecord::Base
190
210
  establish_connection :test_sqlite3
191
211
  store :untyped_settings, accessors: [:title]
192
- typed_store :settings do |s|
193
- define_store_columns(s)
194
- end
212
+
213
+ define_store_with_attributes
214
+ define_store_with_no_attributes
215
+ define_store_with_partial_attributes
195
216
  end
196
217
 
197
218
  class JsonTypedStoreModel < ActiveRecord::Base
198
219
  establish_connection :test_sqlite3
199
220
  store :untyped_settings, accessors: [:title]
200
- typed_store :settings, coder: ColumnCoder.new(JSON) do |s|
201
- define_store_columns(s)
202
- end
221
+
222
+ define_store_with_attributes(coder: ColumnCoder.new(JSON))
223
+ define_store_with_no_attributes(coder: ColumnCoder.new(JSON))
224
+ define_store_with_partial_attributes(coder: ColumnCoder.new(JSON))
203
225
  end
204
226
 
205
227
  module MarshalCoder
@@ -219,9 +241,10 @@ end
219
241
  class MarshalTypedStoreModel < ActiveRecord::Base
220
242
  establish_connection :test_sqlite3
221
243
  store :untyped_settings, accessors: [:title]
222
- typed_store :settings, coder: ColumnCoder.new(MarshalCoder) do |s|
223
- define_store_columns(s)
224
- end
244
+
245
+ define_store_with_attributes(coder: ColumnCoder.new(MarshalCoder))
246
+ define_store_with_no_attributes(coder: ColumnCoder.new(MarshalCoder))
247
+ define_store_with_partial_attributes(coder: ColumnCoder.new(MarshalCoder))
225
248
  end
226
249
 
227
250
  Models = [
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: activerecord-typedstore
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0.beta1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-03-29 00:00:00.000000000 Z
11
+ date: 2016-06-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -190,12 +190,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
190
190
  version: '0'
191
191
  required_rubygems_version: !ruby/object:Gem::Requirement
192
192
  requirements:
193
- - - ">"
193
+ - - ">="
194
194
  - !ruby/object:Gem::Version
195
- version: 1.3.1
195
+ version: '0'
196
196
  requirements: []
197
197
  rubyforge_project:
198
- rubygems_version: 2.4.6
198
+ rubygems_version: 2.5.1
199
199
  signing_key:
200
200
  specification_version: 4
201
201
  summary: Add type casting and full method attributes support to RctiveRecord store