banditry 0.4.0 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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.