tins 1.21.1 → 1.22.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
  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.