banditry 0.4.0 → 0.5.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.
- checksums.yaml +5 -5
- data/.travis.yml +3 -2
- data/README.md +3 -0
- data/banditry.gemspec +3 -3
- data/lib/banditry/bandit_mask.rb +33 -2
- data/lib/banditry/version.rb +3 -1
- data/lib/banditry.rb +27 -13
- metadata +8 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 4fc53e6ac5a0128f9f263684976d027e13e7706f73b4b1e3b2bf96d6dc5a426b
|
4
|
+
data.tar.gz: 6cc90f58e9e9ac6018700d8cd3b8af276c755d9868b0e3de294c922db893fa97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 23a0d96adfefb4419bc7fe09e14ed8c18f4a4422599cd2009e3e13cee5ae58a2066c9b5c652d6e54707a6814c6a00b832449554095f91b75220e1c48e219e414
|
7
|
+
data.tar.gz: 51675f7f1aff47d96aecc6e4cd420c591a9ef15a007bac07e10868edf58325b8dcf77eec47bf5c56ffc75f59e35645d75f5cfdf476899744b2d12045e38be392
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
data/banditry.gemspec
CHANGED
@@ -19,10 +19,10 @@ Gem::Specification.new do |spec|
|
|
19
19
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
20
20
|
spec.require_paths = ["lib"]
|
21
21
|
|
22
|
-
spec.required_ruby_version = '>= 2.
|
22
|
+
spec.required_ruby_version = '>= 2.2'
|
23
23
|
|
24
|
-
spec.add_development_dependency "bundler", "~> 1.
|
25
|
-
spec.add_development_dependency "rake", "~>
|
24
|
+
spec.add_development_dependency "bundler", "~> 1.15"
|
25
|
+
spec.add_development_dependency "rake", "~> 12.0"
|
26
26
|
spec.add_development_dependency 'minitest', '~> 5.7'
|
27
27
|
|
28
28
|
spec.add_development_dependency 'pry'
|
data/lib/banditry/bandit_mask.rb
CHANGED
@@ -1,5 +1,9 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
module Banditry
|
2
4
|
class BanditMask
|
5
|
+
include Enumerable
|
6
|
+
|
3
7
|
attr_reader :bitmask
|
4
8
|
|
5
9
|
def initialize(bitmask = nil) # :nodoc:
|
@@ -28,7 +32,7 @@ module Banditry
|
|
28
32
|
# bit :execute, 0b100
|
29
33
|
# end
|
30
34
|
def self.bit(name, value)
|
31
|
-
bits.update name => value
|
35
|
+
bits.update name.to_sym => value
|
32
36
|
end
|
33
37
|
|
34
38
|
##
|
@@ -52,6 +56,25 @@ module Banditry
|
|
52
56
|
end
|
53
57
|
alias_method :to_a, :bits
|
54
58
|
|
59
|
+
##
|
60
|
+
# Delegates to #bits.
|
61
|
+
#
|
62
|
+
# class MyMask < Banditry::BanditMask
|
63
|
+
# bit :read, 0b001
|
64
|
+
# bit :write, 0b010
|
65
|
+
# bit :execute, 0b100
|
66
|
+
# end
|
67
|
+
#
|
68
|
+
# mask = MyMask.new 0b101
|
69
|
+
# mask.each do |bit|
|
70
|
+
# # => :read
|
71
|
+
# # => :execute
|
72
|
+
# end
|
73
|
+
# mask.each # => #<Enumerator: ...>
|
74
|
+
def each(&block)
|
75
|
+
bits.each(&block)
|
76
|
+
end
|
77
|
+
|
55
78
|
##
|
56
79
|
# Enables the bit named +bit+. Returns +self+, so calls to #<< can be
|
57
80
|
# chained. (Think Array#<<.) Raises +ArgumentError+ if +bit+ does not
|
@@ -114,6 +137,13 @@ module Banditry
|
|
114
137
|
|
115
138
|
alias_method :eql?, :==
|
116
139
|
|
140
|
+
##
|
141
|
+
# Returns +true+ if bitmask is zero (no bits are enabled) and +false+
|
142
|
+
# otherwise.
|
143
|
+
def empty?
|
144
|
+
bitmask.zero?
|
145
|
+
end
|
146
|
+
|
117
147
|
##
|
118
148
|
# Returns an object hash. Two Banditry::BanditMask objects have identical
|
119
149
|
# hashes if they have identical bitmasks and are instances of the same
|
@@ -153,7 +183,8 @@ module Banditry
|
|
153
183
|
# Returns the integer value for the bit named +bit+. Raises +ArgumentError+
|
154
184
|
# if +bit+ has not been previously defined with Banditry::BanditMask.bit.
|
155
185
|
def bit_value(bit)
|
156
|
-
|
186
|
+
bit = bit.to_sym
|
187
|
+
self.class.bits.fetch bit do
|
157
188
|
raise ArgumentError, "undefined bit: #{bit.inspect}"
|
158
189
|
end
|
159
190
|
end
|
data/lib/banditry/version.rb
CHANGED
data/lib/banditry.rb
CHANGED
@@ -1,5 +1,8 @@
|
|
1
|
+
# frozen-string-literal: true
|
2
|
+
|
1
3
|
require 'banditry/version'
|
2
4
|
require 'banditry/bandit_mask'
|
5
|
+
require 'forwardable'
|
3
6
|
|
4
7
|
module Banditry
|
5
8
|
class BanditryError < StandardError
|
@@ -49,6 +52,9 @@ module Banditry
|
|
49
52
|
# file.mode_mask # => 5
|
50
53
|
def bandit_mask(attribute, as:, with: BanditMask)
|
51
54
|
class_eval do
|
55
|
+
extend SingleForwardable
|
56
|
+
|
57
|
+
generate_class_method as, with
|
52
58
|
generate_reader attribute, as, with
|
53
59
|
generate_writer attribute, as, with
|
54
60
|
generate_query attribute, as, with
|
@@ -57,38 +63,46 @@ module Banditry
|
|
57
63
|
|
58
64
|
private
|
59
65
|
|
60
|
-
def
|
66
|
+
def generate_class_method(virt, bandit)
|
61
67
|
respond_to? virt and
|
62
|
-
raise MethodCollisionError, "method `#{virt}` already exists"
|
68
|
+
raise MethodCollisionError, "method `#{self}.#{virt}` already exists"
|
69
|
+
|
70
|
+
def_single_delegator bandit, :bits, virt
|
71
|
+
end
|
72
|
+
|
73
|
+
def generate_reader(attr, virt, bandit)
|
74
|
+
instance_methods.include? virt and
|
75
|
+
raise MethodCollisionError, "method `#{self}##{virt}` already exists"
|
63
76
|
|
64
|
-
define_method virt do
|
65
|
-
|
66
|
-
|
77
|
+
define_method virt do |reload = false|
|
78
|
+
reload = true if !instance_variable_defined? :"@#{virt}"
|
79
|
+
instance_variable_set :"@#{virt}", bandit.new(send(attr)) if reload
|
80
|
+
instance_variable_get :"@#{virt}"
|
67
81
|
end
|
68
82
|
end
|
69
83
|
|
70
|
-
def generate_writer(attr, virt,
|
71
|
-
|
72
|
-
raise MethodCollisionError, "method `#{virt}=` already exists"
|
84
|
+
def generate_writer(attr, virt, bandit)
|
85
|
+
instance_methods.include? :"#{virt}=" and
|
86
|
+
raise MethodCollisionError, "method `#{self}##{virt}=` already exists"
|
73
87
|
|
74
88
|
define_method :"#{virt}=" do |bits|
|
75
89
|
mask = case bits
|
76
90
|
when BanditMask
|
77
91
|
bits
|
78
92
|
else
|
79
|
-
bits.inject(
|
93
|
+
bits.inject(bandit.new) { |bm, bit| bm << bit }
|
80
94
|
end
|
81
95
|
send :"#{attr}=", Integer(mask)
|
82
96
|
instance_variable_set :"@#{virt}", mask
|
83
97
|
end
|
84
98
|
end
|
85
99
|
|
86
|
-
def generate_query(attr, virt,
|
87
|
-
|
88
|
-
raise MethodCollisionError, "method `#{virt}?` already exists"
|
100
|
+
def generate_query(attr, virt, bandit)
|
101
|
+
instance_methods.include? :"#{virt}?" and
|
102
|
+
raise MethodCollisionError, "method `#{self}##{virt}?` already exists"
|
89
103
|
|
90
104
|
define_method :"#{virt}?" do |*bits|
|
91
|
-
|
105
|
+
bandit.new(send(attr)).include?(*bits)
|
92
106
|
end
|
93
107
|
end
|
94
108
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: banditry
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Parker
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-06-29 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,28 +16,28 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '1.
|
19
|
+
version: '1.15'
|
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: '1.15'
|
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: '
|
33
|
+
version: '12.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: '
|
40
|
+
version: '12.0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: minitest
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -98,7 +98,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
98
98
|
requirements:
|
99
99
|
- - ">="
|
100
100
|
- !ruby/object:Gem::Version
|
101
|
-
version: '2.
|
101
|
+
version: '2.2'
|
102
102
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
103
103
|
requirements:
|
104
104
|
- - ">="
|
@@ -106,7 +106,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
106
106
|
version: '0'
|
107
107
|
requirements: []
|
108
108
|
rubyforge_project:
|
109
|
-
rubygems_version: 2.
|
109
|
+
rubygems_version: 2.7.7
|
110
110
|
signing_key:
|
111
111
|
specification_version: 4
|
112
112
|
summary: Generic implementation of a bitmask.
|