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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: c854743c128a72638b17245379ce66aeb3266f3e
4
- data.tar.gz: 7d2b541357f00ac37354f6e38dd60aa8b9c59526
2
+ SHA256:
3
+ metadata.gz: 4fc53e6ac5a0128f9f263684976d027e13e7706f73b4b1e3b2bf96d6dc5a426b
4
+ data.tar.gz: 6cc90f58e9e9ac6018700d8cd3b8af276c755d9868b0e3de294c922db893fa97
5
5
  SHA512:
6
- metadata.gz: 2bdac37736e2c1f3d00f0dc63917676dc93ff4e2cfe5b6986b4df2ab81158506f98ba0d9c906d0fbc891a2c16f37ea2b266cddb879754e1ecb52df1f85d765ed
7
- data.tar.gz: 75d713fe996892ff04be45ceb278bba6126e79e30a7d0d9211432b8995a71480b4b4585c96fcc3a7ec63d8b48653750eb814e1b11ae5d3a15811df624d0d8337
6
+ metadata.gz: 23a0d96adfefb4419bc7fe09e14ed8c18f4a4422599cd2009e3e13cee5ae58a2066c9b5c652d6e54707a6814c6a00b832449554095f91b75220e1c48e219e414
7
+ data.tar.gz: 51675f7f1aff47d96aecc6e4cd420c591a9ef15a007bac07e10868edf58325b8dcf77eec47bf5c56ffc75f59e35645d75f5cfdf476899744b2d12045e38be392
data/.travis.yml CHANGED
@@ -1,4 +1,5 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.1.6
4
- - 2.2.2
3
+ - 2.3.6
4
+ - 2.4.4
5
+ - 2.5.1
data/README.md CHANGED
@@ -20,6 +20,9 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install banditry
22
22
 
23
+ NB: Banditry likely works on earlier versions of Ruby, but is only tested
24
+ against versions 2.3 and above.
25
+
23
26
  ## Usage
24
27
 
25
28
  ### Banditry::BanditMask
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.1'
22
+ spec.required_ruby_version = '>= 2.2'
23
23
 
24
- spec.add_development_dependency "bundler", "~> 1.9"
25
- spec.add_development_dependency "rake", "~> 10.0"
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'
@@ -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
- self.class.bits.fetch(bit) do
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
@@ -1,3 +1,5 @@
1
+ # frozen-string-literal: true
2
+
1
3
  module Banditry
2
- VERSION = '0.4.0'
4
+ VERSION = '0.5.0'
3
5
  end
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 generate_reader(attr, virt, cls)
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
- instance_variable_get(:"@#{virt}") ||
66
- instance_variable_set(:"@#{virt}", cls.new(send(attr)))
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, cls)
71
- respond_to? :"#{virt}=" and
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(cls.new) { |bm, bit| bm << bit }
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, cls)
87
- respond_to? :"#{virt}?" and
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
- cls.new(send(attr)).include? *bits
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.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: 2015-07-07 00:00:00.000000000 Z
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.9'
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.9'
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: '10.0'
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: '10.0'
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.1'
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.4.8
109
+ rubygems_version: 2.7.7
110
110
  signing_key:
111
111
  specification_version: 4
112
112
  summary: Generic implementation of a bitmask.