camel_snake_struct 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 84c35d8e18c588469d3a51f4de2cf83a161bb86bbc542c19ffe11ff3f4eee21d
4
- data.tar.gz: 301b56ed4e1b4e8c667ca9e14aea4f637af26d54520eef448498076b876654ac
3
+ metadata.gz: 19cacf8a8dd3f5e1758672ed4ba28f90784c0017cf65bd39947293eab12d86a6
4
+ data.tar.gz: b4282acdaad784ebc5f7cf4aea44af63cccf5ef23e1c86cc8b6b876b9afcf8d1
5
5
  SHA512:
6
- metadata.gz: f06b0d2ab615183f5b006832d18c1fcc53d0d34e749aca28bf811df24a20e4e789059f82fb12ed7bc15ea489d72e8d508a9f876f712bd8af37b1e9601bad060f
7
- data.tar.gz: 4931234a2ad68b760f50c5303b2b02838af23cd67e57a90fe4089c2a96fc55fb4aec22522b0c9d78b195ee0a0b63489f34b97248422cef11d022c52ba7df43c2
6
+ metadata.gz: 200e79a30d0e957e8833d757a6ea342bd79778459a7cfad2ac20c6e07859cf556c00092c8f0050325535e8982a6a7ae15f174e9a413bb1182bd0ca206684bad2
7
+ data.tar.gz: d5229f7d105c08f93b869acd0d33875026788a09133a227a82ba006f2b99ddc782b4d856fbd49fbf2d5069b4a3ef933d352e3111f6a45b5ce7656e60a1a791ac
data/.gitignore CHANGED
@@ -11,4 +11,5 @@
11
11
  .rspec_status
12
12
  vendor/bundle
13
13
  gems.locked
14
+ Gemfile.lock
14
15
  .ruby-version
data/.rubocop.yml CHANGED
@@ -20,6 +20,12 @@ Metrics/MethodLength:
20
20
  Metrics/ClassLength:
21
21
  Max: 200
22
22
 
23
+ Metrics/CyclomaticComplexity:
24
+ Max: 9
25
+
26
+ Metrics/PerceivedComplexity:
27
+ Max: 9
28
+
23
29
  Gemspec/RequiredRubyVersion:
24
30
  Enabled: false
25
31
 
data/CHANGELOG.md CHANGED
@@ -1,3 +1,6 @@
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
+
1
4
  # 0.2.1
2
5
  * activesupport < 8.0
3
6
 
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,7 +9,7 @@
9
9
  #
10
10
 
11
11
  require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
13
  Pathname.new(__FILE__).realpath)
14
14
 
15
15
  bundle_binstub = File.expand_path("../bundle", __FILE__)
data/bin/rspec CHANGED
@@ -9,7 +9,7 @@
9
9
  #
10
10
 
11
11
  require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
13
  Pathname.new(__FILE__).realpath)
14
14
 
15
15
  bundle_binstub = File.expand_path("../bundle", __FILE__)
data/bin/rubocop CHANGED
@@ -9,7 +9,7 @@
9
9
  #
10
10
 
11
11
  require "pathname"
12
- ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../gems.rb",
12
+ ENV["BUNDLE_GEMFILE"] ||= File.expand_path("../../Gemfile",
13
13
  Pathname.new(__FILE__).realpath)
14
14
 
15
15
  bundle_binstub = File.expand_path("../bundle", __FILE__)
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |spec|
2
2
  spec.name = "camel_snake_struct"
3
- spec.version = "0.2.1"
3
+ spec.version = "0.3.0"
4
4
  spec.authors = ["Grant Petersen-Speelman"]
5
5
  spec.email = ["grant@nexl.io"]
6
6
 
@@ -3,10 +3,18 @@ require 'active_support/core_ext/string'
3
3
 
4
4
  class CamelSnakeStruct
5
5
  def self.example(data)
6
+ raise ArgumentError, "Examples are for Learning Structs" if self == CamelSnakeStruct
7
+
6
8
  new_example = new(data)
7
9
  walk_example(new_example)
8
10
  end
9
11
 
12
+ Type__Meta__Data = Struct.new(:class_types, :array) do
13
+ def classes
14
+ class_types.to_a
15
+ end
16
+ end
17
+
10
18
  def self.walk_example(new_example)
11
19
  new_example.send(:_method_to_key).keys.each do |m_name|
12
20
  result = new_example.public_send(m_name)
@@ -15,9 +23,25 @@ class CamelSnakeStruct
15
23
  elsif result.is_a?(Array) && result.first.is_a?(CamelSnakeStruct)
16
24
  walk_example(result.first)
17
25
  end
26
+
27
+ store_meta_data(new_example.class, m_name, result)
18
28
  end
19
29
  end
20
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
+
21
45
  def initialize(hash)
22
46
  @_raw_hash = hash&.to_h || {}
23
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.2.1
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Grant Petersen-Speelman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-01-11 00:00:00.000000000 Z
11
+ date: 2023-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -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: []
File without changes