property_sets 3.9.0 → 3.11.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
  SHA256:
3
- metadata.gz: da83a6695b48bf923b2971cc108ad9ab636c9b6f66e50d631f1973601d454bf5
4
- data.tar.gz: c4415b9eecc381a94af2bfbcfbe3a9837e4576526648b91a05fb05bc51241207
3
+ metadata.gz: 2384aedb2c9f673a4895f5a6e1948ae4ea88c335b2c79985a0c35609ebbce42e
4
+ data.tar.gz: dedff61be818879d70d720f3d7bfc545e0b73abeecaf57f678be2dc10a64d5e9
5
5
  SHA512:
6
- metadata.gz: 89ebdbcb3d8123601c60d4aacee7c4f33b10da3eaafc9406d53457aa941742bcf5348516a9105bf3716196b00e42c9917fa3f2beb4ef5cc88cf4f1aeec58909c
7
- data.tar.gz: 5a0c62442a970bb6eb5e43a94b701671306febe920b513bdefcd98c8213884ae29f3a02af9fcaffe5c71fb20517d5bb65a7ae17119929bce9668203c34ace4f9
6
+ metadata.gz: 9487f344c48e602edd77c4c36f9e5a4932db43cdc543efc68450d56a1fa433bcade00f1f88ac98ff452e4919865295fdbb9cb4e204ff7edd243ef16a46a28e13
7
+ data.tar.gz: a0223c6d67884a49a5165f5db027e02077d83bf094e563595f8e83d3c95c055312d46ec4b036da08c60c55e3e7f90a22b3265a940ff47f2aee4e650e9cb811a3
@@ -1,4 +1,4 @@
1
- require 'action_view'
1
+ require "action_view"
2
2
 
3
3
  module ActionView
4
4
  module Helpers
@@ -8,9 +8,9 @@ module ActionView
8
8
 
9
9
  def initialize(property_set, template, object_name, object)
10
10
  @property_set = property_set
11
- @template = template
12
- @object_name = object_name
13
- @object = object
11
+ @template = template
12
+ @object_name = object_name
13
+ @object = object
14
14
  end
15
15
 
16
16
  def check_box(property, options = {}, checked_value = "1", unchecked_value = "0")
@@ -23,7 +23,7 @@ module ActionView
23
23
  def radio_button(property, checked_value = "1", options = {})
24
24
  options[:id] ||= "#{object_name}_#{property_set}_#{property}_#{checked_value}"
25
25
  options = prepare_options(property, options) do |properties|
26
- properties.send("#{property}") == checked_value
26
+ properties.send(property.to_s) == checked_value
27
27
  end
28
28
  template.radio_button(object_name, property, checked_value, options)
29
29
  end
@@ -34,7 +34,7 @@ module ActionView
34
34
 
35
35
  def hidden_field(property, options = {})
36
36
  options = prepare_id_name(property, options)
37
- unless options.keys.include?(:value)
37
+ unless options.key?(:value)
38
38
  options[:value] = cast_boolean(options[:object].send(property_set).send(property))
39
39
  end
40
40
  template.hidden_field(object_name, property, options)
@@ -43,7 +43,7 @@ module ActionView
43
43
  def select(property, choices, options = {}, html_options = {})
44
44
  options = prepare_id_name(property, options)
45
45
  current_value = options[:object].send(property_set).send(property)
46
- template.select("#{object_name}[#{property_set}]", property, choices, { :selected => current_value }, html_options )
46
+ template.select("#{object_name}[#{property_set}]", property, choices, {selected: current_value}, html_options)
47
47
  end
48
48
 
49
49
  private
@@ -52,9 +52,9 @@ module ActionView
52
52
  throw "Invalid options type #{options.inspect}" unless options.is_a?(Hash)
53
53
 
54
54
  options.clone.tap do |prepared_options|
55
- prepared_options[:object] = object || fetch_target_object
56
- prepared_options[:id] ||= "#{object_name}_#{property_set}_#{property}"
57
- prepared_options[:name] = "#{object_name}[#{property_set}][#{property}]"
55
+ prepared_options[:object] = object || fetch_target_object
56
+ prepared_options[:id] ||= "#{object_name}_#{property_set}_#{property}"
57
+ prepared_options[:name] = "#{object_name}[#{property_set}][#{property}]"
58
58
  end
59
59
  end
60
60
 
@@ -75,18 +75,16 @@ module ActionView
75
75
 
76
76
  def cast_boolean(value)
77
77
  case value
78
- when TrueClass then '1'
79
- when FalseClass then '0'
78
+ when TrueClass then "1"
79
+ when FalseClass then "0"
80
80
  else value
81
81
  end
82
82
  end
83
-
84
83
  end
85
84
 
86
85
  def property_set(identifier)
87
86
  PropertySetFormBuilderProxy.new(identifier, @template, object_name, object)
88
87
  end
89
-
90
88
  end
91
89
  end
92
90
  end
@@ -1,29 +1,27 @@
1
- require 'active_record'
2
- require 'property_sets/casting'
3
- require 'set'
1
+ require "active_record"
2
+ require "property_sets/casting"
4
3
 
5
4
  module PropertySets
6
5
  module ActiveRecordExtension
7
6
  module ClassMethods
8
-
9
- RAILS6 = ActiveRecord::VERSION::MAJOR >= 6
7
+ attr_accessor :property_sets_connection_class
10
8
 
11
9
  def property_set(association, options = {}, &block)
12
10
  unless include?(PropertySets::ActiveRecordExtension::InstanceMethods)
13
- self.send(:prepend, PropertySets::ActiveRecordExtension::InstanceMethods)
11
+ send(:prepend, PropertySets::ActiveRecordExtension::InstanceMethods)
14
12
  cattr_accessor :property_set_index
15
13
  self.property_set_index = Set.new
16
14
  end
17
15
 
18
- raise "Invalid association name, letters only" unless association.to_s =~ /[a-z]+/
16
+ raise "Invalid association name, letters only" unless /[a-z]+/.match?(association.to_s)
19
17
  exists = property_set_index.include?(association)
20
18
 
21
- self.property_set_index << association
19
+ property_set_index << association
22
20
 
23
21
  # eg AccountSetting - this IS idempotent
24
22
  property_class = PropertySets.ensure_property_set_class(
25
23
  association,
26
- options.delete(:owner_class_name) || self.name
24
+ options.delete(:owner_class_name) || name
27
25
  )
28
26
 
29
27
  # eg property :is_awesome
@@ -33,48 +31,42 @@ module PropertySets
33
31
  property_class.table_name = tb_name if tb_name
34
32
 
35
33
  hash_opts = {
36
- :class_name => property_class.name,
37
- :autosave => true,
38
- :dependent => :destroy,
39
- :inverse_of => self.name.demodulize.underscore.to_sym,
34
+ class_name: property_class.name,
35
+ autosave: true,
36
+ dependent: :destroy,
37
+ inverse_of: name.demodulize.underscore.to_sym
40
38
  }.merge(options)
41
39
 
42
40
  # TODO: should check options are compatible? warn? raise?
43
- reflection = self.reflections[association.to_s] # => ActiveRecord::Reflection::HasManyReflection
41
+ reflection = reflections[association.to_s] # => ActiveRecord::Reflection::HasManyReflection
44
42
  reflection.options.merge! options if reflection && !options.empty?
45
43
 
46
- unless exists then # makes has_many idempotent...
44
+ unless exists # makes has_many idempotent...
47
45
  has_many association, **hash_opts do
48
46
  # keep this damn block! -- creates association_module below
49
47
  end
50
48
  end
51
49
 
52
- # eg 5: AccountSettingsAssociationExtension
53
- # eg 6: Account::SettingsAssociationExtension
54
-
55
50
  # stolen/adapted from AR's collection_association.rb #define_extensions
56
51
 
57
52
  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
53
+ association_module = const_get module_name
62
54
 
63
55
  association_module.module_eval do
64
56
  include PropertySets::ActiveRecordExtension::AssociationExtensions
65
57
 
66
58
  property_class.keys.each do |key|
67
- raise "Invalid property key #{key}" if self.respond_to?(key)
59
+ raise "Invalid property key #{key}" if respond_to?(key)
68
60
 
69
61
  # Reports the coerced truth value of the property
70
62
  define_method "#{key}?" do
71
- type = property_class.type(key)
63
+ type = property_class.type(key)
72
64
  value = lookup_value(type, key)
73
- ![ "false", "0", "", "off", "n" ].member?(value.to_s.downcase)
65
+ !["false", "0", "", "off", "n"].member?(value.to_s.downcase)
74
66
  end
75
67
 
76
68
  # Returns the value of the property
77
- define_method "#{key}" do
69
+ define_method key.to_s do
78
70
  type = property_class.type(key)
79
71
  lookup_value(type, key)
80
72
  end
@@ -107,10 +99,10 @@ module PropertySets
107
99
  association_class.keys & keys.map(&:to_s)
108
100
  end
109
101
 
110
- property_pairs = property_keys.map do |name|
102
+ property_pairs = property_keys.flat_map do |name|
111
103
  value = lookup_value(association_class.type(name), name)
112
104
  [name, value]
113
- end.flatten(1)
105
+ end
114
106
  HashWithIndifferentAccess[*property_pairs]
115
107
  end
116
108
 
@@ -147,7 +139,7 @@ module PropertySets
147
139
  end
148
140
 
149
141
  def build_default(arg)
150
- build(:name => arg.to_s, :value => association_class.raw_default(arg))
142
+ build(name: arg.to_s, value: association_class.raw_default(arg))
151
143
  end
152
144
 
153
145
  def lookup_without_default(arg)
@@ -157,7 +149,7 @@ module PropertySets
157
149
  def lookup_value(type, key)
158
150
  serialized = property_serialized?(key)
159
151
 
160
- if instance = lookup_without_default(key)
152
+ if (instance = lookup_without_default(key))
161
153
  instance.value_serialized = serialized
162
154
  PropertySets::Casting.read(type, instance.value)
163
155
  else
@@ -172,7 +164,7 @@ module PropertySets
172
164
 
173
165
  # The finder method which returns the property if present, otherwise a new instance with defaults
174
166
  def lookup(arg)
175
- instance = lookup_without_default(arg)
167
+ instance = lookup_without_default(arg)
176
168
  instance ||= build_default(arg)
177
169
  instance.value_serialized = property_serialized?(arg)
178
170
 
@@ -186,7 +178,7 @@ module PropertySets
186
178
  # It does not have the side effect of adding a new setting object.
187
179
  def lookup_or_default(arg)
188
180
  instance = lookup_without_default(arg)
189
- instance ||= association_class.new(:value => association_class.raw_default(arg))
181
+ instance ||= association_class.new(value: association_class.raw_default(arg))
190
182
  instance.value_serialized = property_serialized?(arg)
191
183
  instance
192
184
  end
@@ -201,18 +193,18 @@ module PropertySets
201
193
  update_property_set_attributes(attributes)
202
194
  super
203
195
  end
204
- alias update_attributes update
196
+ alias_method :update_attributes, :update
205
197
 
206
198
  def update!(attributes)
207
199
  update_property_set_attributes(attributes)
208
200
  super
209
201
  end
210
- alias update_attributes! update!
202
+ alias_method :update_attributes!, :update!
211
203
 
212
204
  def update_property_set_attributes(attributes)
213
205
  if attributes && self.class.property_set_index.any?
214
206
  self.class.property_set_index.each do |property_set|
215
- if property_set_hash = attributes.delete(property_set)
207
+ if (property_set_hash = attributes.delete(property_set))
216
208
  send(property_set).set(property_set_hash, true)
217
209
  end
218
210
  end
@@ -221,7 +213,7 @@ module PropertySets
221
213
 
222
214
  def update_columns(attributes)
223
215
  if delegated_property_sets?
224
- attributes = attributes.reject{|k,_| self.class.delegated_property_set_attributes.include?(k.to_s) }
216
+ attributes = attributes.reject { |k, _| self.class.delegated_property_set_attributes.include?(k.to_s) }
225
217
  end
226
218
 
227
219
  super attributes
@@ -248,7 +240,6 @@ module PropertySets
248
240
  attribute_names
249
241
  end
250
242
  end
251
-
252
243
  end
253
244
  end
254
245
 
@@ -1,8 +1,8 @@
1
- require 'json'
1
+ require "json"
2
2
 
3
3
  module PropertySets
4
4
  module Casting
5
- FALSE = [ "false", "0", "", "off", "n" ]
5
+ FALSE_VALUES = ["false", "0", "", "off", "n"]
6
6
 
7
7
  class << self
8
8
  def read(type, value)
@@ -53,7 +53,7 @@ module PropertySets
53
53
  private
54
54
 
55
55
  def false?(value)
56
- FALSE.include?(value.to_s.downcase)
56
+ FALSE_VALUES.include?(value.to_s.downcase)
57
57
  end
58
58
  end
59
59
  end
@@ -27,11 +27,7 @@ module PropertySets
27
27
 
28
28
  mappings.each do |old_attr, new_attr|
29
29
  self.delegated_property_set_attributes << old_attr.to_s
30
- if ActiveRecord.version < Gem::Version.new("5.0")
31
- attribute old_attr, ActiveRecord::Type::Value.new
32
- else
33
- attribute old_attr, ActiveModel::Type::Value.new
34
- end
30
+ attribute old_attr, ActiveModel::Type::Value.new
35
31
  define_method(old_attr) {
36
32
  association = send(setname)
37
33
  type = association.association_class.type(new_attr)
@@ -44,7 +40,7 @@ module PropertySets
44
40
  send("#{old_attr}_will_change!")
45
41
  end
46
42
  send(setname).send("#{new_attr}=", value)
47
- super(value) if defined?(super) # Rails 4 does not define this
43
+ super(value)
48
44
  end
49
45
 
50
46
  define_method("#{old_attr}_will_change!") do
@@ -69,7 +65,7 @@ module PropertySets
69
65
  # These are not database columns and should not be included in queries but
70
66
  # using the attributes API is the only way to track changes in the main model
71
67
  if respond_to?(:user_provided_columns)
72
- self.user_provided_columns.reject!{|k,_| delegated_property_set_attributes.include?(k.to_s) }
68
+ user_provided_columns.reject! { |k, _| delegated_property_set_attributes.include?(k.to_s) }
73
69
  end
74
70
  end
75
71
  end
@@ -1,22 +1,22 @@
1
- require 'active_support'
1
+ require "active_support"
2
2
 
3
3
  module PropertySets
4
4
  module PropertySetModel
5
5
  # https://dev.mysql.com/doc/refman/5.6/en/storage-requirements.html
6
6
  COLUMN_TYPE_LIMITS = {
7
- 'tinyblob' => 255, # 2^8 - 1
8
- 'tinytext' => 255,
9
- 'blob' => 65535, # 2^16 - 1
10
- 'text' => 65535,
11
- 'mediumblob' => 16777215, # 2^24 - 1
12
- 'mediumtext' => 16777215,
13
- 'longblob' => 4294967295, # 2^32 - 1
14
- 'longtext' => 4294967295,
7
+ "tinyblob" => 255, # 2^8 - 1
8
+ "tinytext" => 255,
9
+ "blob" => 65535, # 2^16 - 1
10
+ "text" => 65535,
11
+ "mediumblob" => 16777215, # 2^24 - 1
12
+ "mediumtext" => 16777215,
13
+ "longblob" => 4294967295, # 2^32 - 1
14
+ "longtext" => 4294967295
15
15
  }.freeze
16
16
 
17
17
  module InstanceMethods
18
18
  def false?
19
- [ "false", "0", "", "off", "n" ].member?(value.to_s.downcase)
19
+ ["false", "0", "", "off", "n"].member?(value.to_s.downcase)
20
20
  end
21
21
 
22
22
  def true?
@@ -93,7 +93,7 @@ module PropertySets
93
93
  end
94
94
 
95
95
  def value_column_limit
96
- column = self.class.columns_hash.fetch('value')
96
+ column = self.class.columns_hash.fetch("value")
97
97
 
98
98
  # use sql_type because type returns :text for all text types regardless of length
99
99
  column.limit || COLUMN_TYPE_LIMITS.fetch(column.sql_type)
@@ -102,9 +102,9 @@ module PropertySets
102
102
 
103
103
  module ClassMethods
104
104
  def self.extended(base)
105
- base.validate :validate_format_of_name
106
- base.validate :validate_length_of_serialized_data
107
- base.before_create :coerce_value
105
+ base.validate :validate_format_of_name
106
+ base.validate :validate_length_of_serialized_data
107
+ base.before_create :coerce_value
108
108
  base.attr_accessible :name, :value if defined?(ProtectedAttributes)
109
109
  end
110
110
 
@@ -139,10 +139,10 @@ module PropertySets
139
139
  def owner_class=(owner_class_name)
140
140
  @owner_class_sym = owner_class_name.to_s.demodulize.underscore.to_sym
141
141
 
142
- belongs_to owner_class_sym, class_name: owner_class_name
143
- validates_presence_of owner_class_sym, class_name: owner_class_name
144
- validates_uniqueness_of :name, :scope => owner_class_key_sym, :case_sensitive => false
145
- attr_accessible owner_class_key_sym, owner_class_sym if defined?(ProtectedAttributes)
142
+ belongs_to owner_class_sym, class_name: owner_class_name
143
+ validates_presence_of owner_class_sym, class_name: owner_class_name
144
+ validates_uniqueness_of :name, scope: owner_class_key_sym, case_sensitive: false
145
+ attr_accessible owner_class_key_sym, owner_class_sym if defined?(ProtectedAttributes)
146
146
  end
147
147
 
148
148
  def owner_assoc=(association)
@@ -161,6 +161,5 @@ module PropertySets
161
161
  "#{owner_class_sym}_id".to_sym
162
162
  end
163
163
  end
164
-
165
164
  end
166
165
  end
@@ -1,3 +1,3 @@
1
1
  module PropertySets
2
- VERSION = "3.9.0"
2
+ VERSION = "3.11.0"
3
3
  end
data/lib/property_sets.rb CHANGED
@@ -1,21 +1,25 @@
1
- require 'property_sets/property_set_model'
2
- require 'property_sets/active_record_extension'
3
- require 'property_sets/version'
1
+ require "property_sets/property_set_model"
2
+ require "property_sets/active_record_extension"
3
+ require "property_sets/version"
4
4
 
5
5
  begin
6
- require 'property_sets/action_view_extension'
6
+ require "property_sets/action_view_extension"
7
7
  rescue LoadError
8
8
  end
9
9
 
10
+ if "#{ActiveRecord::VERSION::MAJOR}.#{ActiveRecord::VERSION::MINOR}" == "6.1"
11
+ ActiveRecord::Base.singleton_class.alias_method :connection_class_for_self, :connection_classes
12
+ end
13
+
10
14
  module PropertySets
11
15
  def self.ensure_property_set_class(association, owner_class_name)
12
16
  const_name = "#{owner_class_name.demodulize}#{association.to_s.singularize.camelcase}"
13
17
  namespace = owner_class_name.deconstantize.safe_constantize || Object
14
18
 
15
19
  unless namespace.const_defined?(const_name, false)
16
- property_class = Class.new(ActiveRecord::Base) do
20
+ property_class = Class.new(parent_for_property_class(namespace, owner_class_name)) do
17
21
  include PropertySets::PropertySetModel::InstanceMethods
18
- extend PropertySets::PropertySetModel::ClassMethods
22
+ extend PropertySets::PropertySetModel::ClassMethods
19
23
  end
20
24
 
21
25
  namespace.const_set(const_name, property_class)
@@ -26,4 +30,12 @@ module PropertySets
26
30
 
27
31
  namespace.const_get(const_name.to_s)
28
32
  end
33
+
34
+ def self.parent_for_property_class(namespace, owner_class_name)
35
+ owner_class = namespace.const_get(owner_class_name)
36
+
37
+ owner_class.property_sets_connection_class || owner_class.connection_class_for_self
38
+ rescue NameError
39
+ ::ActiveRecord::Base
40
+ end
29
41
  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.9.0
4
+ version: 3.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Morten Primdahl
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-04-20 00:00:00.000000000 Z
11
+ date: 2023-11-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord
@@ -16,7 +16,7 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '5.0'
19
+ version: '6.0'
20
20
  - - "<"
21
21
  - !ruby/object:Gem::Version
22
22
  version: '7.1'
@@ -26,7 +26,7 @@ dependencies:
26
26
  requirements:
27
27
  - - ">="
28
28
  - !ruby/object:Gem::Version
29
- version: '5.0'
29
+ version: '6.0'
30
30
  - - "<"
31
31
  - !ruby/object:Gem::Version
32
32
  version: '7.1'
@@ -100,6 +100,20 @@ dependencies:
100
100
  - - ">="
101
101
  - !ruby/object:Gem::Version
102
102
  version: '0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: standard
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ type: :development
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - ">="
115
+ - !ruby/object:Gem::Version
116
+ version: '0'
103
117
  - !ruby/object:Gem::Dependency
104
118
  name: byebug
105
119
  requirement: !ruby/object:Gem::Requirement