active_flags 0.3.3 → 0.3.10

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: f9294a75b725745829acd3ec8aaa51f38a7e33fcac56c0a54691e30d710aa412
4
- data.tar.gz: 150a55111a05c5a9760bd0a8b5d7c3b5f84a5121ac9a20dfe4d94b75156e5d2a
3
+ metadata.gz: cc2b9964dd268bb5482ee832a4d1cbab56ab00c4a37ff13bf92cd56b03dbab39
4
+ data.tar.gz: 157e67e3132902f707ba8a849ab56807be2a989b64918658df1998884dcc9bcb
5
5
  SHA512:
6
- metadata.gz: d83b4c732a65d57a6ed19338212f323ca54c91a5a51b2c583f49dd5adc7fef6525d42661ef09ab1131f65c0ef1ee55f91a470ca2ea19a826e525eec280cfd42f
7
- data.tar.gz: 0c39dc87352e7fc6508d3df4588487be544c440cdaa706e33e01f57781fb77e3c4c0914df8c12fd353637541bfa1b5cd83db9d69adf22686816d4a6142aedf66
6
+ metadata.gz: 07d09aa9564267e89000018f120d72ab80ffee79d466b99fa7197bd96bb2193a0f53da9279bfcb09bc5b8a1931a39a00e3518007815bceefe79f6d9461449063
7
+ data.tar.gz: e1f6e8ed611eab07b4af1bea6c30650d1a3403fcc74a1e52a9dcd874b621d143392744e91454f0d787a37f2423311507466a3e6f24ec22e6a2cbb775840e5cc5
data/README.md CHANGED
@@ -74,7 +74,9 @@ user.update!(flags: { visible: true, active: true, diet: 'vegan', power: 'super
74
74
  ```
75
75
 
76
76
  To access your flags, you now have 2 ways.
77
- Either as a hash, with the `flags` method or as an ActiveFlag::Flags collection with the `flags_as_collection` method.
77
+ Either as a hash, with the `flags` method or as an ActiveFlag::Flag collection with the `flags_as_collection` method.
78
+
79
+ Note: You can call `converted_value` on an `ActiveFlag::Flag` instance returned by flags_as_collection, to retrieved your 'true' or 'false' value as a boolean.
78
80
 
79
81
  ## Flags as scopes
80
82
 
@@ -85,35 +87,34 @@ ActiveFlags gives you a clean and simple way to query your model based on define
85
87
  Any flag can be queried as a scope using the `flagged_as` method
86
88
 
87
89
  ```ruby
88
- user = User.create!(flags: { visible: true })
90
+ user = User.create!(flags: { visible: true })
89
91
 
90
92
  User.flagged_as_visible
91
- # #<ActiveRecord::Relation [#<User id: 1>]>
93
+ # #<ActiveRecord::Relation [#<User id: 1>]>
92
94
 
93
95
  User.flagged_as_visible(false)
94
- # #<ActiveRecord::Relation []>
96
+ # #<ActiveRecord::Relation []>
95
97
 
96
98
  User.flagged_as_intelligent
97
- # #<ActiveRecord::Relation []>
99
+ # #<ActiveRecord::Relation []>
98
100
 
99
101
  user.update!(flags: { intelligent: true })
100
102
  User.flagged_as_intelligent
101
- # #<ActiveRecord::Relation [#<User id: 1>]>
103
+ # #<ActiveRecord::Relation [#<User id: 1>]>
102
104
 
103
105
  user.update!(flags: { intelligent: 'a bit' })
104
106
  User.flagged_as_intelligent('a_bit')
105
- # #<ActiveRecord::Relation [#<User id: 1>]>
107
+ # #<ActiveRecord::Relation [#<User id: 1>]>
106
108
  ```
107
109
 
108
110
  To query flags the other way around you can use the `not_flagged_as` method
109
111
 
110
112
  ```ruby
111
113
  User.not_flagged_as_intelligent
112
- # or with value
114
+ # or with value
113
115
  User.not_flagged_as_intelligent('a bit')
114
116
  ```
115
117
 
116
-
117
118
  ## Contributing
118
119
  https://github.com/FidMe/active_flags
119
120
 
@@ -1,8 +1,36 @@
1
+ require 'utils/value_stringifier'
2
+
1
3
  module ActiveFlags
2
4
  class Flag < ApplicationRecord
3
5
  belongs_to :subject, polymorphic: true
4
6
 
5
7
  validates :subject, :key, :value, presence: true
6
8
  validates :key, uniqueness: { scope: :subject }
9
+
10
+ after_save :notify_subject_flag_has_changed, if: proc { |flag| flag.saved_changes.key?('value') }
11
+ def notify_subject_flag_has_changed
12
+ subject.flag_has_changed(key, value) if subject&.respond_to?(:flag_has_changed)
13
+ true
14
+ end
15
+
16
+ def removing_duplicated_needed?
17
+ ActiveFlags::Flag.where(subject: subject, key: key).any?
18
+ end
19
+
20
+ def removing_duplicated_flags!
21
+ return false unless removing_duplicated_needed?
22
+ grouped = ActiveFlags::Flag
23
+ .where(subject_id: subject_id, subject_type: subject_type, key: key)
24
+ .group_by { |model| [model.key, model.subject_id, model.subject_type] }
25
+ grouped.values.each do |duplicates|
26
+ duplicates.shift
27
+ duplicates.each(&:destroy)
28
+ end
29
+ true
30
+ end
31
+
32
+ def converted_value
33
+ self.value = unstringify(value)
34
+ end
7
35
  end
8
36
  end
@@ -21,7 +21,7 @@ module ActiveFlags
21
21
  define_method(:flags) do
22
22
  hash_of_flags = {}
23
23
  flags_as_collection.each do |flag|
24
- hash_of_flags[flag.key.to_sym] = flag.value
24
+ hash_of_flags[flag.key.to_sym] = flag.converted_value
25
25
  end
26
26
  hash_of_flags.with_indifferent_access
27
27
  end
@@ -33,15 +33,12 @@ module ActiveFlags
33
33
 
34
34
  def method_missing(method_name, *args, &block)
35
35
  return super unless method_name.to_s.include?(prefix = ACTIVE_FLAGS_PREFIX)
36
-
37
36
  different_from = method_name.to_s.starts_with?('not')
38
37
  flag = method_name.to_s.gsub(different_from ? "not_#{prefix}" : prefix, '')
39
- condition = { active_flags_flags: { value: stringify(args[0]) } }
38
+ result = joins(:flags_as_collection)
39
+ .where(active_flags_flags: { key: flag, value: stringify(args[0]) })
40
40
 
41
- joins(:flags_as_collection)
42
- .where(active_flags_flags: { key: flag })
43
- .send(different_from ? 'where' : 'all')
44
- .send(different_from ? 'not' : 'where', condition)
41
+ different_from ? where.not(id: result.pluck(:id)) : result
45
42
  end
46
43
  end
47
44
  end
@@ -8,8 +8,8 @@ module ActiveFlags
8
8
 
9
9
  def save
10
10
  flag = ActiveFlags::Flag.find_or_initialize_by(subject: @resource, key: @flag_attributes[:key])
11
+ flag.removing_duplicated_flags!
11
12
  flag.update!(value: @flag_attributes[:value])
12
-
13
13
  @resource.flags_as_collection << flag
14
14
  end
15
15
  end
@@ -1,3 +1,3 @@
1
1
  module ActiveFlags
2
- VERSION = '0.3.3'
2
+ VERSION = '0.3.10'
3
3
  end
@@ -1,9 +1,19 @@
1
1
  def stringify(value)
2
- if value.nil? || value == true
2
+ if value.nil? || value == true || value == 'true'
3
3
  't'
4
- elsif value == false
4
+ elsif value == false || value == 'false'
5
5
  'f'
6
6
  else
7
7
  value
8
8
  end
9
9
  end
10
+
11
+ def unstringify(value)
12
+ if value == 't' || value == 'true'
13
+ true
14
+ elsif value == 'f' || value == 'false' || value == nil
15
+ false
16
+ else
17
+ value
18
+ end
19
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_flags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.3
4
+ version: 0.3.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Huberty
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-14 00:00:00.000000000 Z
11
+ date: 2020-09-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: sqlite3
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: 1.3.6
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: 1.3.6
40
+ version: '0'
41
41
  description: Easily declare flags for your models.
42
42
  email:
43
43
  - nathan.huberty@orange.fr
@@ -73,7 +73,7 @@ homepage: https://github.com/FidMe/active_flags
73
73
  licenses:
74
74
  - MIT
75
75
  metadata: {}
76
- post_install_message:
76
+ post_install_message:
77
77
  rdoc_options: []
78
78
  require_paths:
79
79
  - lib
@@ -88,8 +88,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  requirements: []
91
- rubygems_version: 3.0.1
92
- signing_key:
91
+ rubygems_version: 3.1.2
92
+ signing_key:
93
93
  specification_version: 4
94
94
  summary: Easily declare flags for your models.
95
95
  test_files: []