act_with_flags 0.2.3 → 3.1.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.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/rake.yml +30 -0
  3. data/.ruby-gemset +1 -1
  4. data/.ruby-version +1 -1
  5. data/.watchr +29 -16
  6. data/Appraisals +12 -4
  7. data/Gemfile +7 -6
  8. data/Gemfile.lock +156 -125
  9. data/MIT-LICENSE +1 -1
  10. data/README.md +77 -10
  11. data/Rakefile +5 -5
  12. data/act_with_flags.gemspec +20 -20
  13. data/gemfiles/rails_6.0.gemfile +4 -1
  14. data/gemfiles/{rails_5.2.gemfile → rails_6.1.gemfile} +3 -1
  15. data/gemfiles/rails_7.0.gemfile +15 -0
  16. data/lib/act_with_flags/admin.rb +5 -48
  17. data/lib/act_with_flags/clear.rb +30 -0
  18. data/lib/act_with_flags/define.rb +6 -35
  19. data/lib/act_with_flags/flags.rb +65 -0
  20. data/lib/act_with_flags/print.rb +21 -27
  21. data/lib/act_with_flags/utils.rb +33 -13
  22. data/lib/act_with_flags/version.rb +9 -13
  23. data/lib/act_with_flags.rb +28 -33
  24. data/test/any_all_none_test.rb +6 -9
  25. data/test/benchmark_test.rb +73 -0
  26. data/test/clear_test.rb +5 -7
  27. data/test/coding_check_add_test.rb +29 -0
  28. data/test/coding_coverage_test.rb +19 -0
  29. data/test/coding_mask2d_test.rb +25 -0
  30. data/test/coding_null_test.rb +29 -0
  31. data/test/coding_one_test.rb +26 -0
  32. data/test/coding_reset_test.rb +18 -0
  33. data/test/inheritance_any_test.rb +9 -33
  34. data/test/inheritance_test.rb +7 -10
  35. data/test/internal/app/controllers/orders_controller.rb +1 -3
  36. data/test/internal/app/models/order.rb +1 -5
  37. data/test/internal/config/routes.rb +1 -1
  38. data/test/internal/db/schema.rb +6 -7
  39. data/test/legacy_test.rb +8 -9
  40. data/test/mask_test.rb +6 -7
  41. data/test/null_test.rb +3 -5
  42. data/test/one_test.rb +7 -9
  43. data/test/origin_test.rb +7 -26
  44. data/test/origins_test.rb +57 -0
  45. data/test/range_test.rb +89 -0
  46. data/test/remove_from_test.rb +3 -4
  47. data/test/test_helper.rb +9 -9
  48. metadata +47 -67
  49. data/.rubocop.yml +0 -8
  50. data/.travis.yml +0 -23
  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,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,19 +1,19 @@
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
 
8
8
  require "combustion"
9
9
  Combustion.path = "test/internal"
10
- Combustion.initialize! :all
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,111 +1,110 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: act_with_flags
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 3.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Dittmar Krall
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-14 00:00:00.000000000 Z
11
+ date: 2022-08-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '13'
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: '13'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: appraisal
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ">="
46
46
  - !ruby/object:Gem::Version
47
- version: '2'
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ">="
53
53
  - !ruby/object:Gem::Version
54
- version: '2'
54
+ version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: combustion
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ">="
60
60
  - !ruby/object:Gem::Version
61
- version: '1'
61
+ version: '0'
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ">="
67
67
  - !ruby/object:Gem::Version
68
- version: '1'
68
+ version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: minitest
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - "~>"
73
+ - - ">="
74
74
  - !ruby/object:Gem::Version
75
- version: '5.0'
75
+ version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - "~>"
80
+ - - ">="
81
81
  - !ruby/object:Gem::Version
82
- version: '5.0'
82
+ version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: sqlite3
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - "~>"
87
+ - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '1'
89
+ version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - "~>"
94
+ - - ">="
95
95
  - !ruby/object:Gem::Version
96
- version: '1'
97
- description: Handles flags in a Rails model instance
96
+ version: '0'
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
+ - ".github/workflows/rake.yml"
104
105
  - ".gitignore"
105
- - ".rubocop.yml"
106
106
  - ".ruby-gemset"
107
107
  - ".ruby-version"
108
- - ".travis.yml"
109
108
  - ".watchr"
110
109
  - Appraisals
111
110
  - Gemfile
@@ -114,16 +113,26 @@ files:
114
113
  - README.md
115
114
  - Rakefile
116
115
  - act_with_flags.gemspec
117
- - gemfiles/rails_5.2.gemfile
118
116
  - gemfiles/rails_6.0.gemfile
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,21 @@ 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/range_test.rb
148
155
  - test/remove_from_test.rb
149
- - test/reset_test.rb
150
156
  - test/string_test.rb
151
157
  - test/test_helper.rb
152
- homepage: http://matique.de
158
+ homepage: http://matiq.com
153
159
  licenses:
154
160
  - MIT
155
- metadata: {}
161
+ metadata:
162
+ source_code_uri: https://github.com/matique/act_with_flags
156
163
  post_install_message:
157
164
  rdoc_options: []
158
165
  require_paths:
@@ -168,35 +175,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
168
175
  - !ruby/object:Gem::Version
169
176
  version: '0'
170
177
  requirements: []
171
- rubygems_version: 3.0.8
178
+ rubygems_version: 3.3.7
172
179
  signing_key:
173
180
  specification_version: 4
174
181
  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
182
+ test_files: []
data/.rubocop.yml DELETED
@@ -1,8 +0,0 @@
1
- inherit_from:
2
- - ~/configs/.rubocop.yml
3
-
4
- AllCops:
5
- Include:
6
- - 'lib/**/*.rb'
7
- Exclude:
8
- - 'test/**/*'
data/.travis.yml DELETED
@@ -1,23 +0,0 @@
1
- language: ruby
2
- sudo: false
3
-
4
- bundler_args: --without production
5
- #before_install:
6
- #- gem update bundler --no-document
7
- #- gem update bundler --no-rdoc --no-ri
8
- script: "bundle exec rake test"
9
-
10
- rvm:
11
- - 2.6.6
12
- # - 2.6.5
13
- # - 2.6.4
14
- - 2.6.1
15
-
16
- gemfile:
17
- - gemfiles/rails_6.0.gemfile
18
- - gemfiles/rails_5.2.gemfile
19
-
20
- matrix:
21
-
22
- notifications:
23
- email: false
@@ -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