casual_support 3.0.1 → 3.0.2

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +27 -20
  3. data/README.md +1 -0
  4. data/casual_support.gemspec +6 -4
  5. data/lib/casual_support.rb +11 -11
  6. data/lib/casual_support/boolean.rb +1 -1
  7. data/lib/casual_support/boolean/to_z.rb +0 -0
  8. data/lib/casual_support/comparable.rb +2 -2
  9. data/lib/casual_support/comparable/at_least.rb +0 -0
  10. data/lib/casual_support/comparable/at_most.rb +0 -0
  11. data/lib/casual_support/date.rb +2 -1
  12. data/lib/casual_support/date/to_hms.rb +15 -0
  13. data/lib/casual_support/date/to_ymd.rb +5 -11
  14. data/lib/casual_support/enumerable.rb +2 -2
  15. data/lib/casual_support/enumerable/duplicates.rb +2 -2
  16. data/lib/casual_support/enumerable/index_to.rb +5 -4
  17. data/lib/casual_support/hash.rb +2 -2
  18. data/lib/casual_support/hash/displace.rb +0 -0
  19. data/lib/casual_support/hash/putbang.rb +0 -0
  20. data/lib/casual_support/integer.rb +1 -1
  21. data/lib/casual_support/integer/to_hex.rb +3 -1
  22. data/lib/casual_support/numeric.rb +1 -1
  23. data/lib/casual_support/numeric/sign.rb +0 -0
  24. data/lib/casual_support/string.rb +12 -12
  25. data/lib/casual_support/string/after.rb +2 -2
  26. data/lib/casual_support/string/after_last.rb +2 -2
  27. data/lib/casual_support/string/before.rb +1 -1
  28. data/lib/casual_support/string/before_last.rb +2 -2
  29. data/lib/casual_support/string/between.rb +0 -0
  30. data/lib/casual_support/string/drop.rb +1 -1
  31. data/lib/casual_support/string/first.rb +12 -11
  32. data/lib/casual_support/string/from.rb +1 -1
  33. data/lib/casual_support/string/last.rb +12 -11
  34. data/lib/casual_support/string/prefix.rb +0 -0
  35. data/lib/casual_support/string/suffix.rb +0 -0
  36. data/lib/casual_support/string/to.rb +2 -2
  37. data/lib/casual_support/struct.rb +2 -2
  38. data/lib/casual_support/struct/assign_attributes.rb +1 -2
  39. data/lib/casual_support/struct/from_h.rb +7 -5
  40. data/lib/casual_support/time.rb +2 -2
  41. data/lib/casual_support/time/to_hms.rb +3 -1
  42. data/lib/casual_support/time/to_ymd.rb +3 -1
  43. data/lib/casual_support/version.rb +1 -1
  44. metadata +4 -29
  45. data/benchmarks/comparable/at_least.rb +0 -9
  46. data/benchmarks/comparable/at_most.rb +0 -9
  47. data/benchmarks/hash/putbang.rb +0 -13
  48. data/benchmarks/integer/to_hex.rb +0 -34
  49. data/benchmarks/string/after.rb +0 -22
  50. data/benchmarks/string/after_last.rb +0 -22
  51. data/benchmarks/string/before.rb +0 -23
  52. data/benchmarks/string/before_last.rb +0 -22
  53. data/benchmarks/string/between.rb +0 -21
  54. data/benchmarks/string/drop.rb +0 -18
  55. data/benchmarks/string/first.rb +0 -23
  56. data/benchmarks/string/from.rb +0 -15
  57. data/benchmarks/string/last.rb +0 -15
  58. data/benchmarks/string/prefix.rb +0 -12
  59. data/benchmarks/string/suffix.rb +0 -12
  60. data/benchmarks/string/to.rb +0 -15
  61. data/benchmarks/struct/assign_attributes.rb +0 -69
  62. data/benchmarks/time/to_hms.rb +0 -12
  63. data/benchmarks/time/to_ymd.rb +0 -12
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 1b2a8ad39073183db3465672af4c1fa23f91ca50fa5989d511bbbde8ca154a0a
4
- data.tar.gz: d6609b3afa3aa68098a93bfa2e27a13f72758cf02fa5783cd148878e054ab8ec
3
+ metadata.gz: e3530a25d5599a70b7b6d84c2eb83373573f09a38f0b7d071a04ea9820858eb9
4
+ data.tar.gz: acc967bb9e7a8242883be4dbadb242cda75a961b43abdbe337c06bf9b4ceb3a6
5
5
  SHA512:
6
- metadata.gz: 3dcbd960225ab5a49f1cd771b4e723ca3b8bd48c1a0a462cf2f39aeecb4b16d09241e6658559ac3097c57cc19e9b775b3f97c1ac3676c104575953c550c38006
7
- data.tar.gz: 2e97f9669ea2f060ecd3458a8358adb0caf5ee1631bb83b6fd5f0c94533b688c0e79b0b6789b9cb59bfd0ad6d65bd6305f49a8801852f3753e16d9a6a9701ae8
6
+ metadata.gz: 1a9e64d89fd2b3c920c93ecb186d3d8da6e1e7fed622bf8e9a8d85b420d63b3b0dc92b770cdff3220c6ab250af7642b9f99c634312a5f8bc45a484c2e186b29d
7
+ data.tar.gz: 5b1e4c16151b2f829315c150709cda75a17f6ba316ea73338db7df4eef2599d6f3643815b5dcc6e070c03d1e1883c4be591e81377ba01fcbdbbe57fc4c6a2a82
@@ -1,33 +1,40 @@
1
+ ## 3.0.2
2
+
3
+ * Add `Date#to_hms` dummy method
4
+ * Loosen Active Support version constraint
5
+ * Exclude benchmarks from gem
6
+
7
+
1
8
  ## 3.0.1
2
9
 
3
- * Loosened Active Support version constraint.
10
+ * Loosen Active Support version constraint
4
11
 
5
12
 
6
13
  ## 3.0.0
7
14
 
8
- * Added `Numeric#sign`.
9
- * Added `Boolean#to_z`.
10
- * Added `Hash#displace`.
11
- * Added `Struct#assign_attributes`.
12
- * Added `Struct.from_h`.
13
- * [BREAKING] Removed block param from `Enumerable#duplicates`.
14
- * [BREAKING] Removed `Comparable#clamp`. Native in Ruby 2.4.
15
- * [BREAKING] Removed `String#lchomp`. Native in Ruby 2.5 as
16
- `String#delete_prefix`.
15
+ * [BREAKING] Remove block param from `Enumerable#duplicates`
16
+ * [BREAKING] Remove `Comparable#clamp`. (Native in Ruby 2.4.)
17
+ * [BREAKING] Remove `String#lchomp`. (Native in Ruby 2.5 as
18
+ `String#delete_prefix`.)
19
+ * Add `Numeric#sign`
20
+ * Add `Boolean#to_z`
21
+ * Add `Hash#displace`
22
+ * Add `Struct#assign_attributes`
23
+ * Add `Struct.from_h`
17
24
 
18
25
 
19
26
  ## 2.0.0
20
27
 
21
- * Added `String#between`.
22
- * Added `String#prefix`.
23
- * Added `String#suffix`.
24
- * Added `String#lchomp`.
25
- * Abstracted `Numeric#at_least`, `Numeric#at_most`, and
26
- `Numeric#constrain` methods to the `Comparable` module.
27
- * [BREAKING] Renamed `Comparable#constrain` to `Comparable#clamp`.
28
- * [BREAKING] Renamed `Hash#set!` to `Hash#put!`.
29
- * [BREAKING] Changed `String#after` and `String#after_last` to return
30
- nil if delimiter is not found.
28
+ * [BREAKING] Rename `Comparable#constrain` to `Comparable#clamp`
29
+ * [BREAKING] Rename `Hash#set!` to `Hash#put!`
30
+ * [BREAKING] Change `String#after` and `String#after_last` to return
31
+ `nil` if delimiter is not found
32
+ * Add `String#between`
33
+ * Add `String#prefix`
34
+ * Add `String#suffix`
35
+ * Add `String#lchomp`
36
+ * Move `Numeric#at_least`, `Numeric#at_most`, and `Numeric#constrain` to
37
+ Comparable
31
38
 
32
39
 
33
40
  ## 1.0.0
data/README.md CHANGED
@@ -25,6 +25,7 @@ itself in a few ways:
25
25
  - [#at_least](http://www.rubydoc.info/gems/casual_support/Comparable:at_least)
26
26
  - [#at_most](http://www.rubydoc.info/gems/casual_support/Comparable:at_most)
27
27
  - [Date](http://www.rubydoc.info/gems/casual_support/Date)
28
+ - [#to_hms](http://www.rubydoc.info/gems/casual_support/Date:to_hms)
28
29
  - [#to_ymd](http://www.rubydoc.info/gems/casual_support/Date:to_ymd)
29
30
  - [Enumerable](http://www.rubydoc.info/gems/casual_support/Enumerable)
30
31
  - [#duplicates](http://www.rubydoc.info/gems/casual_support/Enumerable:duplicates)
@@ -1,7 +1,7 @@
1
1
  # coding: utf-8
2
- lib = File.expand_path('../lib', __FILE__)
2
+ lib = File.expand_path("../lib", __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
- require 'casual_support/version'
4
+ require "casual_support/version"
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = "casual_support"
@@ -13,12 +13,14 @@ Gem::Specification.new do |spec|
13
13
  spec.homepage = "https://github.com/jonathanhefner/casual_support"
14
14
  spec.license = "MIT"
15
15
 
16
- spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features|benchmarks)/})
18
+ end
17
19
  spec.bindir = "exe"
18
20
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
21
  spec.require_paths = ["lib"]
20
22
 
21
- spec.add_runtime_dependency 'activesupport', '>= 3.1', '< 6.0'
23
+ spec.add_runtime_dependency "activesupport", ">= 3.1"
22
24
 
23
25
  spec.add_development_dependency "bundler", "~> 1.12"
24
26
  spec.add_development_dependency "rake", "~> 11.1"
@@ -1,11 +1,11 @@
1
- require_relative 'casual_support/version'
2
- require_relative 'casual_support/boolean'
3
- require_relative 'casual_support/comparable'
4
- require_relative 'casual_support/date'
5
- require_relative 'casual_support/enumerable'
6
- require_relative 'casual_support/hash'
7
- require_relative 'casual_support/integer'
8
- require_relative 'casual_support/numeric'
9
- require_relative 'casual_support/string'
10
- require_relative 'casual_support/struct'
11
- require_relative 'casual_support/time'
1
+ require_relative "casual_support/version"
2
+ require_relative "casual_support/boolean"
3
+ require_relative "casual_support/comparable"
4
+ require_relative "casual_support/date"
5
+ require_relative "casual_support/enumerable"
6
+ require_relative "casual_support/hash"
7
+ require_relative "casual_support/integer"
8
+ require_relative "casual_support/numeric"
9
+ require_relative "casual_support/string"
10
+ require_relative "casual_support/struct"
11
+ require_relative "casual_support/time"
@@ -1 +1 @@
1
- require_relative 'boolean/to_z'
1
+ require_relative "boolean/to_z"
File without changes
@@ -1,2 +1,2 @@
1
- require_relative 'comparable/at_least'
2
- require_relative 'comparable/at_most'
1
+ require_relative "comparable/at_least"
2
+ require_relative "comparable/at_most"
File without changes
File without changes
@@ -1 +1,2 @@
1
- require_relative 'date/to_ymd'
1
+ require_relative "date/to_hms"
2
+ require_relative "date/to_ymd"
@@ -0,0 +1,15 @@
1
+ require "date"
2
+
3
+
4
+ class Date
5
+
6
+ # Returns "00:00:00".
7
+ #
8
+ # Provided for parity with {Time#to_hms}.
9
+ #
10
+ # @return [String]
11
+ def to_hms
12
+ "00:00:00"
13
+ end
14
+
15
+ end
@@ -1,19 +1,13 @@
1
- require 'date'
1
+ require "date"
2
+
2
3
 
3
4
  class Date
4
5
 
5
- # Formats the Date as "YYYY-MM-DD". Equivalent to
6
- # +strftime("%Y-%m-%d")+.
6
+ # Alias of +Date#to_s+. Formats the Date as "YYYY-MM-DD".
7
7
  #
8
- # @example
9
- # Date.new(1999, 12, 31).to_ymd # == "1999-12-31"
8
+ # Provided for parity with {Time#to_hms}.
10
9
  #
11
10
  # @return [String]
12
- def to_ymd
13
- # Date#strftime appears to be **much** faster than Time#strftime
14
- # (nearly 3x faster!). Thus it is used here, unlike Time#to_ymd
15
- # which uses sprintf.
16
- self.strftime('%Y-%m-%d'.freeze)
17
- end
11
+ alias :to_ymd :to_s
18
12
 
19
13
  end
@@ -1,2 +1,2 @@
1
- require_relative 'enumerable/duplicates'
2
- require_relative 'enumerable/index_to'
1
+ require_relative "enumerable/duplicates"
2
+ require_relative "enumerable/index_to"
@@ -1,7 +1,7 @@
1
1
  module Enumerable
2
2
 
3
- # Returns the first duplicate of each element, preserving order of
4
- # appearance.
3
+ # Returns the first-appearing duplicate of each element, preserving
4
+ # order of appearance.
5
5
  #
6
6
  # @example
7
7
  # %w[a a b c c b a d].duplicates # == ["a", "c", "b"]
@@ -1,4 +1,4 @@
1
- require_relative '../hash/putbang'
1
+ require_relative "../hash/putbang"
2
2
 
3
3
  module Enumerable
4
4
 
@@ -8,9 +8,10 @@ module Enumerable
8
8
  # @example
9
9
  # cache = id_list.index_to{|id| find_by_id(id) }
10
10
  #
11
- # @yieldparam element ['E] element from the Enumerable
12
- # @yieldreturn ['V] value to associate with the +element+ key
13
- # @return [Hash{'E => 'V}]
11
+ # @yield [key]
12
+ # @yieldparam key ['K]
13
+ # @yieldreturn ['V]
14
+ # @return [Hash<'K, 'V>]
14
15
  def index_to()
15
16
  self.reduce({}){|h, k| h.put!(k, (yield k)) }
16
17
  end
@@ -1,2 +1,2 @@
1
- require_relative 'hash/displace'
2
- require_relative 'hash/putbang'
1
+ require_relative "hash/displace"
2
+ require_relative "hash/putbang"
File without changes
File without changes
@@ -1 +1 @@
1
- require_relative 'integer/to_hex'
1
+ require_relative "integer/to_hex"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Integer
2
4
 
3
5
  # Formats the Integer as a zero-padded lower-case hexadecimal string.
@@ -13,7 +15,7 @@ class Integer
13
15
  # @param width [Integer]
14
16
  # @return [String]
15
17
  def to_hex(width = 0)
16
- width > 1 ? self.to_s(16).rjust(width, '0'.freeze) : self.to_s(16)
18
+ width > 1 ? self.to_s(16).rjust(width, "0") : self.to_s(16)
17
19
  end
18
20
 
19
21
  end
@@ -1 +1 @@
1
- require_relative 'numeric/sign'
1
+ require_relative "numeric/sign"
File without changes
@@ -1,12 +1,12 @@
1
- require_relative 'string/after'
2
- require_relative 'string/after_last'
3
- require_relative 'string/before'
4
- require_relative 'string/before_last'
5
- require_relative 'string/between'
6
- require_relative 'string/drop'
7
- require_relative 'string/first'
8
- require_relative 'string/from'
9
- require_relative 'string/last'
10
- require_relative 'string/prefix'
11
- require_relative 'string/suffix'
12
- require_relative 'string/to'
1
+ require_relative "string/after"
2
+ require_relative "string/after_last"
3
+ require_relative "string/before"
4
+ require_relative "string/before_last"
5
+ require_relative "string/between"
6
+ require_relative "string/drop"
7
+ require_relative "string/first"
8
+ require_relative "string/from"
9
+ require_relative "string/last"
10
+ require_relative "string/prefix"
11
+ require_relative "string/suffix"
12
+ require_relative "string/to"
@@ -2,8 +2,8 @@ class String
2
2
 
3
3
  # Searches for the first occurrence of a delimiter, and returns the
4
4
  # portion of the String after that. If the delimiter is not found,
5
- # returns nil. Equivalent to +split(delimiter, 2)[1]+ for non-empty
6
- # delimiters.
5
+ # returns nil. Equivalent to <code>split(delimiter, 2).drop(1)[-1]</code>
6
+ # for non-empty delimiters.
7
7
  #
8
8
  # @example
9
9
  # "http://www.example.com".after("://") # == "www.example.com"
@@ -2,8 +2,8 @@ class String
2
2
 
3
3
  # Searches for the last occurrence of a delimiter, and returns the
4
4
  # portion of the String after that. If the delimiter is not found,
5
- # returns nil. Equivalent to +split(delimiter, -1).drop(1)[-1]+ for
6
- # non-empty delimiters.
5
+ # returns nil. Equivalent to <code>split(delimiter, -1).drop(1)[-1]</code>
6
+ # for non-empty delimiters.
7
7
  #
8
8
  # @example
9
9
  # "/path/to/file".after_last("/") # == "file"
@@ -3,7 +3,7 @@ class String
3
3
  # Searches for the first occurrence of a delimiter, and returns the
4
4
  # portion of the String before that. If the delimiter is not found,
5
5
  # returns a copy of the original String. Equivalent to
6
- # +split(delimiter, 2)[0]+ for non-empty delimiters.
6
+ # <code>split(delimiter, 2)[0]</code> for non-empty delimiters.
7
7
  #
8
8
  # @example
9
9
  # "http://www.example.com".before("://") # == "http"
@@ -3,8 +3,8 @@ class String
3
3
  # Searches for the last occurrence of a delimiter, and returns the
4
4
  # portion of the String before that. If the delimiter is not found,
5
5
  # returns a copy of the original String. Equivalent to
6
- # +split(delimiter, -1)[0..-2].join(delimiter)+ for existent
7
- # delimiters.
6
+ # <code>split(delimiter, -1)[0...-1].join(delimiter)</code> for
7
+ # existent delimiters.
8
8
  #
9
9
  # @example
10
10
  # "/path/to/file".before_last("/") # == "/path/to"
File without changes
@@ -14,7 +14,7 @@ class String
14
14
  # @return [String]
15
15
  def drop(n)
16
16
  return self.dup if n <= 0
17
- self[n, self.length] || ''
17
+ self[n, self.length] || ""
18
18
  end
19
19
 
20
20
  end
@@ -1,4 +1,4 @@
1
- require 'active_support/core_ext/string/access'
1
+ require "active_support/core_ext/string/access"
2
2
 
3
3
  class String
4
4
 
@@ -7,15 +7,16 @@ class String
7
7
  # Returns the first +limit+ characters from the beginning of the
8
8
  # String.
9
9
  #
10
- # This method replaces Active Support's +String#first+, except that it
11
- # returns an empty string when given a negative +limit+ argument,
12
- # whereas Active Support's +String#first+ removes +limit.abs+
13
- # characters from the end of the String. Returning an empty string
14
- # makes more sense if you interpret +first+ as "keep upto +limit+
15
- # characters." (At most, a negative +limit+ should *keep* that many
16
- # characters from the end of the String, rather than *remove* that
17
- # many characters, but returning an empty string is a good
18
- # conservative choice.) This method is also faster.
10
+ # This method replaces Active Support's +String#first+. However, it
11
+ # returns an empty string when given a negative +limit+, whereas
12
+ # Active Support 6.0 and previous remove +limit.abs+ characters from
13
+ # the end of the String. Returning an empty string is more intuitive
14
+ # behavior if +first+ is interpreted as "keep up to +limit+
15
+ # characters." (At most, a negative +limit+ should *keep* +limit.abs+
16
+ # characters from the end of the String, instead of *remove* that many
17
+ # characters, but returning an empty string is a conservative
18
+ # compromise.) This method is also faster than Active Support's
19
+ # implementation.
19
20
  #
20
21
  # @example
21
22
  # "abcdef".first(0) # == ""
@@ -27,7 +28,7 @@ class String
27
28
  # @param limit [Integer]
28
29
  # @return [String]
29
30
  def first(limit = 1)
30
- self[0, limit] || ''
31
+ self[0, limit] || ""
31
32
  end
32
33
 
33
34
  end
@@ -1,4 +1,4 @@
1
- require 'active_support/core_ext/string/access'
1
+ require "active_support/core_ext/string/access"
2
2
 
3
3
  class String
4
4
 
@@ -1,4 +1,4 @@
1
- require 'active_support/core_ext/string/access'
1
+ require "active_support/core_ext/string/access"
2
2
 
3
3
  class String
4
4
 
@@ -6,15 +6,16 @@ class String
6
6
 
7
7
  # Returns the last +limit+ characters from the end of the String.
8
8
  #
9
- # This method replaces Active Support's +String#last+, except that it
10
- # returns an empty string when given a negative +limit+ argument,
11
- # whereas Active Support's +String#last+ removes +limit.abs+
12
- # characters from the beginning of the String. Returning an empty
13
- # string makes more sense if you interpret +last+ as "keep upto
14
- # +limit+ characters." (At most, a negative +limit+ should *keep*
15
- # that many characters from the beginning of the String, rather than
16
- # *remove* that many characters, but returning an empty string is a
17
- # good conservative choice.) This method is also faster.
9
+ # This method replaces Active Support's +String#last+. However, it
10
+ # returns an empty string when given a negative +limit+, whereas
11
+ # Active Support 6.0 and previous remove +limit.abs+ characters from
12
+ # the beginning of the String. Returning an empty string is more
13
+ # intuitive behavior if +last+ is interpreted as "keep up to +limit+
14
+ # characters." (At most, a negative +limit+ should *keep* +limit.abs+
15
+ # characters from the beginning of the String, instead of *remove*
16
+ # that many characters, but returning an empty string is a
17
+ # conservative compromise.) This method is also faster than Active
18
+ # Support's implementation.
18
19
  #
19
20
  # @example
20
21
  # "abcdef".last(0) # == ""
@@ -26,7 +27,7 @@ class String
26
27
  # @param limit [Integer]
27
28
  # @return [String]
28
29
  def last(limit = 1)
29
- limit < 0 ? '' : (self[-limit, limit] || self.dup)
30
+ self[[length - limit, 0].max, limit] || ""
30
31
  end
31
32
 
32
33
  end
File without changes
File without changes
@@ -1,4 +1,4 @@
1
- require 'active_support/core_ext/string/access'
1
+ require "active_support/core_ext/string/access"
2
2
 
3
3
  class String
4
4
 
@@ -19,7 +19,7 @@ class String
19
19
  # @return [String]
20
20
  def to(position)
21
21
  position += self.length if position < 0
22
- self[0, position + 1] || ''
22
+ self[0, position + 1] || ""
23
23
  end
24
24
 
25
25
  end
@@ -1,2 +1,2 @@
1
- require_relative 'struct/assign_attributes'
2
- require_relative 'struct/from_h'
1
+ require_relative "struct/assign_attributes"
2
+ require_relative "struct/from_h"
@@ -9,8 +9,7 @@ class Struct
9
9
  # Point = Struct.new(:x, :y, :z)
10
10
  # point = Point.new(10, 20, 30)
11
11
  #
12
- # point.assign_attributes(y: 30, z: 50) # == point
13
- # point.to_h # == { x: 10, y: 30, z: 50 }
12
+ # point.assign_attributes(y: 30, z: 50).to_h # == { x: 10, y: 30, z: 50 }
14
13
  #
15
14
  # @param new_attributes [Hash<Symbol, Object>, Hash<String, Object>]
16
15
  # @return [self]
@@ -1,19 +1,21 @@
1
- require_relative 'assign_attributes'
1
+ require_relative "assign_attributes"
2
2
 
3
3
  class Struct
4
4
 
5
5
  # Constructs an instance of a subclass of Struct, and assigns the
6
6
  # values of the given attribute Hash to the instance. This method is
7
7
  # intended for use only with subclasses of Struct which do not alter
8
- # the default signature of the +initialize+ method. See also
9
- # {Struct#assign_attributes}.
8
+ # the default signature of the +initialize+ method.
9
+ #
10
+ # @see Struct#assign_attributes
10
11
  #
11
12
  # @example
12
13
  # Point = Struct.new(:x, :y, :z)
13
- # p = Point.from_h(x: 10, y: 20, z: 30) # == Point.new(10, 20, 30)
14
+ #
15
+ # Point.from_h(x: 10, y: 20, z: 30) # == Point.new(10, 20, 30)
14
16
  #
15
17
  # @param attributes [Hash<Symbol, Object>, Hash<String, Object>]
16
- # @return [self.new]
18
+ # @return [Struct]
17
19
  def self.from_h(attributes)
18
20
  raise "Struct.from_h is for use only with subclasses of Struct" if self == Struct
19
21
  self.new.assign_attributes(attributes)
@@ -1,2 +1,2 @@
1
- require_relative 'time/to_hms'
2
- require_relative 'time/to_ymd'
1
+ require_relative "time/to_hms"
2
+ require_relative "time/to_ymd"
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Time
2
4
 
3
5
  # Formats the Time as "HH:MM:SS". Equivalent to
@@ -11,7 +13,7 @@ class Time
11
13
  # Date#strftime appears to be **much** faster than Time#strftime
12
14
  # (nearly 3x faster!). If Time#strftime becomes optimized to that
13
15
  # level in the future, it should be used instead of sprintf.
14
- sprintf('%02d:%02d:%02d'.freeze, hour, min, sec)
16
+ sprintf("%02d:%02d:%02d", hour, min, sec)
15
17
  end
16
18
 
17
19
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class Time
2
4
 
3
5
  # Formats the Time as "YYYY-MM-DD". Equivalent to
@@ -11,7 +13,7 @@ class Time
11
13
  # Date#strftime appears to be **much** faster than Time#strftime
12
14
  # (nearly 3x faster!). If Time#strftime becomes optimized to that
13
15
  # level in the future, it should be used instead of sprintf.
14
- sprintf('%04d-%02d-%02d'.freeze, year, month, day)
16
+ sprintf("%04d-%02d-%02d", year, month, day)
15
17
  end
16
18
 
17
19
  end
@@ -1,3 +1,3 @@
1
1
  module CasualSupport
2
- VERSION = "3.0.1"
2
+ VERSION = "3.0.2"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: casual_support
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.1
4
+ version: 3.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Hefner
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-07-28 00:00:00.000000000 Z
11
+ date: 2019-07-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -17,9 +17,6 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: '3.1'
20
- - - "<"
21
- - !ruby/object:Gem::Version
22
- version: '6.0'
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,9 +24,6 @@ dependencies:
27
24
  - - ">="
28
25
  - !ruby/object:Gem::Version
29
26
  version: '3.1'
30
- - - "<"
31
- - !ruby/object:Gem::Version
32
- version: '6.0'
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: bundler
35
29
  requirement: !ruby/object:Gem::Requirement
@@ -114,25 +108,6 @@ files:
114
108
  - LICENSE.txt
115
109
  - README.md
116
110
  - Rakefile
117
- - benchmarks/comparable/at_least.rb
118
- - benchmarks/comparable/at_most.rb
119
- - benchmarks/hash/putbang.rb
120
- - benchmarks/integer/to_hex.rb
121
- - benchmarks/string/after.rb
122
- - benchmarks/string/after_last.rb
123
- - benchmarks/string/before.rb
124
- - benchmarks/string/before_last.rb
125
- - benchmarks/string/between.rb
126
- - benchmarks/string/drop.rb
127
- - benchmarks/string/first.rb
128
- - benchmarks/string/from.rb
129
- - benchmarks/string/last.rb
130
- - benchmarks/string/prefix.rb
131
- - benchmarks/string/suffix.rb
132
- - benchmarks/string/to.rb
133
- - benchmarks/struct/assign_attributes.rb
134
- - benchmarks/time/to_hms.rb
135
- - benchmarks/time/to_ymd.rb
136
111
  - casual_support.gemspec
137
112
  - lib/casual_support.rb
138
113
  - lib/casual_support/boolean.rb
@@ -141,6 +116,7 @@ files:
141
116
  - lib/casual_support/comparable/at_least.rb
142
117
  - lib/casual_support/comparable/at_most.rb
143
118
  - lib/casual_support/date.rb
119
+ - lib/casual_support/date/to_hms.rb
144
120
  - lib/casual_support/date/to_ymd.rb
145
121
  - lib/casual_support/enumerable.rb
146
122
  - lib/casual_support/enumerable/duplicates.rb
@@ -191,8 +167,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
191
167
  - !ruby/object:Gem::Version
192
168
  version: '0'
193
169
  requirements: []
194
- rubyforge_project:
195
- rubygems_version: 2.7.6
170
+ rubygems_version: 3.0.1
196
171
  signing_key:
197
172
  specification_version: 4
198
173
  summary: Utility extensions to core objects, a la Active Support
@@ -1,9 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- Benchmark.inputs([*1..10]) do |job|
6
- job.report('Comparable#at_least'){|i| i.at_least(5) }
7
- job.report('Array#max'){|i| [i, 5].max }
8
- job.compare!
9
- end
@@ -1,9 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- Benchmark.inputs([*1..10]) do |job|
6
- job.report('Comparable#at_most'){|i| i.at_most(5) }
7
- job.report('Array#min'){|i| [i, 5].min }
8
- job.compare!
9
- end
@@ -1,13 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- Benchmark.inputs([[1], [*1..10], [*1..100]]) do |job|
6
- job.report('reduce{ put! }') do |ary|
7
- ary.reduce({}){|h, i| h.put!(i, i) }
8
- end
9
- job.report('reduce{ merge! }') do |ary|
10
- ary.reduce({}){|h, i| h.merge!(i => i) }
11
- end
12
- job.compare!
13
- end
@@ -1,34 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class Integer
6
-
7
- def to_hex_alt1(width = nil)
8
- h = self.to_s(16)
9
- width ? h.rjust(width, '0'.freeze) : h
10
- end
11
-
12
- def to_hex_alt2(width = 0)
13
- h = self.to_s(16)
14
- width > h.length ? h.rjust(width, '0'.freeze) : h
15
- end
16
-
17
- end
18
-
19
-
20
- Benchmark.inputs([*0..8]) do |job|
21
- job.report('Integer#to_hex'){|width| (210).to_hex(width) }
22
- job.report('Integer#to_hex_alt1'){|width| (210).to_hex_alt1(width) }
23
- job.report('Integer#to_hex_alt2'){|width| (210).to_hex_alt2(width) }
24
- job.report('sprintf'){|width| sprintf("%0#{width}x", 210) }
25
- job.compare!
26
- end
27
-
28
- Benchmark.inputs([nil]) do |job|
29
- job.report('Integer#to_hex'){|width| (210).to_hex }
30
- job.report('Integer#to_hex_alt1'){|width| (210).to_hex_alt1 }
31
- job.report('Integer#to_hex_alt2'){|width| (210).to_hex_alt2 }
32
- job.report('Integer#to_s'){|width| (210).to_s(16) }
33
- job.compare!
34
- end
@@ -1,22 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class String
6
-
7
- def after_alt1(delim)
8
- i = self.index(delim)
9
- i && self.drop(i + delim.length)
10
- end
11
-
12
- end
13
-
14
-
15
- STRING = 'abcnoonxyz'
16
-
17
- Benchmark.inputs(STRING.chars << '_') do |job|
18
- job.report('String#after'){|delim| STRING.after(delim) }
19
- job.report('String#after_alt1'){|delim| STRING.after_alt1(delim) }
20
- job.report('String#split'){|delim| STRING.split(delim, 2)[1] }
21
- job.compare!
22
- end
@@ -1,22 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class String
6
-
7
- def after_last_alt1(delim)
8
- i = self.rindex(delim)
9
- i && self.drop(i + delim.length)
10
- end
11
-
12
- end
13
-
14
-
15
- STRING = 'abcnoonxyz'
16
-
17
- Benchmark.inputs(STRING.chars << '_') do |job|
18
- job.report('String#after_last'){|delim| STRING.after_last(delim) }
19
- job.report('String#after_last_alt1'){|delim| STRING.after_last_alt1(delim) }
20
- job.report('String#split'){|delim| STRING.split(delim, -1).drop(1).last }
21
- job.compare!
22
- end
@@ -1,23 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class String
6
-
7
- def before_alt1(delim)
8
- i = self.index(delim)
9
- i ? self.first(i) : self.dup
10
- end
11
-
12
- end
13
-
14
-
15
-
16
- STRING = 'abcnoonxyz'
17
-
18
- Benchmark.inputs(STRING.chars << '_') do |job|
19
- job.report('String#before'){|delim| STRING.before(delim) }
20
- job.report('String#before_alt1'){|delim| STRING.before_alt1(delim) }
21
- job.report('String#split'){|delim| STRING.split(delim, 2).first }
22
- job.compare!
23
- end
@@ -1,22 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class String
6
-
7
- def before_last_alt1(delim)
8
- i = self.rindex(delim)
9
- i ? self.first(i) : self.dup
10
- end
11
-
12
- end
13
-
14
-
15
- STRING = 'abcnoonxyz'
16
-
17
- Benchmark.inputs(STRING.chars << '_') do |job|
18
- job.report('String#before_last'){|delim| STRING.before_last(delim) }
19
- job.report('String#before_last_alt1'){|delim| STRING.before_last_alt1(delim) }
20
- job.report('String#split'){|delim| STRING.split(delim, -1)[0..-2].join(delim) }
21
- job.compare!
22
- end
@@ -1,21 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class String
6
-
7
- def between_alt1(open, close)
8
- s = self.after(open)
9
- s && s.before(close) # fails to return nil if `close` is missing
10
- end
11
-
12
- end
13
-
14
-
15
- STRING = 'key="111-delim-222-delim-333"'
16
-
17
- Benchmark.inputs(['"', '-delim-', '!']) do |job|
18
- job.report('String#between'){|delim| STRING.between(delim, delim) }
19
- job.report('String#between_alt1'){|delim| STRING.between_alt1(delim, delim) }
20
- job.compare!
21
- end
@@ -1,18 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class String
6
- def drop_alt1(n)
7
- self[n.constrain(0, self.length), self.length]
8
- end
9
- end
10
-
11
-
12
- STRING = 'abcdef'
13
-
14
- Benchmark.inputs([*0..(STRING.length + 1)]) do |job|
15
- job.report('String#drop'){|n| STRING.drop(n) }
16
- job.report('String#drop_alt1'){|n| STRING.drop_alt1(n) }
17
- job.compare!
18
- end
@@ -1,23 +0,0 @@
1
- require 'benchmark/inputs'
2
- require 'active_support/all'
3
- class String
4
- alias_method :old_first, :first
5
- end
6
- require_relative '../../lib/casual_support'
7
-
8
-
9
- class String
10
- def first_alt1(limit = 1)
11
- limit <= 0 ? '' : self[0, limit]
12
- end
13
- end
14
-
15
-
16
- STRING = 'abcdef'
17
-
18
- Benchmark.inputs([*0..(STRING.length + 1)]) do |job|
19
- job.report('casual_support String#first'){|n| STRING.first(n) }
20
- job.report('casual_support String#first_alt1'){|n| STRING.first_alt1(n) }
21
- job.report('active_support String#first'){|n| STRING.old_first(n) }
22
- job.compare!
23
- end
@@ -1,15 +0,0 @@
1
- require 'benchmark/inputs'
2
- require 'active_support/all'
3
- class String
4
- alias_method :old_from, :from
5
- end
6
- require_relative '../../lib/casual_support'
7
-
8
-
9
- STRING = 'abcdef'
10
-
11
- Benchmark.inputs([*0..(STRING.length + 1)]) do |job|
12
- job.report('casual_support String#from'){|n| STRING.from(n) }
13
- job.report('active_support String#from'){|n| STRING.old_from(n) }
14
- job.compare!
15
- end
@@ -1,15 +0,0 @@
1
- require 'benchmark/inputs'
2
- require 'active_support/all'
3
- class String
4
- alias_method :old_last, :last
5
- end
6
- require_relative '../../lib/casual_support'
7
-
8
-
9
- STRING = 'abcdef'
10
-
11
- Benchmark.inputs([*0..(STRING.length + 1)]) do |job|
12
- job.report('casual_support String#last'){|n| STRING.last(n) }
13
- job.report('active_support String#last'){|n| STRING.old_last(n) }
14
- job.compare!
15
- end
@@ -1,12 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- PREFIX = 'abc'
6
- PREFIX_REGEX = /^(?!abc)/
7
-
8
- Benchmark.inputs(['xyz', 'abxyz', 'abcxyz', '']) do |job|
9
- job.report('String#prefix'){|s| s.prefix(PREFIX) }
10
- job.report('String#gsub'){|s| s.gsub(PREFIX_REGEX, PREFIX) }
11
- job.compare!
12
- end
@@ -1,12 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- SUFFIX = 'xyz'
6
- SUFFIX_REGEX = /^(?!xyz)/
7
-
8
- Benchmark.inputs(['abc', 'abcyz', 'abcxyz', '']) do |job|
9
- job.report('String#suffix'){|s| s.suffix(SUFFIX) }
10
- job.report('String#gsub'){|s| s.gsub(SUFFIX_REGEX, SUFFIX) }
11
- job.compare!
12
- end
@@ -1,15 +0,0 @@
1
- require 'benchmark/inputs'
2
- require 'active_support/all'
3
- class String
4
- alias_method :old_to, :to
5
- end
6
- require_relative '../../lib/casual_support'
7
-
8
-
9
- STRING = 'abcdef'
10
-
11
- Benchmark.inputs([*0..(STRING.length + 1)]) do |job|
12
- job.report('casual_support String#to'){|n| STRING.to(n) }
13
- job.report('active_support String#to'){|n| STRING.old_to(n) }
14
- job.compare!
15
- end
@@ -1,69 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- class Struct
6
-
7
- def assign_attributes_alt1(new_attributes)
8
- self.members.each do |m|
9
- if new_attributes.key?(m)
10
- self[m] = new_attributes[m]
11
- elsif new_attributes.key?(m.to_s)
12
- self[m] = new_attributes[m.to_s]
13
- end
14
- end
15
- self
16
- end
17
-
18
- def assign_attributes_alt2(new_attributes)
19
- self.members.each do |m|
20
- if new_attributes.key?(m)
21
- self[m] = new_attributes[m]
22
- elsif new_attributes.key?(m_s = m.to_s)
23
- self[m] = new_attributes[m_s]
24
- end
25
- end
26
- self
27
- end
28
-
29
- def assign_attributes_alt3(new_attributes)
30
- new_attributes.each do |k, v|
31
- self[k.to_sym] = v if self.members.include?(k.to_sym)
32
- end
33
- self
34
- end
35
-
36
- def assign_attributes_alt4(new_attributes)
37
- new_attributes.each do |k, v|
38
- m = k.to_sym
39
- self[m] = v if self.members.include?(m)
40
- end
41
- self
42
- end
43
-
44
- end
45
-
46
-
47
- Subject = Struct.new(:attr1, :attr2, :attr3)
48
- subject = Subject.new(1, 2, 3)
49
-
50
- input_attributes = [
51
- { attr1: 11 },
52
- { attr1: 111, attr2: 222 },
53
- { attr1: 1111, attr2: 2222, attr3: 3333 },
54
- { attr1: 11111, attr2: 22222, attr3: 33333, attr9: 99999 },
55
- { "attr1" => 11 },
56
- { "attr1" => 111, "attr2" => 222 },
57
- { "attr1" => 1111, "attr2" => 2222, "attr3" => 3333 },
58
- { "attr1" => 11111, "attr2" => 22222, "attr3" => 33333, "attr9" => 99999 },
59
- ]
60
-
61
-
62
- Benchmark.inputs(input_attributes) do |job|
63
- job.report('Struct#assign_attributes'){|attrs| subject.assign_attributes(attrs) }
64
- job.report('Struct#assign_attributes_alt1'){|attrs| subject.assign_attributes_alt1(attrs) }
65
- job.report('Struct#assign_attributes_alt2'){|attrs| subject.assign_attributes_alt2(attrs) }
66
- job.report('Struct#assign_attributes_alt3'){|attrs| subject.assign_attributes_alt3(attrs) }
67
- job.report('Struct#assign_attributes_alt4'){|attrs| subject.assign_attributes_alt4(attrs) }
68
- job.compare!
69
- end
@@ -1,12 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- FORMAT = '%H:%M:%S'
6
-
7
- Benchmark.inputs([Time.new(1999, 12, 31, 23, 59, 59)]) do |job|
8
- job.report('Time#to_hms'){|t| t.to_hms }
9
- job.report('Time#strftime'){|t| t.strftime('%H:%M:%S') }
10
- job.report('Time#strftime(CONST)'){|t| t.strftime(FORMAT) }
11
- job.compare!
12
- end
@@ -1,12 +0,0 @@
1
- require 'benchmark/inputs'
2
- require_relative '../../lib/casual_support'
3
-
4
-
5
- FORMAT = '%Y-%m-%d'
6
-
7
- Benchmark.inputs([Time.new(1999, 12, 31, 23, 59, 59)]) do |job|
8
- job.report('Time#to_ymd'){|t| t.to_ymd }
9
- job.report('Time#strftime'){|t| t.strftime('%Y-%m-%d') }
10
- job.report('Time#strftime(CONST)'){|t| t.strftime(FORMAT) }
11
- job.compare!
12
- end