dux 0.1.0 → 0.3.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
2
  SHA1:
3
- metadata.gz: d20cd7046baebf04427f80b205d460b4931e6284
4
- data.tar.gz: 97250074fa582b00cafce8cb3b3d38fb98be0b50
3
+ metadata.gz: 8549a025dd5d4bd0d25700d7155a99ac46d222cc
4
+ data.tar.gz: 187be7a1fcfa97857bf948f846218131889aa17e
5
5
  SHA512:
6
- metadata.gz: 1fc05fe33a193d4a3298aba28c9fa7b7f7a3f63c66d3a02f95acde4545a7fa01ebea4eba930ab419ffbdf6f17e5c7f81e3e9bbd98212387db40a613fbdad4ff0
7
- data.tar.gz: f5aab9d54d3ca4c1ce2a2d2f0bd173c5f03a52a29a7dfc52237a820db20b37ce4d6f32f3975288ceb7e02304d1c4e252de62fad3458dc8cbf127e529d5e7f2ad
6
+ metadata.gz: a24dddfbe3465f64ac539c33a38c8369cb854761acaf72616b9c070c6d3b85c92c9b0effc7d022c0477ddd02fc733c9386ea886213a5568bf895fb63b062b9b2
7
+ data.tar.gz: d5ab3bff61e513d04bef1b78acb5afa218ee8dbd96cf35817913301fd9ada0e8b1ec0be57819b7571bdf593c693855571f9213ec68aa347f92d4a49ce330f241
data/.travis.yml CHANGED
@@ -1,8 +1,12 @@
1
1
  language: ruby
2
+ dist: trusty
3
+ before_install: gem install bundler -v '~> 1.14'
4
+ cache: bundler
2
5
  rvm:
3
- - 2.0.0
4
6
  - 2.1.0
5
7
  - 2.2.1
8
+ - 2.3.0
9
+ - 2.4.0
6
10
  - ruby-head
7
- - rbx-2
11
+ - rbx-3.73
8
12
  - jruby-head
data/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # Dux
1
+ # Dux [![Build Status](https://travis-ci.org/scryptmouse/dux.svg?branch=master)](https://travis-ci.org/scryptmouse/dux)
2
2
 
3
3
  A lazy duck-type matching gem that is particularly designed for use in case statements.
4
4
 
@@ -114,6 +114,12 @@ After checking out the repo, run `bin/setup` to install dependencies. Then, run
114
114
 
115
115
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release` to create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
116
116
 
117
+ ## Supported Ruby Versions
118
+
119
+ * MRI 2.1+
120
+ * Rubinius 2.5+
121
+ * jruby-head / 9.0+
122
+
117
123
  ## Contributing
118
124
 
119
125
  1. Fork it ( https://github.com/scryptmouse/dux/fork )
data/Rakefile CHANGED
@@ -1,3 +1,4 @@
1
+ require 'bundler/setup'
1
2
  require 'bundler/gem_tasks'
2
3
  require 'rspec/core/rake_task'
3
4
  require 'yard'
@@ -13,5 +14,4 @@ YARD::Rake::YardocTask.new do |t|
13
14
  t.stats_options = ['--list-undoc']
14
15
  end
15
16
 
16
- # If you want to make this the default task
17
17
  task :default => :spec
data/bin/rake ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rake' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rake", "rake")
data/bin/rspec ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+ #
4
+ # This file was generated by Bundler.
5
+ #
6
+ # The application 'rspec' is installed as part of a gem, and
7
+ # this file is here to facilitate running it.
8
+ #
9
+
10
+ require "pathname"
11
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
12
+ Pathname.new(__FILE__).realpath)
13
+
14
+ require "rubygems"
15
+ require "bundler/setup"
16
+
17
+ load Gem.bin_path("rspec-core", "rspec")
data/dux.gemspec CHANGED
@@ -18,10 +18,14 @@ Gem::Specification.new do |spec|
18
18
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
- spec.add_development_dependency "bundler", "~> 1.9"
22
- spec.add_development_dependency "rspec"
23
- spec.add_development_dependency "rake", "~> 10.0"
24
- spec.add_development_dependency "pry"
25
- spec.add_development_dependency "simplecov"
26
- spec.add_development_dependency "yard"
21
+ spec.metadata["yard.run"] = "yri"
22
+
23
+ spec.add_dependency "lru_redux"
24
+
25
+ spec.add_development_dependency "bundler", "~> 1.9"
26
+ spec.add_development_dependency "rspec", "~> 3.5"
27
+ spec.add_development_dependency "rake", "~> 12.0"
28
+ spec.add_development_dependency "pry", "~> 0.10.1"
29
+ spec.add_development_dependency "simplecov", "~> 0.14.1"
30
+ spec.add_development_dependency "yard", "~> 0.9.8"
27
31
  end
data/lib/dux.rb CHANGED
@@ -1,8 +1,17 @@
1
+ require 'delegate'
2
+
1
3
  require 'dux/version'
4
+ require 'dux/inspect_id'
5
+ require 'dux/null_object'
6
+ require 'dux/attempt'
7
+ require 'dux/blankness'
2
8
  require 'dux/duckify'
3
9
  require 'dux/hacks_like_a_duck'
4
10
  require 'dux/flock_methods'
5
11
 
12
+ require 'dux/indifferent_string'
13
+ require 'dux/enum'
14
+
6
15
  # Super simple duck-type testing.
7
16
  module Dux
8
17
  # Methods for generating "interface" checks against an array of symbols
@@ -76,8 +85,7 @@ module Dux
76
85
  #
77
86
  # @return [void]
78
87
  def add_flock_methods!
79
-
80
- Array.prepend Dux::FlockMethods
88
+ Array.__send__ :prepend, Dux::FlockMethods
81
89
 
82
90
  return nil
83
91
  end
@@ -101,7 +109,7 @@ module Dux
101
109
  #
102
110
  # @return [void]
103
111
  def extend_strings!
104
- String.prepend Dux::Duckify
112
+ String.__send__ :prepend, Dux::Duckify
105
113
 
106
114
  return nil
107
115
  end
@@ -110,7 +118,7 @@ module Dux
110
118
  #
111
119
  # @return [void]
112
120
  def extend_symbols!
113
- Symbol.prepend Dux::Duckify
121
+ Symbol.__send__ :prepend, Dux::Duckify
114
122
 
115
123
  return nil
116
124
  end
@@ -132,7 +140,7 @@ module Dux
132
140
  def array_shorthand!
133
141
  add_flock_methods!
134
142
 
135
- Array.prepend Dux::HacksLikeADuck
143
+ Array.__send__ :prepend, Dux::HacksLikeADuck
136
144
 
137
145
  nil
138
146
  end
@@ -143,7 +151,7 @@ module Dux
143
151
  # @return [void]
144
152
  def string_shorthand!
145
153
  extend_strings!
146
- String.prepend Dux::HacksLikeADuck
154
+ String.__send__ :prepend, Dux::HacksLikeADuck
147
155
 
148
156
  nil
149
157
  end
@@ -155,7 +163,7 @@ module Dux
155
163
  def symbol_shorthand!
156
164
  extend_symbols!
157
165
 
158
- Symbol.prepend Dux::HacksLikeADuck
166
+ Symbol.__send__ :prepend, Dux::HacksLikeADuck
159
167
 
160
168
  return nil
161
169
  end
@@ -0,0 +1,17 @@
1
+ module Dux
2
+ # `Object#try` for when you don't want ActiveSupport
3
+ module Attempt
4
+ # @param [Object] receiver
5
+ # @param [Symbol] method
6
+ # @param [<Object>] args
7
+ # @return [Object]
8
+ # @return [nil]
9
+ def attempt(receiver, method, *args, &block)
10
+ receiver.public_send(method, *args, &block) if receiver.respond_to?(method)
11
+ end
12
+
13
+ extend self
14
+ end
15
+
16
+ extend Attempt
17
+ end
@@ -0,0 +1,38 @@
1
+ module Dux
2
+ module Blankness
3
+ WHITESPACE_ONLY = /\A[[:space:]]+\z/
4
+
5
+ # Check if a provided object is semantically empty.
6
+ #
7
+ # @param [Object] value
8
+ def blankish?(value)
9
+ case value
10
+ when nil, false
11
+ true
12
+ when Dux[:nan?]
13
+ true
14
+ when String, Symbol
15
+ value.empty? || value =~ WHITESPACE_ONLY
16
+ when Dux[:blank?]
17
+ value.blank?
18
+ when Hash
19
+ value.empty?
20
+ when Array, Enumerable
21
+ Dux.attempt(value, :empty?) || value.all? { |val| blankish?(val) }
22
+ when Dux[:empty?]
23
+ value.empty?
24
+ else
25
+ false
26
+ end
27
+ end
28
+
29
+ # Boolean complement of {#blankish?}
30
+ #
31
+ # @param [Object] value
32
+ def presentish?(value)
33
+ !blankish?(value)
34
+ end
35
+
36
+ extend self
37
+ end
38
+ end
File without changes
data/lib/dux/enum.rb ADDED
@@ -0,0 +1,98 @@
1
+ require 'set'
2
+
3
+ module Dux
4
+ # A set of strings or symbols (indifferently stored)
5
+ # that can be used to validate options.
6
+ #
7
+ # Supports an optional default for when an invalid
8
+ # element is fetched to act as a fallback rather
9
+ # than raising an error.
10
+ class Enum
11
+ include Enumerable
12
+
13
+ NO_DEFAULT = Dux.null 'Dux::Enum::NO_DEFAULT', purpose: 'When no default has been provided'
14
+
15
+ private_constant :NO_DEFAULT
16
+
17
+ def initialize(*values, default: NO_DEFAULT, allow_nil: false)
18
+ @allow_nil = allow_nil
19
+
20
+ set_values values
21
+
22
+ set_default default
23
+ end
24
+
25
+ def default?
26
+ @default != NO_DEFAULT
27
+ end
28
+
29
+ def each
30
+ return enum_for(__method__) unless block_given?
31
+
32
+ @values.each do |value|
33
+ yield value
34
+ end
35
+ end
36
+
37
+ def fetch(value, fallback: NO_DEFAULT)
38
+ if include? value
39
+ value
40
+ elsif fallback != NO_DEFAULT
41
+ if valid_fallback?(fallback)
42
+ fallback
43
+ else
44
+ raise InvalidFallback, "Cannot use #{fallback.inspect} as a fallback"
45
+ end
46
+ elsif default?
47
+ @default
48
+ else
49
+ raise NotFound, "Invalid enum member: #{value.inspect}"
50
+ end
51
+ end
52
+
53
+ alias_method :[], :fetch
54
+
55
+ def inspect
56
+ inspection = [
57
+ @values.to_a.inspect
58
+ ]
59
+
60
+ "Dux::Enum(#{@values.to_a.inspect})"
61
+ end
62
+
63
+ alias_method :has?, :include?
64
+ alias_method :member?, :include?
65
+
66
+ private
67
+
68
+ def set_values(values)
69
+ raise TypeError, "Must provide some values", caller if values.empty?
70
+
71
+ @values = values.flatten.map do |value|
72
+ Dux::IndifferentString.new value
73
+ end.to_set
74
+ end
75
+
76
+ def valid_fallback?(fallback, default: false)
77
+ return true if fallback.nil? && @allow_nil
78
+ return true if include? fallback
79
+
80
+ false
81
+ end
82
+
83
+ def set_default(fallback)
84
+ if valid_fallback?(fallback) || fallback == NO_DEFAULT
85
+ @default = fallback
86
+ else
87
+ raise InvalidFallback, "Cannot set #{fallback.inspect} as default", caller
88
+ end
89
+ end
90
+
91
+ # Raised when there is no fallback
92
+ class NotFound < StandardError
93
+ end
94
+
95
+ class InvalidFallback < ArgumentError
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,38 @@
1
+ module Dux
2
+ class IndifferentString < DelegateClass(String)
3
+ def initialize(stringish)
4
+ stringified =
5
+ case stringish
6
+ when String then stringish
7
+ when Symbol then stringish.to_s
8
+ when Dux[:to_str] then stringish.to_str
9
+ else
10
+ if Dux.attempt(stringish, :acts_like?, :string)
11
+ stringish.to_s
12
+ else
13
+ raise TypeError, "Not a string or symbol: #{stringish}"
14
+ end
15
+ end
16
+
17
+ super(stringified)
18
+ end
19
+
20
+ def ==(other)
21
+ if other.kind_of?(Symbol)
22
+ self == other.to_s
23
+ else
24
+ super
25
+ end
26
+ end
27
+
28
+ alias_method :eql?, :==
29
+
30
+ def ===(other)
31
+ if other.kind_of?(Symbol)
32
+ self == other.to_s
33
+ else
34
+ super
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,16 @@
1
+ module Dux
2
+ module InspectID
3
+ # Calculates the id shown in the default
4
+ # version of `#inspect` methods.
5
+ #
6
+ # @param [Object] object
7
+ # @return [String]
8
+ def inspect_id(object)
9
+ "0x%0.14x" % ( object.object_id << 1 )
10
+ end
11
+
12
+ extend self
13
+ end
14
+
15
+ extend InspectID
16
+ end
@@ -0,0 +1,30 @@
1
+ module Dux
2
+ class NullObject
3
+ include Dux::InspectID
4
+
5
+ attr_reader :name
6
+ attr_reader :purpose
7
+
8
+ # @param [String] name
9
+ # @param [String] purpose
10
+ def initialize(name, purpose: 'a null object')
11
+ @name = name
12
+ @purpose = purpose
13
+ end
14
+
15
+ private
16
+ def default_name
17
+
18
+ end
19
+ end
20
+
21
+ class << self
22
+ # @param (@see Dux::NullObject#initialize)
23
+ # @return [Dux::NullObject]
24
+ def null_object(name, **options)
25
+ Dux::NullObject.new(name, **options)
26
+ end
27
+
28
+ alias_method :null, :null_object
29
+ end
30
+ end
data/lib/dux/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Dux
2
2
  # Gem version.
3
- VERSION = "0.1.0"
3
+ VERSION = "0.3.0"
4
4
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: dux
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alexa Grey
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-04-05 00:00:00.000000000 Z
11
+ date: 2017-04-06 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: lru_redux
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -28,72 +42,72 @@ dependencies:
28
42
  name: rspec
29
43
  requirement: !ruby/object:Gem::Requirement
30
44
  requirements:
31
- - - ">="
45
+ - - "~>"
32
46
  - !ruby/object:Gem::Version
33
- version: '0'
47
+ version: '3.5'
34
48
  type: :development
35
49
  prerelease: false
36
50
  version_requirements: !ruby/object:Gem::Requirement
37
51
  requirements:
38
- - - ">="
52
+ - - "~>"
39
53
  - !ruby/object:Gem::Version
40
- version: '0'
54
+ version: '3.5'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
44
58
  requirements:
45
59
  - - "~>"
46
60
  - !ruby/object:Gem::Version
47
- version: '10.0'
61
+ version: '12.0'
48
62
  type: :development
49
63
  prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
53
67
  - !ruby/object:Gem::Version
54
- version: '10.0'
68
+ version: '12.0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: pry
57
71
  requirement: !ruby/object:Gem::Requirement
58
72
  requirements:
59
- - - ">="
73
+ - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '0'
75
+ version: 0.10.1
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
- - - ">="
80
+ - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '0'
82
+ version: 0.10.1
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: simplecov
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
- - - ">="
87
+ - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '0'
89
+ version: 0.14.1
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
- - - ">="
94
+ - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '0'
96
+ version: 0.14.1
83
97
  - !ruby/object:Gem::Dependency
84
98
  name: yard
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
- - - ">="
101
+ - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '0'
103
+ version: 0.9.8
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
- - - ">="
108
+ - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '0'
110
+ version: 0.9.8
97
111
  description:
98
112
  email:
99
113
  - devel@mouse.vc
@@ -111,17 +125,27 @@ files:
111
125
  - README.md
112
126
  - Rakefile
113
127
  - bin/console
128
+ - bin/rake
129
+ - bin/rspec
114
130
  - bin/setup
115
131
  - dux.gemspec
116
132
  - lib/dux.rb
133
+ - lib/dux/attempt.rb
134
+ - lib/dux/blankness.rb
135
+ - lib/dux/duck_type.rb
117
136
  - lib/dux/duckify.rb
137
+ - lib/dux/enum.rb
118
138
  - lib/dux/flock_methods.rb
119
139
  - lib/dux/hacks_like_a_duck.rb
140
+ - lib/dux/indifferent_string.rb
141
+ - lib/dux/inspect_id.rb
142
+ - lib/dux/null_object.rb
120
143
  - lib/dux/version.rb
121
144
  homepage: https://github.com/scryptmouse/dux
122
145
  licenses:
123
146
  - MIT
124
- metadata: {}
147
+ metadata:
148
+ yard.run: yri
125
149
  post_install_message:
126
150
  rdoc_options: []
127
151
  require_paths:
@@ -138,9 +162,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
138
162
  version: '0'
139
163
  requirements: []
140
164
  rubyforge_project:
141
- rubygems_version: 2.4.5
165
+ rubygems_version: 2.6.8
142
166
  signing_key:
143
167
  specification_version: 4
144
168
  summary: Lazy duck-type matching
145
169
  test_files: []
146
- has_rdoc: