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,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