shale-builder 0.1.3 → 0.1.4

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: 4b0eb2f219fcd64c0f89f347f70e892e96f7b18490450a42557a39525e14fabe
4
- data.tar.gz: c1f7b8a45efd094bc4f43028e56eae5d0da322357bbf0d6c1e882021a8da92e6
3
+ metadata.gz: bf1a615a9515f8312498f25d2c15163b42c472cde871ddb73fccabe9b0135854
4
+ data.tar.gz: b014989e7ece28fe8f88a9b49e6e543c0606e382927b8ec2f86a9f9ddad00210
5
5
  SHA512:
6
- metadata.gz: c02cb9e08061c9d978f2e64be2ede31a3a874cc4b5f9e420f00bfe39771e69d48930fd6c063d7a8d6d066a8a3bfcd3faf7c2e58983d081d1ee852c8a2d59c377
7
- data.tar.gz: 69bd7e9e44ae49c0f9bc2a7c19b5b7472d28a56c841b215b8a4be2bbd49dc42f99b3b43bd2d782a87b86a93d1534957af4356184a9e50926ee423b8277ef4bac
6
+ metadata.gz: 36d8c81ec9eae051dd80ce8cdcd342fa92eac54962834212e22bda6c9dcef9c0068812dad6e50590a41ab3d135fce072e5a9bfd8900c4c97270ce2d268d76dae
7
+ data.tar.gz: 7ac199ea4dcdaeba2be4205414d7bb9d2612fe3113bb99b39276107815da02d4db0ff8e98b4c1e0886d0dfb8bc90728adb8137703b8d62eb178ff299ff252ad5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.1.4] - 2024-05-13
2
+
3
+ - Add a tapioca compiler for shale and shale builder
4
+
1
5
  ## [0.1.3] - 2023-11-23
2
6
 
3
7
  - Change shale version dependency from `< 1.0` to `< 2.0`
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shale-builder (0.1.3)
4
+ shale-builder (0.1.4)
5
5
  shale (< 2.0)
6
6
 
7
7
  GEM
@@ -3,6 +3,6 @@
3
3
  module Shale
4
4
  module Builder
5
5
  # @return [String]
6
- VERSION = '0.1.3'
6
+ VERSION = '0.1.4'
7
7
  end
8
8
  end
@@ -0,0 +1,103 @@
1
+ # typed: true
2
+ # frozen_string_literal: true
3
+
4
+ module Tapioca
5
+ module Compilers
6
+ class Shale < Tapioca::Dsl::Compiler
7
+ ConstantType = type_member { { fixed: T.class_of(::Shale::Mapper) } }
8
+
9
+ class << self
10
+ sig { override.returns(T::Enumerable[Module]) }
11
+ def gather_constants
12
+ # Collect all the classes that inherit from Shale::Mapper
13
+ all_classes.select { |c| c < ::Shale::Mapper }
14
+ end
15
+ end
16
+
17
+ sig { override.void }
18
+ def decorate
19
+ # Create a RBI definition for each class that inherits from Shale::Mapper
20
+ root.create_path(constant) do |klass|
21
+ has_shale_builder = includes_shale_builder(constant)
22
+
23
+ # For each attribute defined in the class
24
+ constant.attributes.each_value do |attribute|
25
+ non_nilable_type, nilable_type = shale_type_to_sorbet_type(attribute)
26
+ type = nilable_type
27
+ if attribute.collection?
28
+ type = "T.nilable(T::Array[#{non_nilable_type}])"
29
+ end
30
+
31
+ if has_shale_builder && attribute.type < ::Shale::Mapper
32
+ sigs = T.let([], T::Array[RBI::Sig])
33
+ # simple getter
34
+ sigs << klass.create_sig(
35
+ parameters: { block: 'NilClass' },
36
+ return_type: type,
37
+ )
38
+ # getter with block
39
+ sigs << klass.create_sig(
40
+ parameters: { block: "T.proc.params(arg0: #{non_nilable_type}).void" },
41
+ return_type: non_nilable_type
42
+ )
43
+ klass.create_method_with_sigs(
44
+ attribute.name,
45
+ sigs: sigs,
46
+ parameters: [RBI::BlockParam.new('block')],
47
+ )
48
+ else
49
+ klass.create_method(attribute.name, return_type: type)
50
+ end
51
+
52
+ # setter
53
+ klass.create_method(
54
+ "#{attribute.name}=",
55
+ parameters: [create_param('value', type: type)],
56
+ return_type: type,
57
+ )
58
+ end
59
+ end
60
+
61
+ end
62
+
63
+ private
64
+
65
+ sig { params(klass: Class).returns(T.nilable(T::Boolean)) }
66
+ def includes_shale_builder(klass)
67
+ return false unless defined?(::Shale::Builder)
68
+
69
+ klass < ::Shale::Builder
70
+ end
71
+
72
+ SHALE_TYPES_MAP = T.let(
73
+ {
74
+ ::Shale::Type::Value => Object,
75
+ ::Shale::Type::String => String,
76
+ ::Shale::Type::Float => Float,
77
+ ::Shale::Type::Integer => Integer,
78
+ ::Shale::Type::Time => Time,
79
+ ::Shale::Type::Date => Date,
80
+ }.freeze,
81
+ T::Hash[Class, Class],
82
+ )
83
+
84
+ sig { params(attribute: ::Shale::Attribute).returns([String, String]) }
85
+ def shale_type_to_sorbet_type(attribute)
86
+ return_type = SHALE_TYPES_MAP[attribute.type]
87
+ return complex_shale_type_to_sorbet_type(attribute) unless return_type
88
+ return [T.must(return_type.name), T.must(return_type.name)] if attribute.collection? || attribute.default.is_a?(return_type)
89
+
90
+ [T.must(return_type.name), "T.nilable(#{return_type.name})"]
91
+ end
92
+
93
+ sig { params(attribute: ::Shale::Attribute).returns([String, String]) }
94
+ def complex_shale_type_to_sorbet_type(attribute)
95
+ return [T.cast(attribute.type.to_s, String), "T.nilable(#{attribute.type})"] unless attribute.type.respond_to?(:return_type)
96
+
97
+ return_type_string = attribute.type.return_type.to_s
98
+ [return_type_string, return_type_string]
99
+ end
100
+
101
+ end
102
+ end
103
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shale-builder
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.3
4
+ version: 0.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mateusz Drewniak
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-11-23 00:00:00.000000000 Z
11
+ date: 2024-05-13 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: shale
@@ -42,6 +42,7 @@ files:
42
42
  - Rakefile
43
43
  - lib/shale/builder.rb
44
44
  - lib/shale/builder/version.rb
45
+ - lib/tapioca/dsl/compilers/shale.rb
45
46
  - sig/shale/builder.rbs
46
47
  homepage: https://github.com/Verseth/ruby-shale-builder
47
48
  licenses: