dux 0.1.0 → 0.3.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
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: