u-struct 0.8.0 → 0.9.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/CHANGELOG.md +4 -0
- data/Gemfile.lock +1 -1
- data/examples/person_1.rb +27 -0
- data/examples/person_2.rb +37 -0
- data/examples/rgb/color.rb +23 -0
- data/examples/rgb/number.rb +19 -0
- data/examples/rgb_1.rb +47 -0
- data/examples/rgb_2.rb +63 -0
- data/examples/rgb_3.rb +30 -0
- data/lib/micro/struct/creator/create_module.rb +18 -16
- data/lib/micro/struct/creator/create_struct.rb +11 -3
- data/lib/micro/struct/version.rb +1 -1
- metadata +9 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: '0765309623bfa9eb720102c66cd30f5ba785bdada60af711f19a03a51a7027bd'
|
4
|
+
data.tar.gz: 216dd4920427d682c9e797e5ec0a8631486b5d8c0613391440bd0f94f2778824
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ed911103da03769ac8014a618d713b313e20a19a65074ac1a737f2d4cd1717dbdf521d0f7693665d840bdbff145e518afe3e7ef875b1eef55d2555e198bf8d62
|
7
|
+
data.tar.gz: 683f94804b10f3ff03ed3f6ecbf4ff40c889dacf8dfd964496e8807974f96cbb611399fa21d95d73881a9c20d4dd0296975528cafc59dfbb20128471149c398a
|
data/CHANGELOG.md
CHANGED
data/Gemfile.lock
CHANGED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/inline'
|
4
|
+
|
5
|
+
gemfile do
|
6
|
+
source 'https://rubygems.org'
|
7
|
+
|
8
|
+
gem 'u-struct', path: '..'
|
9
|
+
end
|
10
|
+
|
11
|
+
Person = Micro::Struct.new(:first_name, :last_name, optional: :age) do
|
12
|
+
def name
|
13
|
+
"#{first_name} #{last_name}"
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
person = Person.new(first_name: 'Rodrigo', last_name: 'Serradura')
|
18
|
+
|
19
|
+
puts format('first_name: %p', person.first_name)
|
20
|
+
puts format('last_name: %p', person.last_name)
|
21
|
+
puts format('name: %p', person.name)
|
22
|
+
puts format('age: %p', person.age)
|
23
|
+
puts
|
24
|
+
|
25
|
+
person.age = rand(18..100)
|
26
|
+
|
27
|
+
puts format('age: %p', person.age)
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/inline'
|
4
|
+
|
5
|
+
gemfile do
|
6
|
+
source 'https://rubygems.org'
|
7
|
+
|
8
|
+
gem 'u-struct', path: '..'
|
9
|
+
end
|
10
|
+
|
11
|
+
Person = Micro::Struct.with(:readonly, :instance_copy).new(
|
12
|
+
required: [:first_name, :last_name],
|
13
|
+
optional: [:age]
|
14
|
+
) do
|
15
|
+
def name
|
16
|
+
"#{first_name} #{last_name}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
person = Person.new(first_name: 'Rodrigo', last_name: 'Serradura')
|
21
|
+
|
22
|
+
puts format('first_name: %p', person.first_name)
|
23
|
+
puts format('last_name: %p', person.last_name)
|
24
|
+
puts format('name: %p', person.name)
|
25
|
+
puts format('age: %p', person.age)
|
26
|
+
puts
|
27
|
+
|
28
|
+
rand_age = rand(18..100)
|
29
|
+
|
30
|
+
new_person = person.with(age: rand_age)
|
31
|
+
|
32
|
+
puts new_person.equal?(person)
|
33
|
+
|
34
|
+
puts format('age: %p', person.age)
|
35
|
+
puts format('age: %p', new_person.age)
|
36
|
+
|
37
|
+
person.age = rand_age
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RGB
|
4
|
+
Color = Micro::Struct.with(:readonly, :to_ary).new(:red, :green, :blue) do
|
5
|
+
def to_a
|
6
|
+
super.map(&:value)
|
7
|
+
end
|
8
|
+
|
9
|
+
def to_hex
|
10
|
+
"##{red}#{green}#{blue}"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
module Color
|
15
|
+
def self.new(r:, g:, b:)
|
16
|
+
__new__(
|
17
|
+
red: Number.new(r, label: 'r'),
|
18
|
+
green: Number.new(g, label: 'g'),
|
19
|
+
blue: Number.new(b, label: 'b')
|
20
|
+
)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RGB
|
4
|
+
Number = Micro::Struct.with(:readonly).new(:value) do
|
5
|
+
def to_s
|
6
|
+
value.to_s(16)
|
7
|
+
end
|
8
|
+
end
|
9
|
+
|
10
|
+
module Number
|
11
|
+
Input = Kind.object(name: 'Integer(>= 0 and <= 255)') do |value|
|
12
|
+
value.is_a?(::Integer) && value >= 0 && value <= 255
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.new(value, label:)
|
16
|
+
__new__(value: Input[value, label: label])
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/examples/rgb_1.rb
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/inline'
|
4
|
+
|
5
|
+
gemfile do
|
6
|
+
source 'https://rubygems.org'
|
7
|
+
|
8
|
+
gem 'u-struct', path: '..'
|
9
|
+
gem 'kind'
|
10
|
+
end
|
11
|
+
|
12
|
+
RGBColor = Micro::Struct.with(:readonly, :to_ary).new(:red, :green, :blue) do
|
13
|
+
def to_hex
|
14
|
+
"##{red.to_s(16)}#{green.to_s(16)}#{blue.to_s(16)}"
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module RGBColor
|
19
|
+
ColorNumber = Kind.object(name: 'Integer(>= 0 and <= 255)') do |value|
|
20
|
+
value.is_a?(::Integer) && value >= 0 && value <= 255
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.new(r:, g:, b:)
|
24
|
+
__new__(
|
25
|
+
red: ColorNumber[r, label: 'r'],
|
26
|
+
green: ColorNumber[g, label: 'g'],
|
27
|
+
blue: ColorNumber[b, label: 'b']
|
28
|
+
)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
rgb_color = RGBColor.new(r: 1, g: 1, b: 255)
|
33
|
+
|
34
|
+
p rgb_color
|
35
|
+
|
36
|
+
puts
|
37
|
+
puts format('to_hex: %p', rgb_color.to_hex)
|
38
|
+
puts format('to_a: %p', rgb_color.to_a)
|
39
|
+
puts
|
40
|
+
|
41
|
+
r, g, b = rgb_color
|
42
|
+
|
43
|
+
puts format('red: %p', r)
|
44
|
+
puts format('green: %p', g)
|
45
|
+
puts format('blue: %p', b)
|
46
|
+
|
47
|
+
RGBColor.new(r: 1, g: -1, b: 255) # Kind::Error (g: -1 expected to be a kind of Integer(>= 0 and <= 255))
|
data/examples/rgb_2.rb
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/inline'
|
4
|
+
|
5
|
+
gemfile do
|
6
|
+
source 'https://rubygems.org'
|
7
|
+
|
8
|
+
gem 'u-struct', path: '..'
|
9
|
+
gem 'kind'
|
10
|
+
end
|
11
|
+
|
12
|
+
RGBNumber = Micro::Struct.with(:readonly).new(:value) do
|
13
|
+
def to_s
|
14
|
+
value.to_s(16)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
module RGBNumber
|
19
|
+
Input = Kind.object(name: 'Integer(>= 0 and <= 255)') do |value|
|
20
|
+
value.is_a?(::Integer) && value >= 0 && value <= 255
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.new(value, label:)
|
24
|
+
__new__(value: Input[value, label: label])
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
RGBColor = Micro::Struct.with(:readonly, :to_ary).new(:red, :green, :blue) do
|
29
|
+
def to_a
|
30
|
+
[red.value, green.value, blue.value]
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_hex
|
34
|
+
"##{red}#{green}#{blue}"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module RGBColor
|
39
|
+
def self.new(r:, g:, b:)
|
40
|
+
__new__(
|
41
|
+
red: RGBNumber.new(r, label: 'r'),
|
42
|
+
green: RGBNumber.new(g, label: 'g'),
|
43
|
+
blue: RGBNumber.new(b, label: 'b')
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
rgb_color = RGBColor.new(r: 1, g: 1, b: 255)
|
49
|
+
|
50
|
+
p rgb_color
|
51
|
+
|
52
|
+
puts
|
53
|
+
puts format('to_hex: %p', rgb_color.to_hex)
|
54
|
+
puts format('to_a: %p', rgb_color.to_a)
|
55
|
+
puts
|
56
|
+
|
57
|
+
r, g, b = rgb_color
|
58
|
+
|
59
|
+
puts format('red: %p', r)
|
60
|
+
puts format('green: %p', g)
|
61
|
+
puts format('blue: %p', b)
|
62
|
+
|
63
|
+
RGB::Color.new(r: 1, g: -1, b: 255) # Kind::Error (g: -1 expected to be a kind of Integer(>= 0 and <= 255))
|
data/examples/rgb_3.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'bundler/inline'
|
4
|
+
|
5
|
+
gemfile do
|
6
|
+
source 'https://rubygems.org'
|
7
|
+
|
8
|
+
gem 'u-struct', path: '..'
|
9
|
+
gem 'kind'
|
10
|
+
end
|
11
|
+
|
12
|
+
require_relative 'rgb/number'
|
13
|
+
require_relative 'rgb/color'
|
14
|
+
|
15
|
+
rgb_color = RGB::Color.new(r: 1, g: 1, b: 255)
|
16
|
+
|
17
|
+
p rgb_color
|
18
|
+
|
19
|
+
puts
|
20
|
+
puts format('to_hex: %p', rgb_color.to_hex)
|
21
|
+
puts format('to_a: %p', rgb_color.to_a)
|
22
|
+
puts
|
23
|
+
|
24
|
+
r, g, b = rgb_color
|
25
|
+
|
26
|
+
puts format('red: %p', r)
|
27
|
+
puts format('green: %p', g)
|
28
|
+
puts format('blue: %p', b)
|
29
|
+
|
30
|
+
RGB::Color.new(r: 1, g: -1, b: 255) # Kind::Error (g: -1 expected to be a kind of Integer(>= 0 and <= 255))
|
@@ -10,7 +10,7 @@ class Micro::Struct::Creator
|
|
10
10
|
def_initialize(container, required_members, optional_members)
|
11
11
|
def_triple_eq(container)
|
12
12
|
def_members(container)
|
13
|
-
def_to_proc(container
|
13
|
+
def_to_proc(container) if features[:to_proc]
|
14
14
|
|
15
15
|
container
|
16
16
|
end
|
@@ -28,35 +28,37 @@ class Micro::Struct::Creator
|
|
28
28
|
# We are doing this because the Struct constructor keyword init option treats everything as optional.
|
29
29
|
#
|
30
30
|
container.module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
31
|
-
|
32
|
-
|
33
|
-
|
31
|
+
def self.__new__(#{method_arguments}) # def self.__new__(a:, b:) do
|
32
|
+
Struct.send(:new, #{struct_arguments}) # Struct.send(:new, a, b)
|
33
|
+
end # end
|
34
|
+
|
35
|
+
class << self
|
36
|
+
alias new __new__
|
37
|
+
end
|
34
38
|
RUBY
|
35
39
|
end
|
36
40
|
|
37
41
|
def def_triple_eq(container)
|
38
42
|
container.module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
39
|
-
|
40
|
-
|
41
|
-
|
43
|
+
def self.===(other)
|
44
|
+
Struct === other
|
45
|
+
end
|
42
46
|
RUBY
|
43
47
|
end
|
44
48
|
|
45
49
|
def def_members(container)
|
46
50
|
container.module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
47
|
-
|
48
|
-
|
49
|
-
|
51
|
+
def self.members
|
52
|
+
Struct.members
|
53
|
+
end
|
50
54
|
RUBY
|
51
55
|
end
|
52
56
|
|
53
|
-
def def_to_proc(container
|
54
|
-
return unless features[:to_proc]
|
55
|
-
|
57
|
+
def def_to_proc(container)
|
56
58
|
container.module_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
57
|
-
|
58
|
-
|
59
|
-
|
59
|
+
def self.to_proc
|
60
|
+
->(hash) { new(**hash) }
|
61
|
+
end
|
60
62
|
RUBY
|
61
63
|
end
|
62
64
|
end
|
@@ -11,7 +11,7 @@ class Micro::Struct::Creator
|
|
11
11
|
def_to_ary(struct) if features[:to_ary]
|
12
12
|
def_to_hash(struct) if features[:to_hash]
|
13
13
|
def_readonly(struct) if features[:readonly]
|
14
|
-
def_instance_copy(struct) if features[:
|
14
|
+
def_instance_copy(struct) if features[:instance_copy]
|
15
15
|
|
16
16
|
struct
|
17
17
|
end
|
@@ -19,11 +19,19 @@ class Micro::Struct::Creator
|
|
19
19
|
private
|
20
20
|
|
21
21
|
def def_to_ary(struct)
|
22
|
-
struct.
|
22
|
+
struct.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
23
|
+
def to_ary
|
24
|
+
to_a
|
25
|
+
end
|
26
|
+
RUBY
|
23
27
|
end
|
24
28
|
|
25
29
|
def def_to_hash(struct)
|
26
|
-
struct.
|
30
|
+
struct.class_eval(<<-RUBY, __FILE__, __LINE__ + 1)
|
31
|
+
def to_hash
|
32
|
+
to_h
|
33
|
+
end
|
34
|
+
RUBY
|
27
35
|
end
|
28
36
|
|
29
37
|
def def_readonly(struct)
|
data/lib/micro/struct/version.rb
CHANGED
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.9.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-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -55,6 +55,13 @@ files:
|
|
55
55
|
- Rakefile
|
56
56
|
- bin/console
|
57
57
|
- bin/setup
|
58
|
+
- examples/person_1.rb
|
59
|
+
- examples/person_2.rb
|
60
|
+
- examples/rgb/color.rb
|
61
|
+
- examples/rgb/number.rb
|
62
|
+
- examples/rgb_1.rb
|
63
|
+
- examples/rgb_2.rb
|
64
|
+
- examples/rgb_3.rb
|
58
65
|
- lib/micro/struct.rb
|
59
66
|
- lib/micro/struct/creator.rb
|
60
67
|
- lib/micro/struct/creator/create_module.rb
|