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,73 @@
1
+ # For development purposes; do not waste your tine reading it!
2
+ # YAGNI
3
+
4
+ require "test_helper"
5
+ require "benchmark"
6
+ require "benchmark/ips"
7
+ # ENV["MORE"] = "true"
8
+
9
+ describe "Internal timings flag" do
10
+ let(:order) { Order.create }
11
+
12
+ def setup
13
+ reset_order
14
+ Order.add_to_flags :blocked
15
+ end
16
+
17
+ it "times ips" do
18
+ return unless ENV["MORE"]
19
+
20
+ Benchmark.ips do |x|
21
+ x.report("assign true : ") { order.blocked = true }
22
+ x.report("assign false: ") { order.blocked = false }
23
+ x.report("assign \"false\": ") { order.blocked = "false" }
24
+ x.report("x = order.blocked? ") { x = order.blocked? }
25
+ x.report("x = order.blocked ") { x = order.blocked }
26
+
27
+ x.compare!
28
+ end
29
+ end
30
+ end
31
+
32
+ describe "Internal timings mask" do
33
+ let(:order) { Order.create }
34
+ let(:admin) { Order.act_with_flags }
35
+
36
+ def setup
37
+ reset_order
38
+ Order.add_to_flags a: 1, b: 7, c: 3
39
+ # Order.add_to_flags a: 1, b: 60, c: 3
40
+ # Order.add_to_flags a: 1, b: 1000, c: 3
41
+ end
42
+
43
+ it "times ips" do
44
+ return unless ENV["MORE"]
45
+
46
+ Benchmark.ips do |x|
47
+ x.report("mask(:a, :b): ") { admin.mask(:a, :b) }
48
+ x.report("any?(:a, :b): ") { order.flags_any?(:a, :b) }
49
+ x.report("all?(:a, :b): ") { order.flags_all?(:a, :b) }
50
+ x.report("none?(:a, :b): ") { order.flags_none?(:a, :b) }
51
+
52
+ x.compare!
53
+ end
54
+ end
55
+ end
56
+
57
+ class BenchFoo < Minitest::Benchmark
58
+ def bench_order_blocked
59
+ return unless ENV["MORE"]
60
+
61
+ n = 1_000_000
62
+ n = 100_000
63
+ n = 10_000
64
+ Order.add_to_flags :blocked2
65
+ order = Order.create
66
+ assert_performance_constant do |input|
67
+ n.times do
68
+ order.blocked2 = true
69
+ order.blocked2 = !order.blocked2
70
+ end
71
+ end
72
+ end
73
+ end
data/test/clear_test.rb CHANGED
@@ -1,7 +1,6 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
- describe 'Clear Flags at Save' do
4
- let(:admin) { Order.act_with_flags }
3
+ describe "Clear flags at save" do
5
4
  let(:order) { Order.create }
6
5
 
7
6
  def setup
@@ -10,21 +9,20 @@ describe 'Clear Flags at Save' do
10
9
  order.a = order.b = order.c = true
11
10
  end
12
11
 
13
- it 'checks sanity' do
12
+ it "checks sanity" do
14
13
  assert_equal 0x8a, order.flags
15
14
  assert order.b
16
15
  end
17
16
 
18
- it 'clear flags during save' do
17
+ it "clear flags during save" do
19
18
  Order.clear_flags_at_save :b
20
19
  order.save
21
20
  order.reload
22
21
  assert_equal 0x0a, order.flags
23
22
  end
24
23
 
25
- it 'does not remove accessor' do
24
+ it "does not remove accessor" do
26
25
  Order.clear_flags_at_save :b
27
26
  Order.respond_to? :b
28
27
  end
29
-
30
28
  end
@@ -0,0 +1,29 @@
1
+ require "test_helper"
2
+
3
+ describe "Internal check add flag" do
4
+ let(:order) { Order.create }
5
+
6
+ def setup
7
+ reset_order
8
+ Order.add_to_flags a: 1, b: 7
9
+ end
10
+
11
+ it "skip reserved position" do
12
+ Order.add_to_flags :xx
13
+ order.xx = true
14
+ assert_equal 0x100, order.flags
15
+
16
+ Order.add_to_flags :yy
17
+ order.yy = true
18
+ assert_equal 0x300, order.flags
19
+ end
20
+
21
+ it "rejects redefinition" do
22
+ Order.add_to_flags :z
23
+ assert_raises { Order.add_to_flags :z }
24
+ end
25
+
26
+ it "rejects reuse of position" do
27
+ assert_raises { Order.add_to_flags qq: 1 }
28
+ end
29
+ end
@@ -0,0 +1,19 @@
1
+ require "test_helper"
2
+
3
+ describe "Coverage" do
4
+ let(:order) { Order.create }
5
+
6
+ def setup
7
+ reset_order
8
+ Order.add_to_flags a: 1, b: 7
9
+ end
10
+
11
+ it "coverage to_s" do
12
+ res = order.act_with_flags.to_s
13
+ puts res if ENV["MORE"]
14
+ end
15
+
16
+ it "coverage location raise" do
17
+ assert_raises { order.act_with_flags.location(:unknown) }
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ require "test_helper"
2
+
3
+ # There is an interference with Class B in another test: call it BB!
4
+ class BB < Order
5
+ add_to_flags x: 1
6
+ end
7
+
8
+ describe "mask2d" do
9
+ let(:admin) { BB.act_with_flags }
10
+
11
+ def setup
12
+ reset_order
13
+ Order.add_to_flags y: 2
14
+ end
15
+
16
+ it "is a non splitted mask" do
17
+ mask = admin.mask2d(:x)
18
+ assert_equal 1, mask.length
19
+ end
20
+
21
+ it "is a splitted mask" do
22
+ mask = admin.mask2d(:x, :y)
23
+ assert_equal 2, mask.length
24
+ end
25
+ end
@@ -0,0 +1,29 @@
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
+ assert admin.to_boolean("true")
19
+ assert admin.to_boolean(1)
20
+ assert admin.to_boolean("1")
21
+ refute admin.to_boolean(false)
22
+ refute admin.to_boolean("false")
23
+ refute admin.to_boolean(0)
24
+ refute admin.to_boolean("0")
25
+ assert_raises { admin.to_boolean(nil) }
26
+ assert_raises { admin.to_boolean(2) }
27
+ assert_raises { admin.to_boolean("unknown") }
28
+ end
29
+ end
@@ -0,0 +1,26 @@
1
+ require "test_helper"
2
+
3
+ describe "Internal One Flag" do
4
+ let(:flag) { :blocked }
5
+ let(:admin) { Order.act_with_flags }
6
+ let(:order) { Order.new }
7
+
8
+ def setup
9
+ reset_order
10
+ Order.add_to_flags flag
11
+ end
12
+
13
+ it "test order.act_with_flags" do
14
+ refute_nil admin
15
+ assert_equal admin, order.class.act_with_flags
16
+ assert_equal admin, order.act_with_flags
17
+ assert_equal admin, Order.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.to_s), msg
23
+ assert order.respond_to?("#{flag}?"), msg
24
+ assert order.respond_to?("#{flag}="), msg
25
+ end
26
+ end
@@ -0,0 +1,18 @@
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
+ empty = {}
13
+ refute_equal empty, Order.add_to_flags.locations
14
+
15
+ Order.act_with_flags&.reset
16
+ assert_equal empty, Order.add_to_flags.locations
17
+ end
18
+ end
@@ -1,20 +1,18 @@
1
- # rubocop: disable all
2
-
3
- require 'test_helper'
1
+ require "test_helper"
4
2
 
5
3
  class A < Order
6
- add_to_flags y: 2
4
+ add_to_flags x: 1, y: 2
7
5
  end
8
6
 
9
- describe 'inheritance' do
7
+ describe "inheritance" do
10
8
  let(:a) { A.create }
11
9
 
12
10
  def setup
13
11
  reset_order
14
- Order.add_to_flags x: 1
12
+ Order.add_to_flags z: 3
15
13
  end
16
14
 
17
- it 'consistency' do
15
+ it "consistency" do
18
16
  assert a.respond_to?(:x)
19
17
  assert a.respond_to?(:y)
20
18
  assert_equal false, a.x
@@ -23,34 +21,12 @@ describe 'inheritance' do
23
21
  assert_equal true, a.y
24
22
  end
25
23
 
26
- it 'checks any?' do
24
+ it "checks any?" do
27
25
  a.x = true
28
26
  assert a.flags_any?(:x, :y)
29
- a.x = false
30
- refute a.flags_any?(:x, :y)
31
- end
32
27
 
33
- it 'checks any? #2' do
34
- a.y = true
35
- assert a.flags_any?(:x, :y)
36
- a.y = false
37
- refute a.flags_any?(:x, :y)
28
+ assert_raises(RuntimeError) {
29
+ assert a.flags_any?(:x, :y, :z)
30
+ }
38
31
  end
39
-
40
- it 'checks all?' do
41
- a.x = a.y = true
42
- assert a.flags_all?(:x, :y)
43
- a.x = false
44
- refute a.flags_all?(:x, :y)
45
- end
46
-
47
- it 'checks none? #2' do
48
- a.x = a.y = true
49
- refute a.flags_none?(:x, :y)
50
- a.x = false
51
- refute a.flags_none?(:x, :y)
52
- a.y = false
53
- assert a.flags_none?(:x, :y)
54
- end
55
-
56
32
  end
@@ -1,6 +1,4 @@
1
- # rubocop: disable all
2
-
3
- require 'test_helper'
1
+ require "test_helper"
4
2
 
5
3
  class A < Order
6
4
  end
@@ -10,13 +8,13 @@ class B < Order
10
8
  end
11
9
 
12
10
  class C < Order
13
- before_create { |row| row.flags2 = 0 }
11
+ before_create { |row| row.flags2 = 0 }
14
12
 
15
13
  attr_accessor :flags2
16
14
  add_to_flags z: 3, origin: :flags2
17
15
  end
18
16
 
19
- describe 'inheritance' do
17
+ describe "inheritance" do
20
18
  let(:admina) { A.act_with_flags }
21
19
  let(:adminb) { B.act_with_flags }
22
20
 
@@ -29,14 +27,14 @@ describe 'inheritance' do
29
27
  Order.add_to_flags x: 1
30
28
  end
31
29
 
32
- it 'inheritance #1' do
30
+ it "inheritance #1" do
33
31
  assert a.respond_to?(:flags)
34
32
  assert a.respond_to?(:x)
35
33
  assert_equal 0, a.flags
36
34
  assert_equal false, a.x
37
35
  end
38
36
 
39
- it 'inheritance #2' do
37
+ it "inheritance #2" do
40
38
  a.x = false
41
39
  assert_equal false, a.x
42
40
  a.x = true
@@ -44,7 +42,7 @@ describe 'inheritance' do
44
42
  assert_equal 0x02, a.flags
45
43
  end
46
44
 
47
- it 'inheritance #3' do
45
+ it "inheritance #3" do
48
46
  assert b.respond_to?(:flags)
49
47
  assert b.respond_to?(:x)
50
48
  assert b.respond_to?(:y)
@@ -58,7 +56,7 @@ describe 'inheritance' do
58
56
  assert_equal 0x06, b.flags
59
57
  end
60
58
 
61
- it 'inheritance #4' do
59
+ it "inheritance #4" do
62
60
  assert c.respond_to?(:x)
63
61
  assert c.respond_to?(:z)
64
62
  assert_equal false, c.z
@@ -69,5 +67,4 @@ describe 'inheritance' do
69
67
  assert_equal 0x02, c.flags
70
68
  assert_equal 0x08, c.flags2
71
69
  end
72
-
73
70
  end
@@ -1,5 +1,4 @@
1
1
  class OrdersController < ApplicationController
2
-
3
2
  def index
4
3
  @orders = Order.all
5
4
  end
@@ -9,8 +8,7 @@ class OrdersController < ApplicationController
9
8
  end
10
9
 
11
10
  def show
12
- Order.create :name => 'hugo'
11
+ Order.create name: "hugo"
13
12
  @order = Order.find(params[:id])
14
13
  end
15
-
16
14
  end
@@ -1,9 +1,5 @@
1
1
  class Order < ApplicationRecord
2
-
3
2
  before_save do |row|
4
- row.flags ||= 0
5
- row.bigflags ||= ''
6
- row.errors.add :base, 'panic' if row.name == 'error'
3
+ row.errors.add :base, "panic" if row.name == "error"
7
4
  end
8
-
9
5
  end
@@ -1,4 +1,4 @@
1
1
  Rails.application.routes.draw do
2
2
  resources :orders
3
- root :to => 'orders#index'
3
+ root to: "orders#index"
4
4
  end
@@ -1,13 +1,12 @@
1
1
  ActiveRecord::Schema.define(version: 201910) do
2
-
3
2
  create_table "orders", force: true do |t|
4
- t.string "name"
5
- t.string "qty"
6
- t.integer "flags"
7
- t.text "bigflags"
8
- t.integer "category"
3
+ t.string "name"
4
+ t.string "qty"
5
+ t.integer "flags", default: 0
6
+ t.text "bigflags", default: "0"
7
+ t.integer "origin1", default: 0
8
+ t.integer "origin2", default: 0
9
9
  t.datetime "created_at", null: false
10
10
  t.datetime "updated_at", null: false
11
11
  end
12
-
13
12
  end
data/test/legacy_test.rb CHANGED
@@ -1,7 +1,6 @@
1
- # rubocop:disable all
2
- require 'test_helper'
1
+ require "test_helper"
3
2
 
4
- describe 'Legacy Flag' do
3
+ describe "Legacy Flag" do
5
4
  let(:order) { Order.create }
6
5
 
7
6
  def setup
@@ -9,23 +8,24 @@ describe 'Legacy Flag' do
9
8
  Order.add_to_flags a: 1, b: 7, c: 3
10
9
  end
11
10
 
12
- it 'set true' do
11
+ it "set true" do
13
12
  test3 true, true, true
14
13
  end
15
14
 
16
- it 'set false' do
15
+ it "set false" do
17
16
  test3 false, false, false
18
17
  end
19
18
 
20
- it 'set mixture' do
19
+ it "set mixture" do
21
20
  test3 false, true, false
22
21
  end
23
22
 
24
- it 'set mixture #2' do
23
+ it "set mixture #2" do
25
24
  test3 true, false, true
26
25
  end
27
26
 
28
- private
27
+ private
28
+
29
29
  def test3(a, b, c)
30
30
  order.a = a
31
31
  order.b = b
@@ -35,5 +35,4 @@ describe 'Legacy Flag' do
35
35
  assert_equal b, order.b
36
36
  assert_equal c, order.c
37
37
  end
38
-
39
38
  end
data/test/mask_test.rb CHANGED
@@ -1,6 +1,6 @@
1
- require 'test_helper'
1
+ require "test_helper"
2
2
 
3
- describe 'mask' do
3
+ describe "mask" do
4
4
  let(:admin) { Order.act_with_flags }
5
5
 
6
6
  def setup
@@ -8,21 +8,20 @@ describe 'mask' do
8
8
  Order.add_to_flags a: 1, b: 7, c: 3
9
9
  end
10
10
 
11
- it 'mask empty' do
11
+ it "mask empty" do
12
12
  assert_equal 0x00, admin.mask
13
13
  end
14
14
 
15
- it 'mask of one flag' do
15
+ it "mask of one flag" do
16
16
  assert_equal 0x80, admin.mask(:b)
17
17
  end
18
18
 
19
- it 'mask of several flags' do
19
+ it "mask of several flags" do
20
20
  assert_equal 0x8a, admin.mask(:a, :b, :c)
21
21
  end
22
22
 
23
- it 'order is not relevant' do
23
+ it "order is not relevant" do
24
24
  mask = admin.mask(:a, :b, :c)
25
25
  assert_equal mask, admin.mask(:c, :b, :a)
26
26
  end
27
-
28
27
  end
data/test/null_test.rb CHANGED
@@ -1,17 +1,15 @@
1
- require 'test_helper'
2
-
3
- describe 'No Flags' do
1
+ require "test_helper"
4
2
 
3
+ describe "No Flags" do
5
4
  def setup
6
5
  reset_order
7
6
  Order.add_to_flags
8
7
  end
9
8
 
10
- it 'respond to ActWithFlags API' do
9
+ it "respond to ActWithFlags API" do
11
10
  assert Order.respond_to?(:add_to_flags)
12
11
  assert Order.respond_to?(:remove_from_flags)
13
12
  assert Order.respond_to?(:clear_flags_at_save)
14
13
  assert Order.respond_to?(:act_with_flags)
15
14
  end
16
-
17
15
  end
data/test/one_test.rb CHANGED
@@ -1,8 +1,7 @@
1
- # rubocop:disable all
2
- require 'test_helper'
1
+ require "test_helper"
3
2
 
4
- describe 'One Flag' do
5
- let(:flag) { :blocked }
3
+ describe "One Flag" do
4
+ let(:flag) { :blocked }
6
5
  let(:order) { Order.create }
7
6
 
8
7
  def setup
@@ -10,24 +9,23 @@ describe 'One Flag' do
10
9
  Order.add_to_flags flag
11
10
  end
12
11
 
13
- it 'set flag (:blocked)' do
12
+ it "set flag (:blocked)" do
14
13
  order.blocked = true
15
14
  assert_equal true, order.blocked
16
15
  assert_equal true, order.blocked?
17
16
 
18
- order.blocked = 'false'
17
+ order.blocked = "false"
19
18
  assert_equal false, order.blocked
20
19
  assert_equal false, order.blocked?
21
20
  end
22
21
 
23
- it 'rejects redefining' do
22
+ it "rejects redefining" do
24
23
  assert_raises { Order.add_to_flags :id }
25
24
  assert_raises { Order.add_to_flags flag }
26
25
  end
27
26
 
28
- it 'rejects redefining #2' do
27
+ it "rejects redefining #2" do
29
28
  Order.add_to_flags :berta
30
29
  assert_raises { Order.add_to_flags :berta }
31
30
  end
32
-
33
31
  end
data/test/origin_test.rb CHANGED
@@ -1,8 +1,6 @@
1
- # rubocop: disable all
1
+ require "test_helper"
2
2
 
3
- require 'test_helper'
4
-
5
- describe 'Testing origin' do
3
+ describe "Testing origin" do
6
4
  let(:admin) { Order.act_with_flags }
7
5
  let(:order) { Order.new }
8
6
 
@@ -10,30 +8,13 @@ describe 'Testing origin' do
10
8
  reset_order
11
9
  end
12
10
 
13
- it 'origin category' do
14
- Order.add_to_flags :x, origin: :category
15
- assert_equal :category, admin.origin
16
- end
17
-
18
- it 'origin category #2' do
19
- Order.add_to_flags :x, origin: :category
20
- assert_raises { Order.add_to_flags origin: :category2 }
21
- end
22
-
23
- it 'origin category #3' do
24
- Order.add_to_flags :x, origin: :category
25
- Order.add_to_flags origin: :category
11
+ it "location origin1" do
12
+ Order.add_to_flags :x, origin: :origin1
13
+ assert_equal :origin1, admin.location(:x).origin
26
14
  end
27
15
 
28
- it 'origin default' do
16
+ it "origin default" do
29
17
  Order.add_to_flags :x
30
- assert_equal :flags, admin.origin
31
- end
32
-
33
- it 'origin 1' do
34
- Order.add_to_flags origin: 1
35
- assert_equal :flags, admin.origin
36
- assert order.respond_to?(:origin)
18
+ assert_equal :flags, admin.location(:x).origin
37
19
  end
38
-
39
20
  end