act_with_flags 0.2.4 → 3.1.1

Sign up to get free protection for your applications and to get access to all the features.
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