structure 3.1.1 → 3.2.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: 91e04b84b8e6a19728bf6212bdfd08895187bbe59ebf56b47288697962ed31b2
4
- data.tar.gz: '028e8df792d344faa2850f82504d223a6691c195203c51acd53581ee9e97064c'
3
+ metadata.gz: c798ddd0dce500c2053077d3964ffe907c1f13fa0b1b9f9394c18a1cc9829b31
4
+ data.tar.gz: 2c82c99faa38aeb774415121d793ff2205a628aecab194fe60a36746efcb983f
5
5
  SHA512:
6
- metadata.gz: 4e6fbbd3104fc0ed9001d66395606ab436a907cf3b1ab09f692c458b99e999e648e7b558dd0b2e8e4fb298d2c1c25decf51bef0ad5889bc9ff14f6d821c62ede
7
- data.tar.gz: 74752c31b2898fea6c7d5c94e568f7fa9ca2724e116aa62e9d9c30f0da77d3f6f7de7b73540a8837834536bc2aa9b87f9d5b596ddd0bfd2089222e3fbec07334
6
+ metadata.gz: f3ec870b530f010c1356ee2ecadb6ca6e2880e29b4f15b80e395812aad8d342737a547811c442c737c50ff1b4b6dc98a2496ae2aa7df6e657d76198bb964b82a
7
+ data.tar.gz: 30bafd22ee1ed82b7e5e5d702617200a31689fccad006df1e884d66d99b43c8b85ad9ae99004ca2b9a271f8b721a86c200553a289adc24496abf691b6f63573f
@@ -34,14 +34,8 @@ module Structure
34
34
  case type
35
35
  when :boolean
36
36
  boolean
37
- when Class, Module
38
- if type.name && Kernel.respond_to?(type.name)
39
- kernel(type)
40
- elsif type.respond_to?(:parse)
41
- parseable(type)
42
- else
43
- type
44
- end
37
+ when :self
38
+ self_referential
45
39
  when Array
46
40
  if type.length == 1
47
41
  array(type.first)
@@ -49,12 +43,23 @@ module Structure
49
43
  type
50
44
  end
51
45
  else
52
- type
46
+ # Handle Class, Module, and any other types
47
+ if type.respond_to?(:parse)
48
+ parseable(type)
49
+ elsif type.respond_to?(:name) && type.name && Kernel.respond_to?(type.name)
50
+ kernel(type)
51
+ else
52
+ type
53
+ end
53
54
  end
54
55
  end
55
56
 
56
57
  private
57
58
 
59
+ def self_referential
60
+ proc { |val| parse(val) }
61
+ end
62
+
58
63
  def kernel(type)
59
64
  ->(val) { Kernel.send(type.name, val) }
60
65
  end
@@ -64,8 +69,12 @@ module Structure
64
69
  end
65
70
 
66
71
  def array(element_type)
67
- element_coercer = coerce(element_type)
68
- ->(array) { array.map { |element| element_coercer.call(element) } }
72
+ if element_type == :self
73
+ proc { |array| array.map { |element| parse(element) } }
74
+ else
75
+ element_coercer = coerce(element_type)
76
+ ->(array) { array.map { |element| element_coercer.call(element) } }
77
+ end
69
78
  end
70
79
  end
71
80
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Structure
4
- VERSION = "3.1.1"
4
+ VERSION = "3.2.0"
5
5
  end
data/lib/structure.rb CHANGED
@@ -58,7 +58,13 @@ module Structure
58
58
 
59
59
  # Apply type coercion or transformation
60
60
  if types[attr] && !value.nil?
61
- value = types[attr].call(value)
61
+ type_or_proc = types[attr]
62
+ # Use instance_exec for non-lambda procs (self-referential types)
63
+ value = if type_or_proc.is_a?(Proc) && !type_or_proc.lambda?
64
+ instance_exec(value, &type_or_proc)
65
+ else
66
+ type_or_proc.call(value)
67
+ end
62
68
  end
63
69
 
64
70
  final_kwargs[attr] = value
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: structure
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.1.1
4
+ version: 3.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Hakan Ensari