dorian-to_struct 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 0d2ae1228e241d6efab9b69063436a06fa33bd77396b73fa9b1fad447123d38b
4
+ data.tar.gz: 0b14f6062c3d4195d1772410fa4507efe1ea9dd7fbe63a38c6a7f1e15b3d0fe2
5
+ SHA512:
6
+ metadata.gz: bc44b0c1d25518ae064145a75653b04e329c6c04e0818f71b17394c9e5632838b7146d0760c382d77e22e1cfbec0f4ad057ab8c575e1fc22fa19b578f522e92f
7
+ data.tar.gz: 28e0262534e2dd8c1552735c776e655fe4268a49e732698f2ed127e4d57e9aa0326682f7ad44a0437938dfbb716414b2c828f734e1578a3858f55e5d0798b6c4
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Array
4
+ # Returns a new struct with the same key/value pairs
5
+ #
6
+ # users = [{ first_name: "Dorian", last_name: "Marié" }].to_struct
7
+ # users.first.first_name # => "Dorian"
8
+ # users.first.birthdate # => NoMethodError: undefined method `birthdate' for <struct...>
9
+ #
10
+ def to_struct
11
+ map { |item| item.respond_to?(:to_struct) ? item.to_struct : item }
12
+ end
13
+
14
+ # Returns a new struct with the same key/value pairs
15
+ #
16
+ # users = [{ name: { first: "Dorian", last: "Marié" }].to_struct
17
+ # users.first.name.first # => "Dorian"
18
+ #
19
+ def to_deep_struct
20
+ map do |item|
21
+ item.respond_to?(:to_deep_struct) ? item.to_deep_struct : item
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Hash
4
+ # Returns a new struct with the same key/value pairs
5
+ #
6
+ # user = { first_name: "Dorian", last_name: "Marié" }.to_struct
7
+ # user.first_name # => "Dorian"
8
+ # user.birthdate # => NoMethodError: undefined method `birthdate' for <struct...>
9
+ #
10
+ def to_struct
11
+ Struct.new(*keys).new(*values)
12
+ end
13
+
14
+ # Returns a new struct with the same key/value pairs
15
+ #
16
+ # user = { name: "Dorian", events: [{ name: "Party" }] }.to_deep_struct
17
+ # user.events.first.name # => "Party"
18
+ #
19
+ def to_deep_struct
20
+ Struct
21
+ .new(*keys)
22
+ .new(
23
+ *values.map do |value|
24
+ value.respond_to?(:to_deep_struct) ? value.to_deep_struct : value
25
+ end
26
+ )
27
+ end
28
+ end
@@ -0,0 +1,2 @@
1
+ require_relative "core_ext/hash/struct"
2
+ require_relative "core_ext/array/struct"
metadata ADDED
@@ -0,0 +1,48 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dorian-to_struct
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Dorian Marié
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2021-11-12 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: |-
14
+ Adds `#to_struct` and `#to_deep_struct` to Hash and Array
15
+
16
+ e.g. user.first_name, user.events.first.name, etc.
17
+ email: dorian@dorianmarie.fr
18
+ executables: []
19
+ extensions: []
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/dorian/core_ext/array/struct.rb
23
+ - lib/dorian/core_ext/hash/struct.rb
24
+ - lib/dorian/to_struct.rb
25
+ homepage: https://github.com/dorianmariefr/to_struct
26
+ licenses:
27
+ - MIT
28
+ metadata: {}
29
+ post_install_message:
30
+ rdoc_options: []
31
+ require_paths:
32
+ - lib
33
+ required_ruby_version: !ruby/object:Gem::Requirement
34
+ requirements:
35
+ - - ">="
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ required_rubygems_version: !ruby/object:Gem::Requirement
39
+ requirements:
40
+ - - ">="
41
+ - !ruby/object:Gem::Version
42
+ version: '0'
43
+ requirements: []
44
+ rubygems_version: 3.2.22
45
+ signing_key:
46
+ specification_version: 4
47
+ summary: Adds `#to_struct` and `#to_deep_struct` to Hash and Array
48
+ test_files: []