property_sets 3.5.6 → 3.7.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
  SHA256:
3
- metadata.gz: b451948a4cd57b5387dcd5cd4869b07d0fca6b6107cc9a9ee3ca8cfdd63af8cd
4
- data.tar.gz: d40876f744ec7d356173ec010f197e3252986bfc80679fbe9212ab847b15fe73
3
+ metadata.gz: '08caa288aeb6e948f670a9d93176e7899952b3a62df76493e33918de4c4e52ab'
4
+ data.tar.gz: d46e8b42e761deb230eebaa3ee64e8b24115c82c9913fb3927a97cacc8ebcb50
5
5
  SHA512:
6
- metadata.gz: bc88f6195a44c5da452f19652cfa0ca5c2e59c315ebc95933182c286d03553779f0f8a8bd3fbe5d11ce7a27d0dc3702619dc2c5662556b874604cccb7635c202
7
- data.tar.gz: db1a33e34e8ba06d0a0db052b0fb08fafd6d644acfbbb13fcada92471f7a2cae90801855cc815608b99471dbf65e68ece98c0bc4fca20ff18b2f0dac1195c184
6
+ metadata.gz: 574137f6c3004b8eca710df7784a7089f0a76791ea6afcb059ca6a9ae0d7c7495c3b452934cebdc43b40c2b60f5726495707b4990efc728172ae3dfa2fd7e838
7
+ data.tar.gz: 5e366367388d47381ce6566916a1a59588142daeb3523c1c479ad2657d476bf08f4725a2d8fa2e41d354b1eb69ada4c26bb9165a0b80b871a709afd0d96e606b
@@ -6,6 +6,8 @@ module PropertySets
6
6
  module ActiveRecordExtension
7
7
  module ClassMethods
8
8
 
9
+ RAILS6 = ActiveRecord::VERSION::MAJOR >= 6
10
+
9
11
  def property_set(association, options = {}, &block)
10
12
  unless include?(PropertySets::ActiveRecordExtension::InstanceMethods)
11
13
  self.send(:prepend, PropertySets::ActiveRecordExtension::InstanceMethods)
@@ -14,51 +16,83 @@ module PropertySets
14
16
  end
15
17
 
16
18
  raise "Invalid association name, letters only" unless association.to_s =~ /[a-z]+/
19
+ exists = property_set_index.include?(association)
20
+
17
21
  self.property_set_index << association
18
22
 
23
+ # eg AccountSetting - this IS idempotent
19
24
  property_class = PropertySets.ensure_property_set_class(
20
25
  association,
21
26
  options.delete(:owner_class_name) || self.name
22
27
  )
23
- property_class.instance_eval(&block)
24
-
25
- hash_opts = {:class_name => property_class.name, :autosave => true, :dependent => :destroy}.merge(options)
26
-
27
- silence_warnings do
28
- has_many association, hash_opts do
29
- include PropertySets::ActiveRecordExtension::AssociationExtensions
30
-
31
- property_class.keys.each do |key|
32
- raise "Invalid property key #{key}" if self.respond_to?(key)
33
-
34
- # Reports the coerced truth value of the property
35
- define_method "#{key}?" do
36
- type = property_class.type(key)
37
- value = lookup_value(type, key)
38
- ![ "false", "0", "", "off", "n" ].member?(value.to_s.downcase)
39
- end
40
-
41
- # Returns the value of the property
42
- define_method "#{key}" do
43
- type = property_class.type(key)
44
- lookup_value(type, key)
45
- end
46
-
47
- # Assigns a new value to the property
48
- define_method "#{key}=" do |value|
49
- instance = lookup(key)
50
- instance.value = PropertySets::Casting.write(property_class.type(key), value)
51
- instance.value
52
- end
53
-
54
- define_method "#{key}_record" do
55
- lookup(key)
56
- end
28
+
29
+ # eg property :is_awesome
30
+ property_class.instance_eval(&block) if block
31
+
32
+ tb_name = options.delete :table_name
33
+ property_class.table_name = tb_name if tb_name
34
+
35
+ hash_opts = {
36
+ :class_name => property_class.name,
37
+ :autosave => true,
38
+ :dependent => :destroy,
39
+ :inverse_of => self.name.underscore.to_sym,
40
+ }.merge(options)
41
+
42
+ # TODO: should check options are compatible? warn? raise?
43
+ reflection = self.reflections[association.to_s] # => ActiveRecord::Reflection::HasManyReflection
44
+ reflection.options.merge! options if reflection && !options.empty?
45
+
46
+ unless exists then # makes has_many idempotent...
47
+ has_many association, **hash_opts do
48
+ # keep this damn block! -- creates association_module below
49
+ end
50
+ end
51
+
52
+ # eg 5: AccountSettingsAssociationExtension
53
+ # eg 6: Account::SettingsAssociationExtension
54
+
55
+ # stolen/adapted from AR's collection_association.rb #define_extensions
56
+
57
+ module_name = "#{association.to_s.camelize}AssociationExtension"
58
+ module_name = name.demodulize + module_name unless RAILS6
59
+
60
+ target = RAILS6 ? self : self.parent
61
+ association_module = target.const_get module_name
62
+
63
+ association_module.module_eval do
64
+ include PropertySets::ActiveRecordExtension::AssociationExtensions
65
+
66
+ property_class.keys.each do |key|
67
+ raise "Invalid property key #{key}" if self.respond_to?(key)
68
+
69
+ # Reports the coerced truth value of the property
70
+ define_method "#{key}?" do
71
+ type = property_class.type(key)
72
+ value = lookup_value(type, key)
73
+ ![ "false", "0", "", "off", "n" ].member?(value.to_s.downcase)
57
74
  end
58
75
 
59
- define_method :property_serialized? do |key|
60
- property_class.type(key) == :serialized
76
+ # Returns the value of the property
77
+ define_method "#{key}" do
78
+ type = property_class.type(key)
79
+ lookup_value(type, key)
61
80
  end
81
+
82
+ # Assigns a new value to the property
83
+ define_method "#{key}=" do |value|
84
+ instance = lookup(key)
85
+ instance.value = PropertySets::Casting.write(property_class.type(key), value)
86
+ instance.value
87
+ end
88
+
89
+ define_method "#{key}_record" do
90
+ lookup(key)
91
+ end
92
+ end
93
+
94
+ define_method :property_serialized? do |key|
95
+ property_class.type(key) == :serialized
62
96
  end
63
97
  end
64
98
  end
@@ -108,13 +108,16 @@ module PropertySets
108
108
  base.attr_accessible :name, :value if defined?(ProtectedAttributes)
109
109
  end
110
110
 
111
- def property(key, options = nil)
111
+ def properties
112
112
  @properties ||= HashWithIndifferentAccess.new
113
- @properties[key] = options
113
+ end
114
+
115
+ def property(key, options = nil)
116
+ properties[key] = options
114
117
  end
115
118
 
116
119
  def keys
117
- @properties.keys
120
+ properties.keys
118
121
  end
119
122
 
120
123
  def default(key)
@@ -122,15 +125,15 @@ module PropertySets
122
125
  end
123
126
 
124
127
  def raw_default(key)
125
- @properties[key].try(:[], :default)
128
+ properties[key].try(:[], :default)
126
129
  end
127
130
 
128
131
  def type(key)
129
- @properties[key].try(:[], :type) || :string
132
+ properties[key].try(:[], :type) || :string
130
133
  end
131
134
 
132
135
  def protected?(key)
133
- @properties[key].try(:[], :protected) || false
136
+ properties[key].try(:[], :protected) || false
134
137
  end
135
138
 
136
139
  def owner_class=(owner_class_name)
@@ -1,3 +1,3 @@
1
1
  module PropertySets
2
- VERSION = "3.5.6"
2
+ VERSION = "3.7.1"
3
3
  end
data/lib/property_sets.rb CHANGED
@@ -10,16 +10,19 @@ end
10
10
  module PropertySets
11
11
  def self.ensure_property_set_class(association, owner_class_name)
12
12
  const_name = "#{owner_class_name}#{association.to_s.singularize.camelcase}".to_sym
13
+
13
14
  unless Object.const_defined?(const_name)
14
- property_class = Object.const_set(const_name, Class.new(ActiveRecord::Base))
15
- property_class.class_eval do
15
+ property_class = Class.new(ActiveRecord::Base) do
16
16
  include PropertySets::PropertySetModel::InstanceMethods
17
17
  extend PropertySets::PropertySetModel::ClassMethods
18
18
  end
19
19
 
20
+ Object.const_set(const_name, property_class)
21
+
20
22
  property_class.owner_class = owner_class_name
21
23
  property_class.owner_assoc = association
22
24
  end
25
+
23
26
  Object.const_get(const_name)
24
27
  end
25
28
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: property_sets
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.5.6
4
+ version: 3.7.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Morten Primdahl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-29 00:00:00.000000000 Z
11
+ date: 2022-04-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -19,7 +19,7 @@ dependencies:
19
19
  version: '4.2'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
- version: '6.1'
22
+ version: '6.2'
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -29,7 +29,7 @@ dependencies:
29
29
  version: '4.2'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
- version: '6.1'
32
+ version: '6.2'
33
33
  - !ruby/object:Gem::Dependency
34
34
  name: json
35
35
  requirement: !ruby/object:Gem::Requirement
@@ -100,20 +100,6 @@ dependencies:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
- - !ruby/object:Gem::Dependency
104
- name: wwtd
105
- requirement: !ruby/object:Gem::Requirement
106
- requirements:
107
- - - ">="
108
- - !ruby/object:Gem::Version
109
- version: 0.5.3
110
- type: :development
111
- prerelease: false
112
- version_requirements: !ruby/object:Gem::Requirement
113
- requirements:
114
- - - ">="
115
- - !ruby/object:Gem::Version
116
- version: 0.5.3
117
103
  - !ruby/object:Gem::Dependency
118
104
  name: byebug
119
105
  requirement: !ruby/object:Gem::Requirement
@@ -161,7 +147,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
161
147
  - !ruby/object:Gem::Version
162
148
  version: '0'
163
149
  requirements: []
164
- rubygems_version: 3.0.3
150
+ rubygems_version: 3.1.6
165
151
  signing_key:
166
152
  specification_version: 4
167
153
  summary: Property sets for ActiveRecord.