camel_snake_struct 0.2.0 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +3 -1
- data/.rubocop.yml +13 -1
- data/CHANGELOG.md +6 -0
- data/README.md +12 -0
- data/bin/rake +2 -2
- data/bin/rspec +1 -1
- data/bin/rubocop +1 -1
- data/camel_snake_struct.gemspec +3 -2
- data/lib/camel_snake_struct.rb +25 -0
- metadata +10 -9
- /data/{gems.rb → Gemfile} +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 19cacf8a8dd3f5e1758672ed4ba28f90784c0017cf65bd39947293eab12d86a6
|
4
|
+
data.tar.gz: b4282acdaad784ebc5f7cf4aea44af63cccf5ef23e1c86cc8b6b876b9afcf8d1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 200e79a30d0e957e8833d757a6ea342bd79778459a7cfad2ac20c6e07859cf556c00092c8f0050325535e8982a6a7ae15f174e9a413bb1182bd0ca206684bad2
|
7
|
+
data.tar.gz: d5229f7d105c08f93b869acd0d33875026788a09133a227a82ba006f2b99ddc782b4d856fbd49fbf2d5069b4a3ef933d352e3111f6a45b5ce7656e60a1a791ac
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -4,7 +4,7 @@ require:
|
|
4
4
|
|
5
5
|
AllCops:
|
6
6
|
NewCops: enable
|
7
|
-
TargetRubyVersion: 2.
|
7
|
+
TargetRubyVersion: 2.5
|
8
8
|
Exclude:
|
9
9
|
- 'vendor/**/*'
|
10
10
|
|
@@ -19,3 +19,15 @@ Metrics/MethodLength:
|
|
19
19
|
|
20
20
|
Metrics/ClassLength:
|
21
21
|
Max: 200
|
22
|
+
|
23
|
+
Metrics/CyclomaticComplexity:
|
24
|
+
Max: 9
|
25
|
+
|
26
|
+
Metrics/PerceivedComplexity:
|
27
|
+
Max: 9
|
28
|
+
|
29
|
+
Gemspec/RequiredRubyVersion:
|
30
|
+
Enabled: false
|
31
|
+
|
32
|
+
Bundler/GemFilename:
|
33
|
+
Enabled: false
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
# 0.3.0
|
2
|
+
* Learning Structs store meta data about the shape of the hash from the examples provided. This can be used with tapioca custom DSL compilers to generate sorbet types
|
3
|
+
|
4
|
+
# 0.2.1
|
5
|
+
* activesupport < 8.0
|
6
|
+
|
1
7
|
# 0.2.0
|
2
8
|
* Add support to check if key is set
|
3
9
|
|
data/README.md
CHANGED
@@ -67,6 +67,18 @@ puts result3.date.timezone # nil
|
|
67
67
|
puts result3.date.unix_time # nil
|
68
68
|
```
|
69
69
|
|
70
|
+
Learning Structs store meta data about the shape of the hash from the examples provided.
|
71
|
+
This can be used with tapioca custom DSL compilers to generate sorbet types
|
72
|
+
|
73
|
+
```ruby
|
74
|
+
MyLoadedStruct = Class.new(CamelSnakeStruct)
|
75
|
+
MyLoadedStruct.example('data' => [{ 'name' => 'Jeff' }], 'errors' => [], 'date' => { 'timezone' => 'UTC', 'unixTime' => 0})
|
76
|
+
|
77
|
+
puts MyLoadedStruct.types_meta_data
|
78
|
+
# {"data"=>#<struct CamelSnakeStruct::Type__Meta__Data class_types=#<Set: {MyLoadedStruct::Datum}>, array=true>, "errors"=>#<struct CamelSnakeStruct::Type__Meta__Data class_types=#<Set: {}>, array=true>, "date"=>#<struct CamelSnakeStruct::Type__Meta__Data class_types=#<Set: {MyLoadedStruct::Date}>, array=false>}
|
79
|
+
```
|
80
|
+
|
81
|
+
|
70
82
|
### Limitations
|
71
83
|
|
72
84
|
* Expects to receive a hash
|
data/bin/rake
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
#
|
10
10
|
|
11
11
|
require "pathname"
|
12
|
-
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../
|
13
|
-
|
12
|
+
ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
|
13
|
+
Pathname.new(__FILE__).realpath)
|
14
14
|
|
15
15
|
bundle_binstub = File.expand_path("../bundle", __FILE__)
|
16
16
|
|
data/bin/rspec
CHANGED
data/bin/rubocop
CHANGED
data/camel_snake_struct.gemspec
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
Gem::Specification.new do |spec|
|
2
2
|
spec.name = "camel_snake_struct"
|
3
|
-
spec.version = "0.
|
3
|
+
spec.version = "0.3.0"
|
4
4
|
spec.authors = ["Grant Petersen-Speelman"]
|
5
5
|
spec.email = ["grant@nexl.io"]
|
6
6
|
|
@@ -21,5 +21,6 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.bindir = "exe"
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
23
23
|
spec.require_paths = ["lib"]
|
24
|
-
spec.add_dependency 'activesupport', '>= 3.2', '<
|
24
|
+
spec.add_dependency 'activesupport', '>= 3.2', '< 8.0'
|
25
|
+
spec.metadata['rubygems_mfa_required'] = 'true'
|
25
26
|
end
|
data/lib/camel_snake_struct.rb
CHANGED
@@ -1,11 +1,20 @@
|
|
1
|
+
require "active_support"
|
1
2
|
require 'active_support/core_ext/string'
|
2
3
|
|
3
4
|
class CamelSnakeStruct
|
4
5
|
def self.example(data)
|
6
|
+
raise ArgumentError, "Examples are for Learning Structs" if self == CamelSnakeStruct
|
7
|
+
|
5
8
|
new_example = new(data)
|
6
9
|
walk_example(new_example)
|
7
10
|
end
|
8
11
|
|
12
|
+
Type__Meta__Data = Struct.new(:class_types, :array) do
|
13
|
+
def classes
|
14
|
+
class_types.to_a
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
9
18
|
def self.walk_example(new_example)
|
10
19
|
new_example.send(:_method_to_key).keys.each do |m_name|
|
11
20
|
result = new_example.public_send(m_name)
|
@@ -14,9 +23,25 @@ class CamelSnakeStruct
|
|
14
23
|
elsif result.is_a?(Array) && result.first.is_a?(CamelSnakeStruct)
|
15
24
|
walk_example(result.first)
|
16
25
|
end
|
26
|
+
|
27
|
+
store_meta_data(new_example.class, m_name, result)
|
17
28
|
end
|
18
29
|
end
|
19
30
|
|
31
|
+
def self.store_meta_data(example_class, m_name, result)
|
32
|
+
types_meta_data = (example_class.types_meta_data[m_name] ||= Type__Meta__Data.new(Set.new, false))
|
33
|
+
if result.is_a?(Array)
|
34
|
+
types_meta_data.array = true
|
35
|
+
result.map(&:class).each { |c| types_meta_data.class_types << c }
|
36
|
+
else
|
37
|
+
types_meta_data.class_types << result.class
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.types_meta_data
|
42
|
+
@types_meta_data ||= {}
|
43
|
+
end
|
44
|
+
|
20
45
|
def initialize(hash)
|
21
46
|
@_raw_hash = hash&.to_h || {}
|
22
47
|
@_method_to_key = @_raw_hash.keys.each_with_object({}) do |key, mapping|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: camel_snake_struct
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Grant Petersen-Speelman
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-04-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
version: '3.2'
|
20
20
|
- - "<"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: '
|
22
|
+
version: '8.0'
|
23
23
|
type: :runtime
|
24
24
|
prerelease: false
|
25
25
|
version_requirements: !ruby/object:Gem::Requirement
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: '3.2'
|
30
30
|
- - "<"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: '
|
32
|
+
version: '8.0'
|
33
33
|
description: Easily access camelCased hashes in a ruby friendly way
|
34
34
|
email:
|
35
35
|
- grant@nexl.io
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- ".rspec"
|
42
42
|
- ".rubocop.yml"
|
43
43
|
- CHANGELOG.md
|
44
|
+
- Gemfile
|
44
45
|
- README.md
|
45
46
|
- Rakefile
|
46
47
|
- bin/console
|
@@ -49,7 +50,6 @@ files:
|
|
49
50
|
- bin/rubocop
|
50
51
|
- bin/setup
|
51
52
|
- camel_snake_struct.gemspec
|
52
|
-
- gems.rb
|
53
53
|
- lib/camel_snake_struct.rb
|
54
54
|
homepage: https://github.com/NEXL-LTS/camel_snake_struct-ruby
|
55
55
|
licenses: []
|
@@ -57,7 +57,8 @@ metadata:
|
|
57
57
|
homepage_uri: https://github.com/NEXL-LTS/camel_snake_struct-ruby
|
58
58
|
source_code_uri: https://github.com/NEXL-LTS/camel_snake_struct-ruby
|
59
59
|
changelog_uri: https://github.com/NEXL-LTS/camel_snake_struct/CHANGELOG.md
|
60
|
-
|
60
|
+
rubygems_mfa_required: 'true'
|
61
|
+
post_install_message:
|
61
62
|
rdoc_options: []
|
62
63
|
require_paths:
|
63
64
|
- lib
|
@@ -72,8 +73,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
73
|
- !ruby/object:Gem::Version
|
73
74
|
version: '0'
|
74
75
|
requirements: []
|
75
|
-
rubygems_version: 3.
|
76
|
-
signing_key:
|
76
|
+
rubygems_version: 3.1.6
|
77
|
+
signing_key:
|
77
78
|
specification_version: 4
|
78
79
|
summary: Easily access camelCased hashes in a ruby friendly way
|
79
80
|
test_files: []
|
/data/{gems.rb → Gemfile}
RENAMED
File without changes
|