act_with_flags 0.2.4 → 3.1.1

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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +9 -3
  3. data/.ruby-gemset +1 -1
  4. data/.ruby-version +1 -1
  5. data/.watchr +29 -16
  6. data/Appraisals +10 -6
  7. data/Gemfile +7 -6
  8. data/Gemfile.lock +133 -105
  9. data/MIT-LICENSE +1 -1
  10. data/README.md +118 -9
  11. data/Rakefile +5 -5
  12. data/act_with_flags.gemspec +20 -20
  13. data/gemfiles/rails_6.0.gemfile +2 -1
  14. data/gemfiles/rails_7.0.gemfile +15 -0
  15. data/lib/act_with_flags/admin.rb +7 -49
  16. data/lib/act_with_flags/clear.rb +30 -0
  17. data/lib/act_with_flags/define.rb +6 -35
  18. data/lib/act_with_flags/flags.rb +65 -0
  19. data/lib/act_with_flags/print.rb +23 -28
  20. data/lib/act_with_flags/utils.rb +41 -13
  21. data/lib/act_with_flags/version.rb +10 -7
  22. data/lib/act_with_flags.rb +63 -31
  23. data/test/any_all_none_test.rb +6 -9
  24. data/test/benchmark_test.rb +73 -0
  25. data/test/clear_test.rb +5 -7
  26. data/test/coding_check_add_test.rb +29 -0
  27. data/test/coding_coverage_test.rb +19 -0
  28. data/test/coding_mask2d_test.rb +25 -0
  29. data/test/coding_null_test.rb +29 -0
  30. data/test/coding_one_test.rb +26 -0
  31. data/test/coding_reset_test.rb +18 -0
  32. data/test/inheritance_any_test.rb +9 -33
  33. data/test/inheritance_test.rb +7 -10
  34. data/test/internal/app/controllers/orders_controller.rb +1 -3
  35. data/test/internal/app/models/order.rb +1 -5
  36. data/test/internal/config/routes.rb +1 -1
  37. data/test/internal/db/schema.rb +6 -7
  38. data/test/legacy_test.rb +8 -9
  39. data/test/mask_test.rb +6 -7
  40. data/test/null_test.rb +3 -5
  41. data/test/one_test.rb +7 -9
  42. data/test/origin_test.rb +7 -26
  43. data/test/origins_test.rb +57 -0
  44. data/test/range2_test.rb +59 -0
  45. data/test/range3_test.rb +37 -0
  46. data/test/range_test.rb +89 -0
  47. data/test/remove_from_test.rb +3 -4
  48. data/test/test_helper.rb +8 -8
  49. metadata +23 -41
  50. data/.rubocop.yml +0 -9
  51. data/test/internal_benchmark_test.rb +0 -52
  52. data/test/internal_check_add_test.rb +0 -36
  53. data/test/internal_null_test.rb +0 -29
  54. data/test/internal_one_test.rb +0 -27
  55. data/test/reset_test.rb +0 -17
@@ -0,0 +1,57 @@
1
+ require "test_helper"
2
+
3
+ describe "Several origins" do
4
+ let(:order) { Order.create }
5
+
6
+ def setup
7
+ reset_order
8
+ Order.add_to_flags :a # origin is :flags
9
+ Order.add_to_flags :b, b2: 63 # origin is :flags
10
+ Order.add_to_flags :c, origin: :origin1
11
+ Order.add_to_flags d: 3, origin: :origin2
12
+ Order.add_to_flags :d2, origin: :origin2
13
+ end
14
+
15
+ it "checks flags" do
16
+ order.a = true
17
+ order.b = true
18
+ order.b2 = true
19
+ assert_equal 0x8000000000000003, order.flags
20
+ order.b2 = false
21
+ assert_equal 0x03, order.flags
22
+ assert_equal 0x01, Order.act_with_flags.mask(:a) # should work
23
+ assert_equal 0x8000000000000002, Order.act_with_flags.mask(:b, :b2) # should work
24
+ end
25
+
26
+ it "checks origin1" do
27
+ order.c = true
28
+ assert_equal 0x01, order.origin1
29
+ assert_equal 0x01, Order.act_with_flags.mask(:c)
30
+ end
31
+
32
+ it "checks origin2" do
33
+ order.d = true
34
+ assert_equal 0x08, order.origin2
35
+ assert_equal 0x18, Order.act_with_flags.mask(:d2, :d)
36
+ end
37
+
38
+ it "should reject mask for different origins" do
39
+ assert_raises(RuntimeError) {
40
+ Order.act_with_flags.mask :c, :d
41
+ }
42
+ end
43
+
44
+ it "allows any? et all for same origins" do
45
+ order.flags_any? :b, :b2
46
+ order.flags_all? :d2, :d
47
+ end
48
+
49
+ it "rejects any? et all for different origins" do
50
+ assert_raises(RuntimeError) {
51
+ order.flags_any? :a, :c
52
+ }
53
+ assert_raises(RuntimeError) {
54
+ order.flags_all? :d2, :c
55
+ }
56
+ end
57
+ end
@@ -0,0 +1,59 @@
1
+ require "test_helper"
2
+
3
+ describe "range #2" do
4
+ def setup
5
+ reset_order
6
+ end
7
+
8
+ it "succeeds specifying just a range" do
9
+ Order.add_to_flags range: 0...0
10
+ end
11
+
12
+ it "succeeds specifying just a (same) range with an origin" do
13
+ Order.add_to_flags range: 0..0
14
+ Order.add_to_flags range: 0..0, origin: :dummy
15
+ end
16
+
17
+ it "rejects more than one range specification" do
18
+ Order.add_to_flags range: 0..0
19
+ assert_raises(ArgumentError) { Order.add_to_flags range: 1..1 }
20
+ end
21
+
22
+ it "succeeds validation (pre specification of range)" do
23
+ Order.add_to_flags range: ..0
24
+ Order.add_to_flags :a
25
+ end
26
+
27
+ it "succeeds validation (post specification of range)" do
28
+ Order.add_to_flags :a
29
+ Order.add_to_flags range: ..0
30
+ end
31
+
32
+ it "fails validation (pre specification of range)" do
33
+ Order.add_to_flags range: (1..)
34
+ assert_raises(RangeError) { Order.add_to_flags :a }
35
+ end
36
+
37
+ it "fails validation (post specification of range)" do
38
+ Order.add_to_flags :b, origin: :hugo
39
+ Order.add_to_flags :a
40
+ assert_raises(RangeError) { Order.add_to_flags range: 1.. }
41
+ end
42
+
43
+ it "succeeds validation for two flags (post specification of range)" do
44
+ Order.add_to_flags :a, :b # bits 0 & 1
45
+ Order.add_to_flags range: ..1
46
+ end
47
+
48
+ it "rejects validation for two flags (post specification of range)" do
49
+ Order.add_to_flags :a, :b # bits 0 & 1
50
+ # :a (bit 0) triggers an exception on the validation of range
51
+ assert_raises(RangeError) { Order.add_to_flags range: 1.. }
52
+ end
53
+
54
+ it "rejects post validation" do
55
+ Order.add_to_flags :a, :b # bits 0 & 1
56
+ # :b (bit 1) triggers an exception on the validation of range
57
+ assert_raises(RangeError) { Order.add_to_flags range: ..0 }
58
+ end
59
+ end
@@ -0,0 +1,37 @@
1
+ require "test_helper"
2
+
3
+ describe "range #3" do
4
+ def setup
5
+ reset_order
6
+ end
7
+
8
+ it "accepts an integer as position" do
9
+ Order.add_to_flags a: 0
10
+ Order.add_to_flags b: 1
11
+ Order.add_to_flags c: 2
12
+ Order.add_to_flags d: 100
13
+
14
+ msk = Order.add_to_flags.mask(:a, :b, :c)
15
+ assert 0x07, msk
16
+
17
+ msk = Order.add_to_flags.mask(:d)
18
+ assert 0x10000000000000000000000000, msk
19
+ end
20
+
21
+ it "rejects ivalid position" do
22
+ assert_raises(ArgumentError) { Order.add_to_flags a: -1 }
23
+ assert_raises(ArgumentError) { Order.add_to_flags a: :a_symbol }
24
+ end
25
+
26
+ [0..0, 0..1, ..0, 1.., 100..100, 0...1, ...1, 1..., ...100].each do |range|
27
+ it "checks valid range #{range}" do
28
+ Order.add_to_flags range: range
29
+ end
30
+ end
31
+
32
+ [-1..0, :a..:z, "a".."z"].each do |range|
33
+ it "rejects invalid range #{range}" do
34
+ assert_raises(RangeError) { Order.add_to_flags range: range }
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,89 @@
1
+ require "test_helper"
2
+
3
+ describe "range" do
4
+ def setup
5
+ reset_order
6
+ end
7
+
8
+ it "runs without range" do
9
+ Order.add_to_flags :a
10
+ Order.add_to_flags :b
11
+ end
12
+
13
+ it "runs with range(inside)" do
14
+ Order.add_to_flags range: 2..4, a: 2
15
+ Order.add_to_flags range: 2..4, b: 3
16
+ end
17
+
18
+ it "fails with outside range" do
19
+ assert_raises(RangeError) { Order.add_to_flags range: 2..3, a: 1 }
20
+ assert_raises(RangeError) { Order.add_to_flags range: 2..3, b: 4 }
21
+ end
22
+
23
+ it "runs at borders" do
24
+ Order.add_to_flags range: 2..3, a: 2
25
+ Order.add_to_flags range: 2..3, b: 3
26
+ end
27
+
28
+ it "runs with ... as range" do
29
+ Order.add_to_flags range: 2...3, a: 2
30
+ assert_raises(RangeError) { Order.add_to_flags range: 2...3, b: 3 }
31
+ end
32
+
33
+ it "detects wrong range" do
34
+ assert_raises(RangeError) { Order.add_to_flags range: "a".."z", a: 2 }
35
+ end
36
+
37
+ it "tests range 0..0 no position" do
38
+ Order.add_to_flags :a, range: 0..0
39
+ assert_raises(RangeError) { Order.add_to_flags :b, range: 0..0 }
40
+ end
41
+
42
+ it "tests range ..0 no position" do
43
+ Order.add_to_flags :a, range: ..0
44
+ assert_raises(RangeError) { Order.add_to_flags :b, range: ..0 }
45
+ end
46
+
47
+ it "tests range ...0 no position" do
48
+ assert_raises(RangeError) { Order.add_to_flags :a, range: ...0 }
49
+ end
50
+
51
+ # YAGNI
52
+ # # includes range: ( .. 3 ) equivalent to range: ..3
53
+ # n = 100
54
+ # (0..n).each do |i|
55
+ # rng = ..i
56
+ #
57
+ # (0..i).each do |j|
58
+ # it "tests range ..#{i} with position #{j}" do
59
+ # Order.add_to_flags a: j, range: rng
60
+ # end
61
+ # end
62
+ #
63
+ # it "fails range ..#{i} with position overflow" do
64
+ # assert_raises(RangeError) { Order.add_to_flags b: (i + 1), range: rng }
65
+ # end
66
+ # end
67
+ #
68
+ # it "runs ii plus" do
69
+ # ii = 0
70
+ # (0..2).each { |íí|
71
+ # sym = "x#{ii}".to_sym
72
+ # j = f(ii, ii + 1) # filler
73
+ # rand j
74
+ # Order.add_to_flags :range => ii..f(íí, íí), sym => (ii += 1)
75
+ # orden = Order.new
76
+ # refute orden.send("#{sym}?") # checks that accessor is active
77
+ # orden.x0 = true # checks that first accessor is still there
78
+ # assert orden.x0?
79
+ # }
80
+ # end
81
+ #
82
+ # private
83
+ #
84
+ # def f(x, y)
85
+ # return y + 1 if x == 0
86
+ # return f(x - 1, 1) if y == 0
87
+ # f(x - 1, f(x, y - 1))
88
+ # end
89
+ end
@@ -1,6 +1,6 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
- describe 'Delete from Flags' do
3
+ describe "Delete from Flags" do
4
4
  let(:order) { Order.create }
5
5
 
6
6
  def setup
@@ -9,10 +9,9 @@ describe 'Delete from Flags' do
9
9
  order.a = order.b = order.c = true
10
10
  end
11
11
 
12
- it 'remove accessors' do
12
+ it "remove accessors" do
13
13
  Order.remove_from_flags :b
14
14
  assert_raises { order.b }
15
15
  refute Order.respond_to?(:b)
16
16
  end
17
-
18
17
  end
data/test/test_helper.rb CHANGED
@@ -1,7 +1,7 @@
1
- if ENV['COVERAGE']
2
- require 'simplecov'
1
+ if ENV["COVERAGE"]
2
+ require "simplecov"
3
3
  SimpleCov.start do
4
- add_filter '/test/'
4
+ add_filter "/test/"
5
5
  end
6
6
  end
7
7
 
@@ -9,11 +9,11 @@ require "combustion"
9
9
  Combustion.path = "test/internal"
10
10
  Combustion.initialize! :active_record
11
11
 
12
- require 'rails/test_help'
13
- require 'minitest/autorun'
14
- require 'minitest/benchmark'
15
- #require 'capybara/rails'
12
+ require "rails/test_help"
13
+ require "minitest/autorun"
14
+ require "minitest/benchmark"
15
+ # require 'capybara/rails'
16
16
 
17
17
  def reset_order
18
- Order.act_with_flags.reset if Order.act_with_flags
18
+ Order.act_with_flags&.reset
19
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: act_with_flags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.4
4
+ version: 3.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dittmar Krall
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-06-20 00:00:00.000000000 Z
11
+ date: 2022-09-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -94,16 +94,15 @@ dependencies:
94
94
  - - ">="
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
- description: Handles flags in a Rails model instance
97
+ description: Handles flags/booleans in a Rails model instance
98
98
  email:
99
- - dittmar.krall@matique.de
99
+ - dittmar.krall@matiq.com
100
100
  executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
104
  - ".github/workflows/rake.yml"
105
105
  - ".gitignore"
106
- - ".rubocop.yml"
107
106
  - ".ruby-gemset"
108
107
  - ".ruby-version"
109
108
  - ".watchr"
@@ -116,14 +115,24 @@ files:
116
115
  - act_with_flags.gemspec
117
116
  - gemfiles/rails_6.0.gemfile
118
117
  - gemfiles/rails_6.1.gemfile
118
+ - gemfiles/rails_7.0.gemfile
119
119
  - lib/act_with_flags.rb
120
120
  - lib/act_with_flags/admin.rb
121
+ - lib/act_with_flags/clear.rb
121
122
  - lib/act_with_flags/define.rb
123
+ - lib/act_with_flags/flags.rb
122
124
  - lib/act_with_flags/print.rb
123
125
  - lib/act_with_flags/utils.rb
124
126
  - lib/act_with_flags/version.rb
125
127
  - test/any_all_none_test.rb
128
+ - test/benchmark_test.rb
126
129
  - test/clear_test.rb
130
+ - test/coding_check_add_test.rb
131
+ - test/coding_coverage_test.rb
132
+ - test/coding_mask2d_test.rb
133
+ - test/coding_null_test.rb
134
+ - test/coding_one_test.rb
135
+ - test/coding_reset_test.rb
127
136
  - test/inheritance_any_test.rb
128
137
  - test/inheritance_test.rb
129
138
  - test/internal/app/assets/config/manifest.js
@@ -136,23 +145,23 @@ files:
136
145
  - test/internal/config/routes.rb
137
146
  - test/internal/config/secrets.yml
138
147
  - test/internal/db/schema.rb
139
- - test/internal_benchmark_test.rb
140
- - test/internal_check_add_test.rb
141
- - test/internal_null_test.rb
142
- - test/internal_one_test.rb
143
148
  - test/legacy_test.rb
144
149
  - test/mask_test.rb
145
150
  - test/null_test.rb
146
151
  - test/one_test.rb
147
152
  - test/origin_test.rb
153
+ - test/origins_test.rb
154
+ - test/range2_test.rb
155
+ - test/range3_test.rb
156
+ - test/range_test.rb
148
157
  - test/remove_from_test.rb
149
- - test/reset_test.rb
150
158
  - test/string_test.rb
151
159
  - test/test_helper.rb
152
- homepage: http://matique.de
160
+ homepage: http://matiq.com
153
161
  licenses:
154
162
  - MIT
155
- metadata: {}
163
+ metadata:
164
+ source_code_uri: https://github.com/matique/act_with_flags
156
165
  post_install_message:
157
166
  rdoc_options: []
158
167
  require_paths:
@@ -168,35 +177,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
177
  - !ruby/object:Gem::Version
169
178
  version: '0'
170
179
  requirements: []
171
- rubygems_version: 3.2.6
180
+ rubygems_version: 3.3.7
172
181
  signing_key:
173
182
  specification_version: 4
174
183
  summary: act_with_flags gem
175
- test_files:
176
- - test/any_all_none_test.rb
177
- - test/clear_test.rb
178
- - test/inheritance_any_test.rb
179
- - test/inheritance_test.rb
180
- - test/internal/app/assets/config/manifest.js
181
- - test/internal/app/controllers/application_controller.rb
182
- - test/internal/app/controllers/orders_controller.rb
183
- - test/internal/app/models/application_record.rb
184
- - test/internal/app/models/order.rb
185
- - test/internal/app/views/layouts/application.html.erb
186
- - test/internal/config/database.yml
187
- - test/internal/config/routes.rb
188
- - test/internal/config/secrets.yml
189
- - test/internal/db/schema.rb
190
- - test/internal_benchmark_test.rb
191
- - test/internal_check_add_test.rb
192
- - test/internal_null_test.rb
193
- - test/internal_one_test.rb
194
- - test/legacy_test.rb
195
- - test/mask_test.rb
196
- - test/null_test.rb
197
- - test/one_test.rb
198
- - test/origin_test.rb
199
- - test/remove_from_test.rb
200
- - test/reset_test.rb
201
- - test/string_test.rb
202
- - test/test_helper.rb
184
+ test_files: []
data/.rubocop.yml DELETED
@@ -1,9 +0,0 @@
1
- inherit_from:
2
- - ~/configs/.rubocop.yml
3
-
4
- AllCops:
5
- NewCops: enable
6
- Include:
7
- - 'lib/**/*.rb'
8
- Exclude:
9
- - 'test/**/*'
@@ -1,52 +0,0 @@
1
- # For development purposes; do not waste your tine reading it!
2
- # YAGNI
3
- # rubocop:disable all
4
-
5
- require 'test_helper'
6
- require 'benchmark'
7
- require 'benchmark/ips'
8
- # ENV['MORE'] = 'true'
9
-
10
- describe 'Internal timings' do
11
- let(:order) { Order.create }
12
-
13
- def setup
14
- reset_order
15
- Order.add_to_flags :blocked
16
- end
17
-
18
- it 'times ips' do
19
- return unless ENV['MORE']
20
-
21
- Benchmark.ips do |x|
22
- x.report('assign true : ') { order.blocked = true }
23
- x.report('assign false: ') { order.blocked = false }
24
- x.report('assign "false": ') { order.blocked = 'false' }
25
- x.report('x = order.blocked? ') { x = order.blocked? }
26
- x.report('x = order.blocked ') { x = order.blocked }
27
-
28
- x.compare!
29
- end
30
- end
31
-
32
- end
33
-
34
- class BenchFoo < Minitest::Benchmark
35
-
36
- def bench_order_blocked
37
- return unless ENV['MORE']
38
-
39
- n = 1_000_000
40
- n = 100_000
41
- n = 10_000
42
- Order.add_to_flags :blocked2
43
- order = Order.create
44
- assert_performance_constant do |input|
45
- n.times do
46
- order.blocked2 = true
47
- order.blocked2 = !order.blocked2
48
- end
49
- end
50
- end
51
-
52
- end
@@ -1,36 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe 'Internal check add flag' do
4
- let(:admin) { Order.act_with_flags }
5
-
6
- def setup
7
- reset_order
8
- Order.add_to_flags a: 1, b: 7, c: 3
9
- end
10
-
11
- it 'skip reserved position' do
12
- Order.add_to_flags :xx
13
- assert_equal 0, admin.position(:xx)
14
- Order.add_to_flags :yy
15
- assert_equal 2, admin.position(:yy)
16
- end
17
-
18
- it 'rejects redefinition' do
19
- Order.add_to_flags :z
20
- assert_raises { Order.add_to_flags :z }
21
- end
22
-
23
- it 'rejects reuse of position' do
24
- assert_raises { Order.add_to_flags qq: 1 }
25
- end
26
-
27
- it 'coverage to_s' do
28
- res = admin.to_s
29
- puts res if ENV['MORE']
30
- end
31
-
32
- it 'coverage position raise' do
33
- assert_raises { admin.position(:aaaa) }
34
- end
35
-
36
- end
@@ -1,29 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe 'Internal Null' do
4
- let(:admin) { Order.act_with_flags }
5
-
6
- def setup
7
- reset_order
8
- Order.add_to_flags
9
- end
10
-
11
- it 'respond to act_with_flags' do
12
- assert Order.respond_to?(:act_with_flags)
13
- refute_nil Order.act_with_flags
14
- end
15
-
16
- it 'tests to_boolean' do
17
- assert admin.to_boolean(true)
18
- refute admin.to_boolean(false)
19
- assert_raises { admin.to_boolean(nil) }
20
- assert_raises { admin.to_boolean(2) }
21
- assert_raises { admin.to_boolean('unknown') }
22
- end
23
-
24
- it 'tests a simple administration: names' do
25
- refute_nil admin.names
26
- assert_equal [], admin.names
27
- end
28
-
29
- end
@@ -1,27 +0,0 @@
1
- # rubocop: disable all
2
-
3
- require 'test_helper'
4
-
5
- describe 'Internal One Flag' do
6
- let(:flag) { :blocked }
7
- let(:admin) { Order.act_with_flags }
8
- let(:order) { Order.new }
9
-
10
- def setup
11
- reset_order
12
- Order.add_to_flags flag
13
- end
14
-
15
- it 'test Order.act_with_flags' do
16
- refute_nil admin
17
- assert_equal admin, order.class.act_with_flags
18
- end
19
-
20
- it 'checks definition of methods for flag' do
21
- msg = "method '#{flag}' not defined'
22
- assert order.respond_to?("#{flag}"), msg
23
- assert order.respond_to?("#{flag}?"), msg
24
- assert order.respond_to?("#{flag}="), msg
25
- end
26
-
27
- end
data/test/reset_test.rb DELETED
@@ -1,17 +0,0 @@
1
- require 'test_helper'
2
-
3
- describe 'Testing reset' do
4
- let(:order) { Order.new }
5
-
6
- def setup
7
- reset_order
8
- Order.add_to_flags :a
9
- end
10
-
11
- it 'reset hard' do
12
- refute_equal [], Order.add_to_flags.names
13
- Order.act_with_flags&.reset
14
- assert_equal [], Order.add_to_flags.names
15
- end
16
-
17
- end