u-struct 0.3.1 → 0.4.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/Gemfile.lock +1 -1
- data/lib/micro/struct/version.rb +1 -1
- data/lib/micro/struct.rb +97 -17
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1ebbd60464f2e2d2efd428b0091d68820ef2b5d1a4bc73bed1a474d22f2f0fac
|
4
|
+
data.tar.gz: 1965a2b7bd8da50c6c5c31acff5c950590146c060ced14e732d3a5b646dafd8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b7274b8401d134cc21408447b87a54472f5f5cdea5263c3ca24e1a4feab6c0104deea8ff1985edb49a3e58d6e91e27f52b908d6fa2974b26ed6472916ebc4cb9
|
7
|
+
data.tar.gz: 62238f702e13aaa61d13bcb6213819d79b67e373b3f768cf0675526baa7bf73aa7d1e6c8130d84072f8a6a124923de28318b34b2a44ae17b0de573513c557acf
|
data/Gemfile.lock
CHANGED
data/lib/micro/struct/version.rb
CHANGED
data/lib/micro/struct.rb
CHANGED
@@ -3,30 +3,110 @@
|
|
3
3
|
require_relative 'struct/version'
|
4
4
|
|
5
5
|
module Micro
|
6
|
+
# Micro::Struct.new(:first_name, :last_name, ...)
|
7
|
+
#
|
8
|
+
# Micro::Struct.with(:to_ary).new(:name) # or .with(:to_hash), .with(:to_proc)
|
9
|
+
#
|
10
|
+
# Micro::Struct.with(:to_ary, :to_hash).new(:name)
|
11
|
+
#
|
12
|
+
# Micro::Struct.with(:to_ary, :to_hash, :to_proc).new(:name)
|
13
|
+
#
|
14
|
+
# Micro::Struct.new(:name) {}
|
15
|
+
#
|
16
|
+
# Micro::Struct.with(...).new(:name) {}
|
6
17
|
module Struct
|
7
|
-
|
8
|
-
|
18
|
+
class Creator
|
19
|
+
module Features
|
20
|
+
DISABLED =
|
21
|
+
{ to_ary: false,
|
22
|
+
to_hash: false,
|
23
|
+
to_proc: false }.freeze
|
9
24
|
|
10
|
-
|
11
|
-
|
12
|
-
|
25
|
+
Expose = ->(to_ary:, to_hash:, to_proc:) do
|
26
|
+
{ to_ary: to_ary,
|
27
|
+
to_hash: to_hash,
|
28
|
+
to_proc: to_proc }
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.check(names)
|
32
|
+
features_to_enable =
|
33
|
+
Array(names).each_with_object({}) { |name, memo| memo[name] = true }
|
13
34
|
|
14
|
-
|
15
|
-
|
35
|
+
Expose.(**DISABLED.merge(features_to_enable))
|
36
|
+
end
|
37
|
+
end
|
16
38
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
def self.new(#{struct.members.join(':, ')}:) # def self.new(a:, b:) do
|
21
|
-
Struct.send(:new, #{struct.members.join(', ')}) # Struct.send(:new, a, b)
|
22
|
-
end # end
|
39
|
+
def initialize(features)
|
40
|
+
@features = Features.check(features)
|
41
|
+
end
|
23
42
|
|
24
|
-
|
25
|
-
|
43
|
+
def new(*members, &block)
|
44
|
+
def_module do |mod|
|
45
|
+
def_struct(mod, members, block) do |struct|
|
46
|
+
def_initialize(mod, struct)
|
47
|
+
def_to_ary(struct)
|
48
|
+
def_to_hash(struct)
|
49
|
+
def_to_proc(mod)
|
50
|
+
end
|
26
51
|
end
|
27
|
-
|
52
|
+
end
|
53
|
+
|
54
|
+
private
|
55
|
+
|
56
|
+
def def_module(&block)
|
57
|
+
Module.new.tap(&block)
|
58
|
+
end
|
59
|
+
|
60
|
+
def def_struct(mod, members, block)
|
61
|
+
struct = ::Struct.new(*members, &block)
|
62
|
+
struct.send(:private_class_method, :new)
|
63
|
+
|
64
|
+
mod.const_set(:Struct, struct)
|
65
|
+
|
66
|
+
yield struct
|
67
|
+
end
|
68
|
+
|
69
|
+
def def_initialize(mod, struct)
|
70
|
+
# The .new() method will require all of the Struct's keyword arguments.
|
71
|
+
# We are doing this because Struct's keyword_init option doesn't do that.
|
72
|
+
mod.module_eval(<<~RUBY, __FILE__, __LINE__ + 1) #
|
73
|
+
def self.new(#{struct.members.join(':, ')}:) # def self.new(a:, b:) do
|
74
|
+
Struct.send(:new, #{struct.members.join(', ')}) # Struct.send(:new, a, b)
|
75
|
+
end # end
|
28
76
|
|
29
|
-
|
77
|
+
def self.members
|
78
|
+
Struct.members
|
79
|
+
end
|
80
|
+
RUBY
|
81
|
+
end
|
82
|
+
|
83
|
+
def def_to_ary(struct)
|
84
|
+
struct.send(:alias_method, :to_ary, :to_a) if @features[:to_ary]
|
85
|
+
end
|
86
|
+
|
87
|
+
def def_to_hash(struct)
|
88
|
+
struct.send(:alias_method, :to_hash, :to_h) if @features[:to_hash]
|
89
|
+
end
|
90
|
+
|
91
|
+
def def_to_proc(mod)
|
92
|
+
return unless @features[:to_proc]
|
93
|
+
|
94
|
+
mod.module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
|
95
|
+
def self.to_proc
|
96
|
+
->(hash) { new(**hash) }
|
97
|
+
end
|
98
|
+
RUBY
|
99
|
+
end
|
30
100
|
end
|
101
|
+
|
102
|
+
def self.new(*members, &block)
|
103
|
+
with.new(*members, &block)
|
104
|
+
end
|
105
|
+
|
106
|
+
def self.with(*features)
|
107
|
+
Creator.new(features)
|
108
|
+
end
|
109
|
+
|
110
|
+
private_constant :Creator
|
31
111
|
end
|
32
112
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: u-struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rodrigo Serradura
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-12-
|
11
|
+
date: 2021-12-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -81,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: '0'
|
83
83
|
requirements: []
|
84
|
-
rubygems_version: 3.2.
|
84
|
+
rubygems_version: 3.2.21
|
85
85
|
signing_key:
|
86
86
|
specification_version: 4
|
87
87
|
summary: Create powered Ruby structs.
|