tins 1.21.1 → 1.22.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
  SHA256:
3
- metadata.gz: 83d331730cd4ad491a20aa00b62c3bf143b90b4815c925ea9cac00ecca1e28df
4
- data.tar.gz: 20caddb7ec694722fcb858e3f89575d059cf6184b9f7f3691097f1c26940b30f
3
+ metadata.gz: af6d1efde1eb5b47d047193f99d7bf9e8e04340f38602db17a913a0f8a13d657
4
+ data.tar.gz: bea619711defe84cc26090bc07405ed01ffdd32366b47dddbe6947a687c227c1
5
5
  SHA512:
6
- metadata.gz: 42299ca6120a02909cb506d4c7b2f9cf2e183dbb306f63942f459230e29308a6e186c9381aa9a0045a72b144a5503fb70761c758a741e6c4a7d0d65322aa3dee
7
- data.tar.gz: fce6386c9232be5d744c5d1dd80f2aa44302ca6240c04f79497783cb40f5e88040c19dade9f998dd1ac77b96e13c55ab11b5ce7f3e23aa960971c917b0fa276e
6
+ metadata.gz: e93d28cd97b016e3e5fad74625f5c6ddf2ed665fd378a84acdc6741c1f33222cbc63b751e1436125b49b5d14063000513c926b051a5e04a9f637fb5850d20e44
7
+ data.tar.gz: 6adf2f9c27f9a30324f600ebc8f4ba306e8adf701e6b109b33a30a57df0f69d073f0523051c6d7256f18f7e7fc5661ff4ce5fa643ee41092fe7535ecd08f5b43
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.21.1
1
+ 1.22.0
data/lib/tins/attempt.rb CHANGED
@@ -1,5 +1,16 @@
1
1
  module Tins
2
2
  module Attempt
3
+ # Attempts code in block *attempts* times, sleeping according to *sleep*
4
+ # between attempts and catching the exception(s) in *exception_class*.
5
+ #
6
+ # *sleep* is either a Proc returning a floating point number for duration
7
+ # as seconds or a Numeric >= 0 or < 0. In the former case this is the
8
+ # duration directly, in the latter case -*sleep* is the total number of
9
+ # seconds that is slept before giving up, and every attempt is retried
10
+ # after a exponentially increasing duration of seconds.
11
+ #
12
+ # Iff *reraise* is true the caught exception is reraised after running out
13
+ # of attempts.
3
14
  def attempt(opts = {}, &block)
4
15
  sleep = nil
5
16
  exception_class = StandardError
@@ -1,25 +1,42 @@
1
+ require 'tins/thread_local'
2
+
1
3
  module Tins
2
4
  module HashSymbolizeKeysRecursive
3
- def symbolize_keys_recursive
4
- inject(self.class.new) do |h,(k, v)|
5
- k = k.to_s
6
- case v
7
- when Hash
8
- h[k.to_sym] = v.symbolize_keys_recursive
9
- when Array
10
- h[k.to_sym] = a = v.dup
11
- v.each_with_index do |x, i|
12
- Hash === x and a[i] = x.symbolize_keys_recursive
13
- end
14
- else
15
- h[k.to_sym] = v
16
- end
17
- h
18
- end
5
+ extend Tins::ThreadLocal
6
+
7
+ thread_local :seen
8
+
9
+ def symbolize_keys_recursive(circular: nil)
10
+ self.seen = {}
11
+ _symbolize_keys_recursive(self, circular: circular)
12
+ ensure
13
+ self.seen = nil
19
14
  end
20
15
 
21
- def symbolize_keys_recursive!
22
- replace symbolize_keys_recursive
16
+ def symbolize_keys_recursive!(circular: nil)
17
+ replace symbolize_keys_recursive(circular: circular)
18
+ end
19
+
20
+ private
21
+
22
+ def _symbolize_keys_recursive(object, circular: nil)
23
+ case
24
+ when seen[object.__id__]
25
+ circular != nil and object = circular
26
+ when Hash === object
27
+ seen[object.__id__] = true
28
+ result = {}
29
+ object.each do |k, v|
30
+ result[k.to_s.to_sym] = _symbolize_keys_recursive(v, circular: circular)
31
+ end
32
+ object.replace result
33
+ when Array === object
34
+ seen[object.__id__] = true
35
+ object.map! do |v|
36
+ _symbolize_keys_recursive(v, circular: circular)
37
+ end
38
+ end
39
+ object
23
40
  end
24
41
  end
25
42
  end
data/lib/tins/unit.rb CHANGED
@@ -63,7 +63,7 @@ module Tins::Unit
63
63
  super source
64
64
  if prefixes
65
65
  @unit_re = unit_re(Tins::Unit.prefixes(prefixes), unit)
66
- @unit_lc_re = @unit_uc_re = nil
66
+ @unit_lc_re = @unit_uc_re = nil
67
67
  else
68
68
  @unit_lc_re = unit_re(Tins::Unit.prefixes(:lc), unit)
69
69
  @unit_uc_re = unit_re(Tins::Unit.prefixes(:uc), unit)
data/lib/tins/version.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  module Tins
2
2
  # Tins version
3
- VERSION = '1.21.1'
3
+ VERSION = '1.22.0'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -11,7 +11,8 @@ module Tins
11
11
  {
12
12
  'key' => {
13
13
  'key' => true
14
- }
14
+ },
15
+ 'o' => Object.new,
15
16
  }
16
17
  ],
17
18
  }
@@ -20,5 +21,45 @@ module Tins
20
21
  hash.symbolize_keys_recursive!
21
22
  assert hash[:key][0][:key][:key]
22
23
  end
24
+
25
+ def test_symbolize_bang
26
+ hash = { 'foo' => 'bar' }
27
+ hash.symbolize_keys_recursive!
28
+ assert_equal({ foo: 'bar' }, hash)
29
+ end
30
+
31
+ def test_symbolize_with_circular_array
32
+ circular_array = [].tap { |a| a << a }
33
+ assert_equal(
34
+ { foo: circular_array },
35
+ { 'foo' => circular_array }.symbolize_keys_recursive
36
+ )
37
+ assert_equal(
38
+ { foo: [ :circular ] },
39
+ { 'foo' => circular_array }.symbolize_keys_recursive(circular: :circular)
40
+ )
41
+ end
42
+
43
+ def test_symbolize_with_circular_hash
44
+ circular_hash = {}.tap { |h| h['foo'] = h }
45
+ circular_hash_symbol = {}.tap { |h| h[:foo] = h }
46
+ p({ 'bar' => circular_hash }.symbolize_keys_recursive)
47
+ assert_equal(
48
+ { bar: circular_hash_symbol },
49
+ { 'bar' => circular_hash }.symbolize_keys_recursive
50
+ )
51
+ assert_equal(
52
+ { bar: { foo: :circular } },
53
+ { 'bar' => circular_hash }.symbolize_keys_recursive(circular: :circular)
54
+ )
55
+ end
56
+
57
+ def test_symbolize_deeper_nesting
58
+ hash = { 'foo' => [ true, [ { 'bar' => {}.tap { |h| h['foo'] = h } }, 3.141, [].tap { |arr| arr << arr } ] ] }
59
+ assert_equal(
60
+ {foo: [true, [{bar: {foo: :circular}}, 3.141, [:circular]]]},
61
+ hash.symbolize_keys_recursive(circular: :circular)
62
+ )
63
+ end
23
64
  end
24
65
  end
data/tins.gemspec CHANGED
@@ -1,14 +1,14 @@
1
1
  # -*- encoding: utf-8 -*-
2
- # stub: tins 1.21.1 ruby lib
2
+ # stub: tins 1.22.0 ruby lib
3
3
 
4
4
  Gem::Specification.new do |s|
5
5
  s.name = "tins".freeze
6
- s.version = "1.21.1"
6
+ s.version = "1.22.0"
7
7
 
8
8
  s.required_rubygems_version = Gem::Requirement.new(">= 0".freeze) if s.respond_to? :required_rubygems_version=
9
9
  s.require_paths = ["lib".freeze]
10
10
  s.authors = ["Florian Frank".freeze]
11
- s.date = "2019-07-17"
11
+ s.date = "2019-10-30"
12
12
  s.description = "All the stuff that isn't good/big enough for a real library.".freeze
13
13
  s.email = "flori@ping.de".freeze
14
14
  s.extra_rdoc_files = ["README.md".freeze, "lib/dslkit.rb".freeze, "lib/dslkit/polite.rb".freeze, "lib/dslkit/rude.rb".freeze, "lib/spruz.rb".freeze, "lib/tins.rb".freeze, "lib/tins/alias.rb".freeze, "lib/tins/annotate.rb".freeze, "lib/tins/ask_and_send.rb".freeze, "lib/tins/attempt.rb".freeze, "lib/tins/bijection.rb".freeze, "lib/tins/case_predicate.rb".freeze, "lib/tins/complete.rb".freeze, "lib/tins/concern.rb".freeze, "lib/tins/count_by.rb".freeze, "lib/tins/date_dummy.rb".freeze, "lib/tins/date_time_dummy.rb".freeze, "lib/tins/deep_const_get.rb".freeze, "lib/tins/deep_dup.rb".freeze, "lib/tins/dslkit.rb".freeze, "lib/tins/duration.rb".freeze, "lib/tins/expose.rb".freeze, "lib/tins/extract_last_argument_options.rb".freeze, "lib/tins/file_binary.rb".freeze, "lib/tins/find.rb".freeze, "lib/tins/generator.rb".freeze, "lib/tins/go.rb".freeze, "lib/tins/hash_symbolize_keys_recursive.rb".freeze, "lib/tins/hash_union.rb".freeze, "lib/tins/if_predicate.rb".freeze, "lib/tins/implement.rb".freeze, "lib/tins/limited.rb".freeze, "lib/tins/lines_file.rb".freeze, "lib/tins/memoize.rb".freeze, "lib/tins/method_description.rb".freeze, "lib/tins/minimize.rb".freeze, "lib/tins/module_group.rb".freeze, "lib/tins/named_set.rb".freeze, "lib/tins/null.rb".freeze, "lib/tins/once.rb".freeze, "lib/tins/p.rb".freeze, "lib/tins/partial_application.rb".freeze, "lib/tins/proc_compose.rb".freeze, "lib/tins/proc_prelude.rb".freeze, "lib/tins/range_plus.rb".freeze, "lib/tins/require_maybe.rb".freeze, "lib/tins/responding.rb".freeze, "lib/tins/secure_write.rb".freeze, "lib/tins/sexy_singleton.rb".freeze, "lib/tins/string_byte_order_mark.rb".freeze, "lib/tins/string_camelize.rb".freeze, "lib/tins/string_underscore.rb".freeze, "lib/tins/string_version.rb".freeze, "lib/tins/subhash.rb".freeze, "lib/tins/temp_io.rb".freeze, "lib/tins/temp_io_enum.rb".freeze, "lib/tins/terminal.rb".freeze, "lib/tins/thread_local.rb".freeze, "lib/tins/time_dummy.rb".freeze, "lib/tins/to.rb".freeze, "lib/tins/to_proc.rb".freeze, "lib/tins/token.rb".freeze, "lib/tins/uniq_by.rb".freeze, "lib/tins/unit.rb".freeze, "lib/tins/version.rb".freeze, "lib/tins/write.rb".freeze, "lib/tins/xt.rb".freeze, "lib/tins/xt/annotate.rb".freeze, "lib/tins/xt/ask_and_send.rb".freeze, "lib/tins/xt/attempt.rb".freeze, "lib/tins/xt/blank.rb".freeze, "lib/tins/xt/case_predicate.rb".freeze, "lib/tins/xt/complete.rb".freeze, "lib/tins/xt/concern.rb".freeze, "lib/tins/xt/count_by.rb".freeze, "lib/tins/xt/date_dummy.rb".freeze, "lib/tins/xt/date_time_dummy.rb".freeze, "lib/tins/xt/deep_const_get.rb".freeze, "lib/tins/xt/deep_dup.rb".freeze, "lib/tins/xt/dslkit.rb".freeze, "lib/tins/xt/expose.rb".freeze, "lib/tins/xt/extract_last_argument_options.rb".freeze, "lib/tins/xt/file_binary.rb".freeze, "lib/tins/xt/full.rb".freeze, "lib/tins/xt/hash_symbolize_keys_recursive.rb".freeze, "lib/tins/xt/hash_union.rb".freeze, "lib/tins/xt/if_predicate.rb".freeze, "lib/tins/xt/implement.rb".freeze, "lib/tins/xt/irb.rb".freeze, "lib/tins/xt/method_description.rb".freeze, "lib/tins/xt/named.rb".freeze, "lib/tins/xt/null.rb".freeze, "lib/tins/xt/p.rb".freeze, "lib/tins/xt/partial_application.rb".freeze, "lib/tins/xt/proc_compose.rb".freeze, "lib/tins/xt/proc_prelude.rb".freeze, "lib/tins/xt/range_plus.rb".freeze, "lib/tins/xt/require_maybe.rb".freeze, "lib/tins/xt/responding.rb".freeze, "lib/tins/xt/secure_write.rb".freeze, "lib/tins/xt/sexy_singleton.rb".freeze, "lib/tins/xt/string.rb".freeze, "lib/tins/xt/string_byte_order_mark.rb".freeze, "lib/tins/xt/string_camelize.rb".freeze, "lib/tins/xt/string_underscore.rb".freeze, "lib/tins/xt/string_version.rb".freeze, "lib/tins/xt/subhash.rb".freeze, "lib/tins/xt/temp_io.rb".freeze, "lib/tins/xt/time_dummy.rb".freeze, "lib/tins/xt/time_freezer.rb".freeze, "lib/tins/xt/to.rb".freeze, "lib/tins/xt/uniq_by.rb".freeze, "lib/tins/xt/write.rb".freeze]
@@ -17,7 +17,7 @@ Gem::Specification.new do |s|
17
17
  s.licenses = ["MIT".freeze]
18
18
  s.rdoc_options = ["--title".freeze, "Tins - Useful stuff.".freeze, "--main".freeze, "README.md".freeze]
19
19
  s.required_ruby_version = Gem::Requirement.new(">= 2.0".freeze)
20
- s.rubygems_version = "3.0.3".freeze
20
+ s.rubygems_version = "3.0.6".freeze
21
21
  s.summary = "Useful stuff.".freeze
22
22
  s.test_files = ["tests/annotate_test.rb".freeze, "tests/ask_and_send_test.rb".freeze, "tests/attempt_test.rb".freeze, "tests/bijection_test.rb".freeze, "tests/blank_full_test.rb".freeze, "tests/case_predicate_test.rb".freeze, "tests/concern_test.rb".freeze, "tests/count_by_test.rb".freeze, "tests/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_const_get_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/dslkit_test.rb".freeze, "tests/duration_test.rb".freeze, "tests/dynamic_scope_test.rb".freeze, "tests/expose_test.rb".freeze, "tests/extract_last_argument_options_test.rb".freeze, "tests/file_binary_test.rb".freeze, "tests/find_test.rb".freeze, "tests/from_module_test.rb".freeze, "tests/generator_test.rb".freeze, "tests/go_test.rb".freeze, "tests/hash_symbolize_keys_recursive_test.rb".freeze, "tests/hash_union_test.rb".freeze, "tests/if_predicate_test.rb".freeze, "tests/implement_test.rb".freeze, "tests/limited_test.rb".freeze, "tests/lines_file_test.rb".freeze, "tests/memoize_test.rb".freeze, "tests/method_description_test.rb".freeze, "tests/minimize_test.rb".freeze, "tests/module_group_test.rb".freeze, "tests/named_set_test.rb".freeze, "tests/named_test.rb".freeze, "tests/null_test.rb".freeze, "tests/p_test.rb".freeze, "tests/partial_application_test.rb".freeze, "tests/proc_compose_test.rb".freeze, "tests/proc_prelude_test.rb".freeze, "tests/range_plus_test.rb".freeze, "tests/require_maybe_test.rb".freeze, "tests/responding_test.rb".freeze, "tests/rotate_test.rb".freeze, "tests/scope_test.rb".freeze, "tests/secure_write_test.rb".freeze, "tests/sexy_singleton_test.rb".freeze, "tests/string_byte_order_mark_test.rb".freeze, "tests/string_camelize_test.rb".freeze, "tests/string_underscore_test.rb".freeze, "tests/string_version_test.rb".freeze, "tests/subhash_test.rb".freeze, "tests/temp_io_test.rb".freeze, "tests/test_helper.rb".freeze, "tests/time_dummy_test.rb".freeze, "tests/time_freezer_test.rb".freeze, "tests/to_test.rb".freeze, "tests/token_test.rb".freeze, "tests/uniq_by_test.rb".freeze, "tests/unit_test.rb".freeze, "tests/if_predicate_test.rb".freeze, "tests/string_camelize_test.rb".freeze, "tests/case_predicate_test.rb".freeze, "tests/sexy_singleton_test.rb".freeze, "tests/hash_union_test.rb".freeze, "tests/date_dummy_test.rb".freeze, "tests/string_byte_order_mark_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/generator_test.rb".freeze, "tests/ask_and_send_test.rb".freeze, "tests/hash_symbolize_keys_recursive_test.rb".freeze, "tests/memoize_test.rb".freeze, "tests/find_test.rb".freeze, "tests/extract_last_argument_options_test.rb".freeze, "tests/null_test.rb".freeze, "tests/temp_io_test.rb".freeze, "tests/proc_prelude_test.rb".freeze, "tests/token_test.rb".freeze, "tests/bijection_test.rb".freeze, "tests/p_test.rb".freeze, "tests/dynamic_scope_test.rb".freeze, "tests/lines_file_test.rb".freeze, "tests/count_by_test.rb".freeze, "tests/responding_test.rb".freeze, "tests/time_freezer_test.rb".freeze, "tests/attempt_test.rb".freeze, "tests/concern_test.rb".freeze, "tests/implement_test.rb".freeze, "tests/dslkit_test.rb".freeze, "tests/range_plus_test.rb".freeze, "tests/deep_const_get_test.rb".freeze, "tests/named_set_test.rb".freeze, "tests/proc_compose_test.rb".freeze, "tests/minimize_test.rb".freeze, "tests/subhash_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/time_dummy_test.rb".freeze, "tests/limited_test.rb".freeze, "tests/duration_test.rb".freeze, "tests/method_description_test.rb".freeze, "tests/to_test.rb".freeze, "tests/file_binary_test.rb".freeze, "tests/partial_application_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/expose_test.rb".freeze, "tests/rotate_test.rb".freeze, "tests/module_group_test.rb".freeze, "tests/unit_test.rb".freeze, "tests/string_underscore_test.rb".freeze, "tests/named_test.rb".freeze, "tests/from_module_test.rb".freeze, "tests/string_version_test.rb".freeze, "tests/require_maybe_test.rb".freeze, "tests/uniq_by_test.rb".freeze, "tests/secure_write_test.rb".freeze, "tests/blank_full_test.rb".freeze, "tests/scope_test.rb".freeze, "tests/annotate_test.rb".freeze, "tests/go_test.rb".freeze]
23
23
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tins
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.21.1
4
+ version: 1.22.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Florian Frank
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-07-17 00:00:00.000000000 Z
11
+ date: 2019-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: gem_hadar
@@ -400,7 +400,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
400
400
  - !ruby/object:Gem::Version
401
401
  version: '0'
402
402
  requirements: []
403
- rubygems_version: 3.0.3
403
+ rubygems_version: 3.0.6
404
404
  signing_key:
405
405
  specification_version: 4
406
406
  summary: Useful stuff.