act_with_flags 3.1.0 → 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.
- checksums.yaml +4 -4
- data/Gemfile.lock +4 -4
- data/README.md +43 -2
- data/lib/act_with_flags/admin.rb +2 -1
- data/lib/act_with_flags/print.rb +2 -1
- data/lib/act_with_flags/utils.rb +14 -6
- data/lib/act_with_flags/version.rb +2 -1
- data/lib/act_with_flags.rb +43 -6
- data/test/range2_test.rb +59 -0
- data/test/range3_test.rb +37 -0
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c995a59c8536ec6e012c9bf671e087b9f333c7a327512a42e1ffe725f0a12a0f
|
4
|
+
data.tar.gz: 63e16f84e582fd6427846d9391e3f02b3a528cda8cbdf16670c368c719af399e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e82dc33cbc493c8b849a3053c5d28e2d73522a9308bbb7d59fa698dfa8a58c7380b9c58df082aa3190010f112c32b51583356373a935064a6f8222cb449283d7
|
7
|
+
data.tar.gz: 2fe6db8a4d0177db3d679e57b3851d79559ddbbe741352b0144cd0a6bcaba717584241bccae242e862c60bf0109c32252ca8472acdab1591ca61b3aa579ee31e
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
act_with_flags (3.1.
|
4
|
+
act_with_flags (3.1.1)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -157,7 +157,7 @@ GEM
|
|
157
157
|
regexp_parser (2.5.0)
|
158
158
|
rexml (3.2.5)
|
159
159
|
ricecream (0.2.1)
|
160
|
-
rubocop (1.35.
|
160
|
+
rubocop (1.35.1)
|
161
161
|
json (~> 2.3)
|
162
162
|
parallel (~> 1.10)
|
163
163
|
parser (>= 3.1.2.1)
|
@@ -180,8 +180,8 @@ GEM
|
|
180
180
|
simplecov-html (0.12.3)
|
181
181
|
simplecov_json_formatter (0.1.4)
|
182
182
|
sqlite3 (1.4.4)
|
183
|
-
standard (1.16.
|
184
|
-
rubocop (= 1.35.
|
183
|
+
standard (1.16.1)
|
184
|
+
rubocop (= 1.35.1)
|
185
185
|
rubocop-performance (= 1.14.3)
|
186
186
|
standardrb (1.0.1)
|
187
187
|
standard
|
data/README.md
CHANGED
@@ -23,9 +23,50 @@ $ gem install act_with_flags
|
|
23
23
|
```
|
24
24
|
|
25
25
|
|
26
|
-
## Version 3.1.
|
26
|
+
## Version 3.1.1
|
27
27
|
|
28
|
-
|
28
|
+
Option "range" can be specified just once for all
|
29
|
+
"add_to_flags" for a specific "origin".
|
30
|
+
|
31
|
+
For example:
|
32
|
+
~~~ruby
|
33
|
+
Order.add_to_flags range: ..0
|
34
|
+
...
|
35
|
+
Order.add_to_flags :a
|
36
|
+
~~~
|
37
|
+
|
38
|
+
Same as:
|
39
|
+
~~~ruby
|
40
|
+
Order.add_to_flags :a
|
41
|
+
...
|
42
|
+
Order.add_to_flags range: ..0
|
43
|
+
~~~
|
44
|
+
|
45
|
+
or:
|
46
|
+
~~~ruby
|
47
|
+
Order.add_to_flags :a, range: ..0
|
48
|
+
~~~
|
49
|
+
|
50
|
+
Examples for "range":
|
51
|
+
~~~ruby
|
52
|
+
Order.add_to_flags range: 0..17 # legal flag position from 0 to 17
|
53
|
+
Order.add_to_flags range: ..17 # legal flag position from 0 to 17
|
54
|
+
Order.add_to_flags range: nil..17 # legal flag position from 0 to 17
|
55
|
+
Order.add_to_flags range: 3.. # legal flag position from 3 to big_number
|
56
|
+
Order.add_to_flags range: 3..nil # legal flag position from 3 to big_number
|
57
|
+
~~~
|
58
|
+
|
59
|
+
Invalid ranges:
|
60
|
+
~~~ruby
|
61
|
+
Order.add_to_flags range: -1..17 # range starting with a negative position
|
62
|
+
Order.add_to_flags range: :a..:z # invalid range
|
63
|
+
Order.add_to_flags range: "a".."z" # invalid range
|
64
|
+
~~~
|
65
|
+
|
66
|
+
|
67
|
+
## Version 3.1.0
|
68
|
+
|
69
|
+
Added option "range" limiting the position of flags.
|
29
70
|
|
30
71
|
An example:
|
31
72
|
```ruby
|
data/lib/act_with_flags/admin.rb
CHANGED
@@ -1,11 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ActWithFlags::Admin
|
4
|
-
attr_reader :model
|
4
|
+
attr_reader :model, :ranges
|
5
5
|
|
6
6
|
def initialize(model)
|
7
7
|
@locations = {}
|
8
8
|
@clears = {}
|
9
|
+
@ranges = {}
|
9
10
|
@model = model
|
10
11
|
@boolean_hash = {}
|
11
12
|
[true, "true", 1, "1"].each { |x| @boolean_hash[x] = true }
|
data/lib/act_with_flags/print.rb
CHANGED
@@ -5,7 +5,6 @@ class ActWithFlags::Admin
|
|
5
5
|
res = []
|
6
6
|
res << title("Variables")
|
7
7
|
res << variables(:boolean_hash)
|
8
|
-
res << variables(:delete_mask)
|
9
8
|
|
10
9
|
res << blk("Flags sorted alfabetically") { |key, loc|
|
11
10
|
"#{key} #{loc}"
|
@@ -17,6 +16,8 @@ class ActWithFlags::Admin
|
|
17
16
|
"FLAG_#{key.upcase} = #{sprintf("0x%08X", mask(key))}"
|
18
17
|
}
|
19
18
|
|
19
|
+
res << title("@ranges")
|
20
|
+
res << @ranges
|
20
21
|
res << title("@locations")
|
21
22
|
res << @locations
|
22
23
|
res.flatten.join("\n")
|
data/lib/act_with_flags/utils.rb
CHANGED
@@ -1,19 +1,19 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class ActWithFlags::Admin
|
4
|
-
def add_flag(name, pos, origin
|
4
|
+
def add_flag(name, pos, origin)
|
5
|
+
range = ranges[origin]
|
5
6
|
accessor = name.to_sym
|
6
7
|
validate_accessor accessor, "#{accessor}?", "#{accessor}="
|
7
8
|
|
8
9
|
pos = check_pos(model, origin, pos)
|
10
|
+
msg = "Invalid position <#{pos}>"
|
11
|
+
raise(ArgumentError, msg) unless pos.is_a?(Integer)
|
12
|
+
raise(ArgumentError, msg) unless pos >= 0
|
9
13
|
loc = Location.new(model, origin, pos)
|
10
14
|
add_to_locations accessor, loc
|
11
15
|
|
12
|
-
|
13
|
-
unless range.cover?(pos)
|
14
|
-
raise RangeError, "Position <#{loc.position}> out of range <#{range}>"
|
15
|
-
end
|
16
|
-
end
|
16
|
+
validate_position(range, pos)
|
17
17
|
|
18
18
|
mask = mask(accessor)
|
19
19
|
add_accessors(accessor, origin, mask)
|
@@ -50,6 +50,14 @@ class ActWithFlags::Admin
|
|
50
50
|
reset_model model
|
51
51
|
end
|
52
52
|
|
53
|
+
def validate_position(range, position)
|
54
|
+
return if range.nil?
|
55
|
+
return if range.cover?(position)
|
56
|
+
|
57
|
+
msg = "Position #{position} out of range #{range}"
|
58
|
+
raise RangeError, msg
|
59
|
+
end
|
60
|
+
|
53
61
|
private
|
54
62
|
|
55
63
|
def validate_accessor(*names)
|
data/lib/act_with_flags.rb
CHANGED
@@ -14,13 +14,11 @@ module ActWithFlags
|
|
14
14
|
attr_reader :act_with_flags
|
15
15
|
|
16
16
|
def add_to_flags(*flags, origin: :flags, range: nil, **hash)
|
17
|
-
|
18
|
-
|
19
|
-
@act_with_flags.add_mask_et_all origin
|
20
|
-
end
|
17
|
+
origin = origin.to_sym
|
18
|
+
init(origin, range)
|
21
19
|
|
22
|
-
flags.each { |name| @act_with_flags.add_flag(name, nil, origin
|
23
|
-
hash.each { |name, pos| @act_with_flags.add_flag(name, pos, origin
|
20
|
+
flags.each { |name| @act_with_flags.add_flag(name, nil, origin) }
|
21
|
+
hash.each { |name, pos| @act_with_flags.add_flag(name, pos, origin) }
|
24
22
|
|
25
23
|
@act_with_flags
|
26
24
|
end
|
@@ -32,6 +30,45 @@ module ActWithFlags
|
|
32
30
|
def clear_flags_at_save(*flags)
|
33
31
|
@act_with_flags.clear_at_save(*flags)
|
34
32
|
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def init(origin, range)
|
37
|
+
unless @act_with_flags
|
38
|
+
@act_with_flags ||= ActWithFlags::Admin.new self
|
39
|
+
@act_with_flags.add_mask_et_all origin
|
40
|
+
end
|
41
|
+
|
42
|
+
unless range.nil?
|
43
|
+
validate_range_value range.begin
|
44
|
+
validate_range_value range.end
|
45
|
+
end
|
46
|
+
|
47
|
+
rng = @act_with_flags.ranges[origin]
|
48
|
+
unless range.nil? || (range == rng)
|
49
|
+
msg = "incompatible ranges #{range} - #{rng}"
|
50
|
+
raise ArgumentError, msg unless rng.nil?
|
51
|
+
@act_with_flags.ranges[origin] = range if range
|
52
|
+
validate_previous_positions(origin, range)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def validate_previous_positions(origin, range)
|
57
|
+
return if range.nil?
|
58
|
+
|
59
|
+
@act_with_flags.locations.each do |name, location|
|
60
|
+
next unless location.origin == origin
|
61
|
+
|
62
|
+
@act_with_flags.validate_position(range, location.position)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def validate_range_value(range_value)
|
67
|
+
return if range_value.nil?
|
68
|
+
return if range_value.is_a?(Integer) && range_value >= 0
|
69
|
+
|
70
|
+
raise RangeError, "Invalid range value #{range_value}"
|
71
|
+
end
|
35
72
|
end
|
36
73
|
end
|
37
74
|
|
data/test/range2_test.rb
ADDED
@@ -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
|
data/test/range3_test.rb
ADDED
@@ -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
|
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: 3.1.
|
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: 2022-
|
11
|
+
date: 2022-09-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -151,6 +151,8 @@ files:
|
|
151
151
|
- test/one_test.rb
|
152
152
|
- test/origin_test.rb
|
153
153
|
- test/origins_test.rb
|
154
|
+
- test/range2_test.rb
|
155
|
+
- test/range3_test.rb
|
154
156
|
- test/range_test.rb
|
155
157
|
- test/remove_from_test.rb
|
156
158
|
- test/string_test.rb
|