tins 1.54.0 → 1.56.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 +4 -4
- data/CHANGES.md +30 -0
- data/README.md +68 -2
- data/Rakefile +1 -0
- data/lib/tins/deep_transform.rb +114 -0
- data/lib/tins/hash_symbolize_keys_recursive.rb +17 -58
- data/lib/tins/version.rb +1 -1
- data/lib/tins/xt/deep_transform.rb +11 -0
- data/lib/tins/xt/irb.rb +2 -4
- data/lib/tins/xt.rb +1 -0
- data/lib/tins.rb +1 -0
- data/tests/deep_transform_test.rb +162 -0
- data/tins.gemspec +7 -6
- metadata +22 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: fd2090b923a690d351489aa80cb8792b6b06de766300a287c7ae9f82eb53321a
|
|
4
|
+
data.tar.gz: b61fd2f899759c53373f9809f59ad74b11a2241adb70fa00cb73c024bf517c6a
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 74d027369ff665630a795b0a97590c0047d53d09f9dfc2d07064ae837950ef0f48bf1155d249e300f04ee8672f1c0301ad821f837f559e5a4e20c4b732bea5be
|
|
7
|
+
data.tar.gz: dbd9d024a5f71f4d116ae320010616072d72bb5082ed6e7eef1c24320e0bf2011056d58c24d67d8de7112afe23b3ebd6954b52376dc95eab184493d912d87f87
|
data/CHANGES.md
CHANGED
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# Changes
|
|
2
2
|
|
|
3
|
+
## 2026-07-25 v1.56.0
|
|
4
|
+
|
|
5
|
+
### Changes
|
|
6
|
+
|
|
7
|
+
- Refactored `xt/irb.rb` and added `irb` as a dependency in the `Rakefile`.
|
|
8
|
+
- Removed redundant `rescue Interrupt` block from `lib/tins/xt/irb.rb`.
|
|
9
|
+
|
|
10
|
+
## 2026-07-17 v1.55.0
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Introduced the `Tins::DeepTransform` module, providing a stack-safe,
|
|
15
|
+
iterative engine for deep transformations via the `deep_transform` method.
|
|
16
|
+
- Added support for flexible lambda arity (1, 2, or 3) within `deep_transform`
|
|
17
|
+
to allow access to the node, key/index, and parent container context.
|
|
18
|
+
- Implemented a core extension in `tins/xt/deep_transform` that integrates
|
|
19
|
+
`DeepTransform` into the `Hash` and `Array` classes.
|
|
20
|
+
- Added comprehensive test coverage for deep nesting, circularity, and arity
|
|
21
|
+
variations in `tests/deep_transform_test.rb`.
|
|
22
|
+
- Updated `README.md` with usage examples for structural pruning, moving
|
|
23
|
+
averages, and basic transformations.
|
|
24
|
+
|
|
25
|
+
### Changed
|
|
26
|
+
|
|
27
|
+
- Refactored `Tins::HashSymbolizeKeysRecursive` to utilize the new iterative
|
|
28
|
+
engine instead of recursive logic.
|
|
29
|
+
- Registered new modules within `lib/tins.rb` and `lib/tins/xt.rb`.
|
|
30
|
+
- Updated CI configuration in `.all_images.yml` to use `bundle exec rake test`
|
|
31
|
+
and added `before`/`after` hooks.
|
|
32
|
+
|
|
3
33
|
## 2026-05-20 v1.54.0
|
|
4
34
|
|
|
5
35
|
### Changed
|
data/README.md
CHANGED
|
@@ -150,7 +150,7 @@ hello
|
|
|
150
150
|
### Hash Symbolization
|
|
151
151
|
|
|
152
152
|
```ruby
|
|
153
|
-
require 'tins/hash_symbolize_keys_recursive'
|
|
153
|
+
require 'tins/xt/hash_symbolize_keys_recursive'
|
|
154
154
|
|
|
155
155
|
hash = {
|
|
156
156
|
'name' => 'John',
|
|
@@ -159,7 +159,73 @@ hash = {
|
|
|
159
159
|
'street' => '123 Main St'
|
|
160
160
|
}
|
|
161
161
|
}
|
|
162
|
-
hash.symbolize_keys_recursive! # Converts all keys to symbols
|
|
162
|
+
hash.symbolize_keys_recursive! # Converts all keys to symbols using a stack-safe deep transformation
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Deep Hash and Array Transformation
|
|
166
|
+
|
|
167
|
+
```ruby
|
|
168
|
+
require 'tins/xt/deep_transform'
|
|
169
|
+
|
|
170
|
+
h = { "name" => "john", "details" => { "city" => "berlin", "tags" => ["ruby", "dev"] } }
|
|
171
|
+
|
|
172
|
+
# Transform keys to symbols and values (if strings) to uppercase
|
|
173
|
+
result = h.deep_transform(
|
|
174
|
+
key: -> k { k.to_sym },
|
|
175
|
+
value: -> v { v.is_a?(String) ? v.upcase : v }
|
|
176
|
+
)
|
|
177
|
+
# => { name: "JOHN", details: { city: "BERLIN", tags: ["RUBY", "DEV"] } }
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
#### Advanced Usage (Contextual Transformations)
|
|
181
|
+
|
|
182
|
+
The `value` lambda can accept 1, 2, or 3 arguments depending on the level of context required for each node's transformation:
|
|
183
|
+
- `-> v { ... }`: Global transform (node only).
|
|
184
|
+
- `-> k, v { ... }`: Contextual transform (key/index and node).
|
|
185
|
+
- `-> k, v, c { ... }`: Full structural transform (key/index, node, and parent container).
|
|
186
|
+
|
|
187
|
+
#### 🧮 Example: Calculating a moving average on a nested array structure
|
|
188
|
+
|
|
189
|
+
```ruby
|
|
190
|
+
require 'tins/xt/deep_transform'
|
|
191
|
+
|
|
192
|
+
# Root can be an Array as well
|
|
193
|
+
a = (1..10).each_slice(5).map(&:to_a)
|
|
194
|
+
# => [[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
|
|
195
|
+
|
|
196
|
+
result = a.deep_transform(value: -> i, x, c {
|
|
197
|
+
Array === c && Numeric === x && i > 0 ? (c[i-1] + x) / 2.0 : x
|
|
198
|
+
})
|
|
199
|
+
# => [[1, 1.5, 2.5, 3.5, 4.5], [6, 6.5, 7.5, 8.5, 9.5]]
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
#### 🛡️ Example: Structural Pruning & Sanitization
|
|
203
|
+
|
|
204
|
+
Because `deep_transform` processes nodes bottom-up, you can effectively prune
|
|
205
|
+
entire branches of a tree by returning an empty container when a specific
|
|
206
|
+
condition (like a "private" flag) is met.
|
|
207
|
+
|
|
208
|
+
```ruby
|
|
209
|
+
require 'tins/xt/deep_transform'
|
|
210
|
+
|
|
211
|
+
# A nested data structure with some sections marked for pruning
|
|
212
|
+
api_response = {
|
|
213
|
+
user: {
|
|
214
|
+
name: "Florian",
|
|
215
|
+
profile: { bio: "Ruby Expert", internal_id: "SECRET_123", noindex: true }
|
|
216
|
+
},
|
|
217
|
+
settings: {
|
|
218
|
+
theme: "dark",
|
|
219
|
+
debug_info: { logs: ["Error 404"], noindex: true }
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
# Prune any Hash that is marked with `noindex: true`
|
|
224
|
+
sanitized = api_response.deep_transform(value: -> v {
|
|
225
|
+
(v.is_a?(Hash) && v[:noindex]) ? {} : v
|
|
226
|
+
})
|
|
227
|
+
|
|
228
|
+
# => { user: { name: "Florian", profile: {} }, settings: { theme: "dark", debug_info: {} } }
|
|
163
229
|
```
|
|
164
230
|
|
|
165
231
|
## Author
|
data/Rakefile
CHANGED
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
module Tins
|
|
2
|
+
# DeepTransform provides a robust engine for traversing an object tree and
|
|
3
|
+
# applying a transformation to each node iteratively, preventing stack
|
|
4
|
+
# overflows.
|
|
5
|
+
module DeepTransform
|
|
6
|
+
# Transforms an object and its children using the provided lambdas. This
|
|
7
|
+
# implementation uses an iterative bottom-up approach to avoid
|
|
8
|
+
# SystemStackError.
|
|
9
|
+
#
|
|
10
|
+
# @param key [Proc, nil] An optional lambda/proc used to transform hash keys
|
|
11
|
+
# during reconstruction. Defaults to an identity transformation.
|
|
12
|
+
# @param value [Proc, nil] An optional lambda/proc used to transform nodes
|
|
13
|
+
# (values) during reconstruction. Its behavior depends on its arity:
|
|
14
|
+
# - Arity 1: called with `(node)`
|
|
15
|
+
# - Arity 2: called with `(index_or_key, node)`
|
|
16
|
+
# - Arity 3: called with `(index_or_key, node, parent_container)`
|
|
17
|
+
# Defaults to an identity transformation.
|
|
18
|
+
# @param circular [Object] value returned when a circular reference is detected
|
|
19
|
+
# @return [Object] the fully transformed object tree
|
|
20
|
+
# @raise [ArgumentError] if a block is provided (use `key:` and `value:` instead)
|
|
21
|
+
def deep_transform(key: nil, value: nil, circular: nil)
|
|
22
|
+
block_given? and raise ArgumentError, '&block not supported'
|
|
23
|
+
_transform_iterative(self, key: key, value: value, circular: circular)
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
private
|
|
27
|
+
|
|
28
|
+
# The core iterative engine used to traverse and transform object trees.
|
|
29
|
+
#
|
|
30
|
+
# This method implements a non-recursive, two-pass approach to avoid
|
|
31
|
+
# `SystemStackError` on deeply nested structures:
|
|
32
|
+
#
|
|
33
|
+
# 1. **Discovery Pass**: Performs a pre-order traversal using an explicit stack
|
|
34
|
+
# to identify all reachable nodes in the tree, tracking them by their
|
|
35
|
+
# object ID (`__id__`) to handle shared references and circularities.
|
|
36
|
+
# 2. **Reconstruction Pass**: Processes the discovered nodes in reverse
|
|
37
|
+
# order (bottom-up). This ensures that child nodes are transformed and
|
|
38
|
+
# stored in the results map before their parent nodes are processed.
|
|
39
|
+
#
|
|
40
|
+
# @param root [Object] The root object of the tree to be transformed.
|
|
41
|
+
# @param key [Proc, nil] An optional lambda/proc used to transform hash keys
|
|
42
|
+
# during reconstruction. Defaults to an identity transformation.
|
|
43
|
+
# @param value [Proc, nil] An optional lambda/proc used to transform nodes
|
|
44
|
+
# (values) during reconstruction. Its behavior depends on its arity:
|
|
45
|
+
# - Arity 1: called with `(node)`
|
|
46
|
+
# - Arity 2: called with `(index_or_key, node)`
|
|
47
|
+
# - Arity 3: called with `(index_or_key, node, parent_container)`
|
|
48
|
+
# Defaults to an identity transformation.
|
|
49
|
+
# @param circular [Object] The value to assign when a circular reference is
|
|
50
|
+
# detected during the reconstruction phase.
|
|
51
|
+
# @return [Object] The root of the newly reconstructed and transformed tree.
|
|
52
|
+
#
|
|
53
|
+
# @note This method relies on `to_hash` and `to_ary` to identify container
|
|
54
|
+
# nodes. Objects must implement these methods if they are to be treated
|
|
55
|
+
# as branch nodes in the tree.
|
|
56
|
+
def _transform_iterative(root, key: nil, value: nil, circular:)
|
|
57
|
+
key ||= -> x { x }
|
|
58
|
+
value ||= -> x { x }
|
|
59
|
+
|
|
60
|
+
# Pass 1: Discovery (Pre-order traversal to find all nodes)
|
|
61
|
+
nodes = []
|
|
62
|
+
stack = [ [ nil, root, nil ] ]
|
|
63
|
+
visited = {}
|
|
64
|
+
|
|
65
|
+
while stack.any?
|
|
66
|
+
idx, node, cont = stack.pop
|
|
67
|
+
next if visited[node.__id__]
|
|
68
|
+
|
|
69
|
+
visited[node.__id__] = true
|
|
70
|
+
nodes << [ idx, node, cont ]
|
|
71
|
+
|
|
72
|
+
# Unfold containers to find children for discovery
|
|
73
|
+
if node.respond_to?(:to_hash)
|
|
74
|
+
node.to_hash.each_pair { |k, v| stack << [ k, v, node ] }
|
|
75
|
+
elsif node.respond_to?(:to_ary)
|
|
76
|
+
node.to_ary.each_with_index { |v, i| stack << [ i, v, node ] }
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
# Pass 2: Bottom-Up Reconstruction
|
|
81
|
+
results = {}
|
|
82
|
+
nodes.reverse_each do |idx, node, cont|
|
|
83
|
+
transformed = case value.arity
|
|
84
|
+
when 1 then value.(node)
|
|
85
|
+
when 2 then value.(idx, node)
|
|
86
|
+
when 3 then value.(idx, node, cont)
|
|
87
|
+
else
|
|
88
|
+
raise ArgumentError, 'value lambda has to be arity in 1..3'
|
|
89
|
+
end
|
|
90
|
+
|
|
91
|
+
if transformed.respond_to?(:to_hash)
|
|
92
|
+
hash = transformed.to_hash
|
|
93
|
+
new_hash = hash.dup.tap(&:clear)
|
|
94
|
+
hash.each do |k, v|
|
|
95
|
+
# Resolve child from results map or mark as circular
|
|
96
|
+
new_hash[key.(k)] = results[v.__id__] ||
|
|
97
|
+
(v.respond_to?(:to_hash) || v.respond_to?(:to_ary) ? circular : v)
|
|
98
|
+
end
|
|
99
|
+
transformed = new_hash
|
|
100
|
+
elsif transformed.respond_to?(:to_ary)
|
|
101
|
+
ary = transformed.to_ary
|
|
102
|
+
transformed = ary.map do |v|
|
|
103
|
+
results[v.__id__] ||
|
|
104
|
+
(v.respond_to?(:to_hash) || v.respond_to?(:to_ary) ? circular : v)
|
|
105
|
+
end
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
results[node.__id__] = transformed
|
|
109
|
+
end
|
|
110
|
+
|
|
111
|
+
results[root.__id__]
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
require 'tins/
|
|
1
|
+
require 'tins/deep_transform'
|
|
2
2
|
|
|
3
3
|
module Tins
|
|
4
|
-
# This module provides
|
|
5
|
-
# nested structures including hashes and arrays,
|
|
6
|
-
#
|
|
4
|
+
# This module provides deep symbolization of hash keys. It handles
|
|
5
|
+
# nested structures including hashes and arrays, utilizing an iterative
|
|
6
|
+
# engine to prevent stack overflows and handle circular references.
|
|
7
7
|
#
|
|
8
8
|
# @example Basic usage
|
|
9
9
|
# hash = { "name" => "John", "address" => { "street" => "123 Main St" } }
|
|
@@ -16,14 +16,11 @@ module Tins
|
|
|
16
16
|
# hash.symbolize_keys_recursive(circular: "[Circular Reference]")
|
|
17
17
|
# # => { name: "John", self: "[Circular Reference]" }
|
|
18
18
|
module HashSymbolizeKeysRecursive
|
|
19
|
-
|
|
19
|
+
include Tins::DeepTransform
|
|
20
20
|
|
|
21
|
-
#
|
|
22
|
-
#
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
# Recursively converts all string keys in a hash (and nested hashes/arrays)
|
|
26
|
-
# to symbols. This method does not modify the original hash.
|
|
21
|
+
# Deeply converts all string keys in a hash (and nested hashes/arrays)
|
|
22
|
+
# to symbols using an iterative approach to avoid SystemStackError.
|
|
23
|
+
# This method does not modify the original hash.
|
|
27
24
|
#
|
|
28
25
|
# @param circular [Object] The value to use when encountering circular references.
|
|
29
26
|
# Defaults to nil, which means circular references will be ignored.
|
|
@@ -48,13 +45,11 @@ module Tins
|
|
|
48
45
|
# hash.symbolize_keys_recursive(circular: "[Circular]")
|
|
49
46
|
# # => { name: "John", self: "[Circular]" }
|
|
50
47
|
def symbolize_keys_recursive(circular: nil)
|
|
51
|
-
|
|
52
|
-
_transform_keys_recursive(self, circular: circular, transform: :to_sym)
|
|
53
|
-
ensure
|
|
54
|
-
self.seen = nil
|
|
48
|
+
deep_transform(key: -> x { x.to_sym }, circular: circular)
|
|
55
49
|
end
|
|
56
50
|
|
|
57
|
-
#
|
|
51
|
+
# Deeply converts all keys in the hash (and nested hashes) to strings,
|
|
52
|
+
# using an iterative approach to avoid SystemStackError.
|
|
58
53
|
#
|
|
59
54
|
# @param circular [Object] The value to return for circular references.
|
|
60
55
|
# @return [Hash] A new hash with all keys converted to strings.
|
|
@@ -64,14 +59,12 @@ module Tins
|
|
|
64
59
|
# hash.stringify_keys_recursive
|
|
65
60
|
# # => { "name" => "John", "address" => { "city" => "NYC" } }
|
|
66
61
|
def stringify_keys_recursive(circular: nil)
|
|
67
|
-
|
|
68
|
-
_transform_keys_recursive(self, circular: circular, transform: :to_s)
|
|
69
|
-
ensure
|
|
70
|
-
self.seen = nil
|
|
62
|
+
deep_transform(key: -> x { x.to_s }, circular: circular)
|
|
71
63
|
end
|
|
72
64
|
|
|
73
|
-
#
|
|
74
|
-
# to symbols. This method modifies the
|
|
65
|
+
# Deeply converts all string keys in a hash (and nested hashes/arrays)
|
|
66
|
+
# to symbols using an iterative approach. This method modifies the
|
|
67
|
+
# original hash in place.
|
|
75
68
|
#
|
|
76
69
|
# @param circular [Object] The value to use when encountering circular references.
|
|
77
70
|
# Defaults to nil, which means circular references will be ignored.
|
|
@@ -86,7 +79,8 @@ module Tins
|
|
|
86
79
|
replace symbolize_keys_recursive(circular: circular)
|
|
87
80
|
end
|
|
88
81
|
|
|
89
|
-
#
|
|
82
|
+
# Deeply converts all keys in the hash (and nested hashes) to strings
|
|
83
|
+
# in place, using an iterative approach.
|
|
90
84
|
#
|
|
91
85
|
# @param circular [Object] The value to return for circular references.
|
|
92
86
|
# @return [Hash] The same hash with all keys converted to strings.
|
|
@@ -98,40 +92,5 @@ module Tins
|
|
|
98
92
|
def stringify_keys_recursive!(circular: nil)
|
|
99
93
|
replace stringify_keys_recursive(circular: circular)
|
|
100
94
|
end
|
|
101
|
-
|
|
102
|
-
private
|
|
103
|
-
|
|
104
|
-
# Performs the actual recursive transformation work
|
|
105
|
-
#
|
|
106
|
-
# @param object [Object] The object to process
|
|
107
|
-
# @param circular [Object] The value to return for circular references
|
|
108
|
-
# @param transform [Symbol] The transformation to apply to keys (`:to_sym` or `:to_s`).
|
|
109
|
-
# @return [Object] The processed object with transformed keys
|
|
110
|
-
def _transform_keys_recursive(object, circular: nil, transform:)
|
|
111
|
-
case
|
|
112
|
-
when seen[object.__id__]
|
|
113
|
-
object = circular
|
|
114
|
-
when object.respond_to?(:to_hash)
|
|
115
|
-
object = object.to_hash
|
|
116
|
-
seen[object.__id__] = true
|
|
117
|
-
new_object = object.class.new
|
|
118
|
-
seen[new_object.__id__] = true
|
|
119
|
-
object.each do |k, v|
|
|
120
|
-
new_object[k.to_s.__send__(transform)] =
|
|
121
|
-
_transform_keys_recursive(v, circular: circular, transform:)
|
|
122
|
-
end
|
|
123
|
-
object = new_object
|
|
124
|
-
when object.respond_to?(:to_ary)
|
|
125
|
-
object = object.to_ary
|
|
126
|
-
seen[object.__id__] = true
|
|
127
|
-
new_object = object.class.new(object.size)
|
|
128
|
-
seen[new_object.__id__] = true
|
|
129
|
-
object.each_with_index do |v, i|
|
|
130
|
-
new_object[i] = _transform_keys_recursive(v, circular: circular, transform:)
|
|
131
|
-
end
|
|
132
|
-
object = new_object
|
|
133
|
-
end
|
|
134
|
-
object
|
|
135
|
-
end
|
|
136
95
|
end
|
|
137
96
|
end
|
data/lib/tins/version.rb
CHANGED
data/lib/tins/xt/irb.rb
CHANGED
|
@@ -39,12 +39,10 @@ module Tins
|
|
|
39
39
|
# examine some_binding
|
|
40
40
|
def self.examine(binding = TOPLEVEL_BINDING)
|
|
41
41
|
setup nil
|
|
42
|
-
workspace
|
|
43
|
-
irb
|
|
42
|
+
workspace = WorkSpace.new binding
|
|
43
|
+
irb = Irb.new workspace
|
|
44
44
|
@CONF[:MAIN_CONTEXT] = irb.context
|
|
45
45
|
catch(:IRB_EXIT) { irb.eval_input }
|
|
46
|
-
rescue Interrupt
|
|
47
|
-
exit
|
|
48
46
|
end
|
|
49
47
|
|
|
50
48
|
# Starts an interactive IRB session examining the current object and its context.
|
data/lib/tins/xt.rb
CHANGED
data/lib/tins.rb
CHANGED
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'tins/xt/deep_transform'
|
|
3
|
+
|
|
4
|
+
module Tins
|
|
5
|
+
class DeepTransformTest < Test::Unit::TestCase
|
|
6
|
+
class HashLike
|
|
7
|
+
attr_reader :name, :children
|
|
8
|
+
def initialize(name, children = [])
|
|
9
|
+
@name = name
|
|
10
|
+
@children = children
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def to_hash
|
|
14
|
+
{ name: @name, children: @children }
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def test_basic_transform
|
|
19
|
+
# Simple identity transform on a flat hash
|
|
20
|
+
h = { a: 1, b: 2 }
|
|
21
|
+
result = h.deep_transform(value: -> node { node })
|
|
22
|
+
assert_equal h, result
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def test_identity_behavior
|
|
26
|
+
# Test calling without any blocks - should act as a deep copy identity
|
|
27
|
+
# transform
|
|
28
|
+
h = { a: 1, b: { c: 2 }, d: [3, { e: 4 }] }
|
|
29
|
+
result = h.deep_transform
|
|
30
|
+
assert_equal h, result
|
|
31
|
+
refute_same h, result # Ensure it's a new object (deep copy)
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def test_value_transformation
|
|
35
|
+
# Transform all numbers to strings
|
|
36
|
+
h = { a: 1, b: [2, 3] }
|
|
37
|
+
result = h.deep_transform(value: -> node {
|
|
38
|
+
node.is_a?(Integer) ? node.to_s : node
|
|
39
|
+
})
|
|
40
|
+
assert_equal({ a: '1', b: ['2', '3'] }, result)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def test_key_transformation
|
|
44
|
+
# Transform all keys to uppercase strings
|
|
45
|
+
h = { name: 'John', details: { age: 30, city: 'Berlin' } }
|
|
46
|
+
result = h.deep_transform(
|
|
47
|
+
key: -> k { k.to_s.upcase },
|
|
48
|
+
value: -> node { node }
|
|
49
|
+
)
|
|
50
|
+
|
|
51
|
+
expected = {
|
|
52
|
+
'NAME' => 'John',
|
|
53
|
+
'DETAILS' => { 'AGE' => 30, 'CITY' => 'Berlin' }
|
|
54
|
+
}
|
|
55
|
+
assert_equal expected, result
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def test_recursive_object_flattening
|
|
59
|
+
# Objects unfold into hashes, which contain more objects.
|
|
60
|
+
child = HashLike.new('Child')
|
|
61
|
+
parent = HashLike.new('Parent', [child])
|
|
62
|
+
root = { root_node: parent }
|
|
63
|
+
|
|
64
|
+
result = root.deep_transform(
|
|
65
|
+
value: -> node { node.respond_to?(:to_hash) ? node.to_hash : node }
|
|
66
|
+
)
|
|
67
|
+
|
|
68
|
+
expected = {
|
|
69
|
+
root_node: {
|
|
70
|
+
name: 'Parent',
|
|
71
|
+
children: [ { name: 'Child', children: [] } ]
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
assert_equal expected, result
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
def test_circular_reference_detection
|
|
78
|
+
# Create a tight loop: A -> B -> A
|
|
79
|
+
a = { name: 'A' }
|
|
80
|
+
b = { name: 'B', parent: a }
|
|
81
|
+
a[:child] = b
|
|
82
|
+
|
|
83
|
+
placeholder = "🔄 LOOP"
|
|
84
|
+
result = a.deep_transform(circular: placeholder, value: -> node { node })
|
|
85
|
+
|
|
86
|
+
# Parent should be OK, Child's reference to Parent should be the placeholder
|
|
87
|
+
assert_equal 'A', result[:name]
|
|
88
|
+
assert_equal 'B', result[:child][:name]
|
|
89
|
+
assert_equal placeholder, result[:child][:parent]
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def test_deeply_nested_structure
|
|
93
|
+
# Create a chain of 100 nested objects to ensure no stack overflow
|
|
94
|
+
current = { val: 'leaf' }
|
|
95
|
+
100.times do |i|
|
|
96
|
+
current = { level: i, child: current }
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
result = current.deep_transform(value: -> node { node })
|
|
100
|
+
# Just verify the depth is preserved without crashing
|
|
101
|
+
depth = 0
|
|
102
|
+
temp = result
|
|
103
|
+
while temp.is_a?(Hash) && temp[:child]
|
|
104
|
+
temp = temp[:child]
|
|
105
|
+
depth += 1
|
|
106
|
+
end
|
|
107
|
+
assert_equal 100, depth
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def test_mixed_containers
|
|
111
|
+
# Test a mix of arrays and hashes
|
|
112
|
+
h = {
|
|
113
|
+
list: [ { item: 1 }, { item: 2 } ],
|
|
114
|
+
meta: { tags: ['a', 'b'] }
|
|
115
|
+
}
|
|
116
|
+
result = h.deep_transform(value: -> node { node })
|
|
117
|
+
assert_equal h, result
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
def test_empty_containers
|
|
121
|
+
assert_equal({}, {}.deep_transform(value: -> node { node }))
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def test_with_nil_values
|
|
125
|
+
h = { a: nil, b: [nil, 1] }
|
|
126
|
+
result = h.deep_transform(value: -> node { node })
|
|
127
|
+
assert_equal({ a: nil, b: [nil, 1] }, result)
|
|
128
|
+
end
|
|
129
|
+
|
|
130
|
+
def test_arity_2_transformation
|
|
131
|
+
# Transform values only if the key starts with 'a'
|
|
132
|
+
h = { a_name: 'john', b_name: 'doe' }
|
|
133
|
+
result = h.deep_transform(value: -> k, v {
|
|
134
|
+
k.to_s.start_with?('a') ? v.upcase : v
|
|
135
|
+
})
|
|
136
|
+
assert_equal({ a_name: 'JOHN', b_name: 'doe' }, result)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def test_arity_3_transformation
|
|
140
|
+
# Sliding window sum using parent context
|
|
141
|
+
input = (1..5).to_a # [1, 2, 3, 4, 5]
|
|
142
|
+
result = input.deep_transform(value: -> i, x, c {
|
|
143
|
+
Integer === x ? (i + 1) * x : x
|
|
144
|
+
})
|
|
145
|
+
assert_equal [ 1, 4, 9, 16, 25 ], result # 🤔 I've seen this before
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
def test_invalid_zero_arity
|
|
149
|
+
h = { a: 1 }
|
|
150
|
+
assert_raise(ArgumentError) do
|
|
151
|
+
h.deep_transform(value: -> { :nix })
|
|
152
|
+
end
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
def test_invalid_arity
|
|
156
|
+
h = { a: 1 }
|
|
157
|
+
assert_raise(ArgumentError) do
|
|
158
|
+
h.deep_transform(value: -> k, v, c, extra { v })
|
|
159
|
+
end
|
|
160
|
+
end
|
|
161
|
+
end
|
|
162
|
+
end
|
data/tins.gemspec
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
# -*- encoding: utf-8 -*-
|
|
2
|
-
# stub: tins 1.
|
|
2
|
+
# stub: tins 1.56.0 ruby lib
|
|
3
3
|
|
|
4
4
|
Gem::Specification.new do |s|
|
|
5
5
|
s.name = "tins".freeze
|
|
6
|
-
s.version = "1.
|
|
6
|
+
s.version = "1.56.0".freeze
|
|
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]
|
|
@@ -11,15 +11,15 @@ Gem::Specification.new do |s|
|
|
|
11
11
|
s.date = "1980-01-02"
|
|
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
|
-
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/date_dummy.rb".freeze, "lib/tins/date_time_dummy.rb".freeze, "lib/tins/deep_dup.rb".freeze, "lib/tins/deprecate.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_bfs.rb".freeze, "lib/tins/hash_dfs.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/lru_cache.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_named_placeholders.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/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/date_dummy.rb".freeze, "lib/tins/xt/date_time_dummy.rb".freeze, "lib/tins/xt/deep_dup.rb".freeze, "lib/tins/xt/deprecate.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_bfs.rb".freeze, "lib/tins/xt/hash_dfs.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/minimize.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_named_placeholders.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/write.rb".freeze]
|
|
15
|
-
s.files = [".envrc".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "examples/add_one.png".freeze, "examples/add_one.stm".freeze, "examples/bb3.png".freeze, "examples/bb3.stm".freeze, "examples/concatenate_compare.mtm".freeze, "examples/concatenate_compare.png".freeze, "examples/length_difference.mtm".freeze, "examples/length_difference.png".freeze, "examples/let.rb".freeze, "examples/mail.rb".freeze, "examples/minsky.rb".freeze, "examples/multiply.reg".freeze, "examples/null_pattern.rb".freeze, "examples/ones_difference-mtm.png".freeze, "examples/ones_difference-stm.png".freeze, "examples/ones_difference.mtm".freeze, "examples/ones_difference.stm".freeze, "examples/prefix-equals-suffix-reversed-with-infix.png".freeze, "examples/prefix-equals-suffix-reversed-with-infix.stm".freeze, "examples/recipe.rb".freeze, "examples/recipe2.rb".freeze, "examples/recipe_common.rb".freeze, "examples/subtract.reg".freeze, "examples/turing-graph.rb".freeze, "examples/turing.rb".freeze, "lib/dslkit.rb".freeze, "lib/dslkit/polite.rb".freeze, "lib/dslkit/rude.rb".freeze, "lib/spruz".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/date_dummy.rb".freeze, "lib/tins/date_time_dummy.rb".freeze, "lib/tins/deep_dup.rb".freeze, "lib/tins/deprecate.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_bfs.rb".freeze, "lib/tins/hash_dfs.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/lru_cache.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_named_placeholders.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/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/date_dummy.rb".freeze, "lib/tins/xt/date_time_dummy.rb".freeze, "lib/tins/xt/deep_dup.rb".freeze, "lib/tins/xt/deprecate.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_bfs.rb".freeze, "lib/tins/xt/hash_dfs.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/minimize.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_named_placeholders.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/write.rb".freeze, "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/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_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_bfs_test.rb".freeze, "tests/hash_dfs_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/lru_cache_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_named_placeholders.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/unit_test.rb".freeze, "tins.gemspec".freeze]
|
|
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/date_dummy.rb".freeze, "lib/tins/date_time_dummy.rb".freeze, "lib/tins/deep_dup.rb".freeze, "lib/tins/deep_transform.rb".freeze, "lib/tins/deprecate.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_bfs.rb".freeze, "lib/tins/hash_dfs.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/lru_cache.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_named_placeholders.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/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/date_dummy.rb".freeze, "lib/tins/xt/date_time_dummy.rb".freeze, "lib/tins/xt/deep_dup.rb".freeze, "lib/tins/xt/deep_transform.rb".freeze, "lib/tins/xt/deprecate.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_bfs.rb".freeze, "lib/tins/xt/hash_dfs.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/minimize.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_named_placeholders.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/write.rb".freeze]
|
|
15
|
+
s.files = [".envrc".freeze, "CHANGES.md".freeze, "Gemfile".freeze, "LICENSE".freeze, "README.md".freeze, "Rakefile".freeze, "examples/add_one.png".freeze, "examples/add_one.stm".freeze, "examples/bb3.png".freeze, "examples/bb3.stm".freeze, "examples/concatenate_compare.mtm".freeze, "examples/concatenate_compare.png".freeze, "examples/length_difference.mtm".freeze, "examples/length_difference.png".freeze, "examples/let.rb".freeze, "examples/mail.rb".freeze, "examples/minsky.rb".freeze, "examples/multiply.reg".freeze, "examples/null_pattern.rb".freeze, "examples/ones_difference-mtm.png".freeze, "examples/ones_difference-stm.png".freeze, "examples/ones_difference.mtm".freeze, "examples/ones_difference.stm".freeze, "examples/prefix-equals-suffix-reversed-with-infix.png".freeze, "examples/prefix-equals-suffix-reversed-with-infix.stm".freeze, "examples/recipe.rb".freeze, "examples/recipe2.rb".freeze, "examples/recipe_common.rb".freeze, "examples/subtract.reg".freeze, "examples/turing-graph.rb".freeze, "examples/turing.rb".freeze, "lib/dslkit.rb".freeze, "lib/dslkit/polite.rb".freeze, "lib/dslkit/rude.rb".freeze, "lib/spruz".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/date_dummy.rb".freeze, "lib/tins/date_time_dummy.rb".freeze, "lib/tins/deep_dup.rb".freeze, "lib/tins/deep_transform.rb".freeze, "lib/tins/deprecate.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_bfs.rb".freeze, "lib/tins/hash_dfs.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/lru_cache.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_named_placeholders.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/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/date_dummy.rb".freeze, "lib/tins/xt/date_time_dummy.rb".freeze, "lib/tins/xt/deep_dup.rb".freeze, "lib/tins/xt/deep_transform.rb".freeze, "lib/tins/xt/deprecate.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_bfs.rb".freeze, "lib/tins/xt/hash_dfs.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/minimize.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_named_placeholders.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/write.rb".freeze, "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/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/deep_transform_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_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_bfs_test.rb".freeze, "tests/hash_dfs_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/lru_cache_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_named_placeholders.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/unit_test.rb".freeze, "tins.gemspec".freeze]
|
|
16
16
|
s.homepage = "https://github.com/flori/tins".freeze
|
|
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(">= 3.1".freeze)
|
|
20
|
-
s.rubygems_version = "4.0.
|
|
20
|
+
s.rubygems_version = "4.0.17".freeze
|
|
21
21
|
s.summary = "Useful stuff.".freeze
|
|
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/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_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_bfs_test.rb".freeze, "tests/hash_dfs_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/lru_cache_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_named_placeholders.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/unit_test.rb".freeze, "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/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_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_bfs_test.rb".freeze, "tests/hash_dfs_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/lru_cache_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/time_dummy_test.rb".freeze, "tests/time_freezer_test.rb".freeze, "tests/to_test.rb".freeze, "tests/token_test.rb".freeze, "tests/unit_test.rb".freeze]
|
|
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/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/deep_transform_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_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_bfs_test.rb".freeze, "tests/hash_dfs_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/lru_cache_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_named_placeholders.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/unit_test.rb".freeze, "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/date_dummy_test.rb".freeze, "tests/date_time_dummy_test.rb".freeze, "tests/deep_dup_test.rb".freeze, "tests/deep_transform_test.rb".freeze, "tests/delegate_test.rb".freeze, "tests/deprecate_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_bfs_test.rb".freeze, "tests/hash_dfs_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/lru_cache_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/time_dummy_test.rb".freeze, "tests/time_freezer_test.rb".freeze, "tests/to_test.rb".freeze, "tests/token_test.rb".freeze, "tests/unit_test.rb".freeze]
|
|
23
23
|
|
|
24
24
|
s.specification_version = 4
|
|
25
25
|
|
|
@@ -31,6 +31,7 @@ Gem::Specification.new do |s|
|
|
|
31
31
|
s.add_development_dependency(%q<test-unit>.freeze, ["~> 3.7".freeze])
|
|
32
32
|
s.add_runtime_dependency(%q<sync>.freeze, [">= 0".freeze])
|
|
33
33
|
s.add_runtime_dependency(%q<bigdecimal>.freeze, [">= 0".freeze])
|
|
34
|
+
s.add_runtime_dependency(%q<irb>.freeze, [">= 0".freeze])
|
|
34
35
|
s.add_runtime_dependency(%q<readline>.freeze, [">= 0".freeze])
|
|
35
36
|
s.add_runtime_dependency(%q<mize>.freeze, ["~> 0.6".freeze])
|
|
36
37
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: tins
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 1.
|
|
4
|
+
version: 1.56.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Florian Frank
|
|
@@ -121,6 +121,20 @@ dependencies:
|
|
|
121
121
|
- - ">="
|
|
122
122
|
- !ruby/object:Gem::Version
|
|
123
123
|
version: '0'
|
|
124
|
+
- !ruby/object:Gem::Dependency
|
|
125
|
+
name: irb
|
|
126
|
+
requirement: !ruby/object:Gem::Requirement
|
|
127
|
+
requirements:
|
|
128
|
+
- - ">="
|
|
129
|
+
- !ruby/object:Gem::Version
|
|
130
|
+
version: '0'
|
|
131
|
+
type: :runtime
|
|
132
|
+
prerelease: false
|
|
133
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
134
|
+
requirements:
|
|
135
|
+
- - ">="
|
|
136
|
+
- !ruby/object:Gem::Version
|
|
137
|
+
version: '0'
|
|
124
138
|
- !ruby/object:Gem::Dependency
|
|
125
139
|
name: readline
|
|
126
140
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -171,6 +185,7 @@ extra_rdoc_files:
|
|
|
171
185
|
- lib/tins/date_dummy.rb
|
|
172
186
|
- lib/tins/date_time_dummy.rb
|
|
173
187
|
- lib/tins/deep_dup.rb
|
|
188
|
+
- lib/tins/deep_transform.rb
|
|
174
189
|
- lib/tins/deprecate.rb
|
|
175
190
|
- lib/tins/dslkit.rb
|
|
176
191
|
- lib/tins/duration.rb
|
|
@@ -233,6 +248,7 @@ extra_rdoc_files:
|
|
|
233
248
|
- lib/tins/xt/date_dummy.rb
|
|
234
249
|
- lib/tins/xt/date_time_dummy.rb
|
|
235
250
|
- lib/tins/xt/deep_dup.rb
|
|
251
|
+
- lib/tins/xt/deep_transform.rb
|
|
236
252
|
- lib/tins/xt/deprecate.rb
|
|
237
253
|
- lib/tins/xt/dslkit.rb
|
|
238
254
|
- lib/tins/xt/expose.rb
|
|
@@ -319,6 +335,7 @@ files:
|
|
|
319
335
|
- lib/tins/date_dummy.rb
|
|
320
336
|
- lib/tins/date_time_dummy.rb
|
|
321
337
|
- lib/tins/deep_dup.rb
|
|
338
|
+
- lib/tins/deep_transform.rb
|
|
322
339
|
- lib/tins/deprecate.rb
|
|
323
340
|
- lib/tins/dslkit.rb
|
|
324
341
|
- lib/tins/duration.rb
|
|
@@ -381,6 +398,7 @@ files:
|
|
|
381
398
|
- lib/tins/xt/date_dummy.rb
|
|
382
399
|
- lib/tins/xt/date_time_dummy.rb
|
|
383
400
|
- lib/tins/xt/deep_dup.rb
|
|
401
|
+
- lib/tins/xt/deep_transform.rb
|
|
384
402
|
- lib/tins/xt/deprecate.rb
|
|
385
403
|
- lib/tins/xt/dslkit.rb
|
|
386
404
|
- lib/tins/xt/expose.rb
|
|
@@ -429,6 +447,7 @@ files:
|
|
|
429
447
|
- tests/date_dummy_test.rb
|
|
430
448
|
- tests/date_time_dummy_test.rb
|
|
431
449
|
- tests/deep_dup_test.rb
|
|
450
|
+
- tests/deep_transform_test.rb
|
|
432
451
|
- tests/delegate_test.rb
|
|
433
452
|
- tests/deprecate_test.rb
|
|
434
453
|
- tests/dslkit_test.rb
|
|
@@ -504,7 +523,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
504
523
|
- !ruby/object:Gem::Version
|
|
505
524
|
version: '0'
|
|
506
525
|
requirements: []
|
|
507
|
-
rubygems_version: 4.0.
|
|
526
|
+
rubygems_version: 4.0.17
|
|
508
527
|
specification_version: 4
|
|
509
528
|
summary: Useful stuff.
|
|
510
529
|
test_files:
|
|
@@ -518,6 +537,7 @@ test_files:
|
|
|
518
537
|
- tests/date_dummy_test.rb
|
|
519
538
|
- tests/date_time_dummy_test.rb
|
|
520
539
|
- tests/deep_dup_test.rb
|
|
540
|
+
- tests/deep_transform_test.rb
|
|
521
541
|
- tests/delegate_test.rb
|
|
522
542
|
- tests/deprecate_test.rb
|
|
523
543
|
- tests/dslkit_test.rb
|