camille 0.5.5 → 0.5.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a587c953d4d716329e30ee94c7dfd2b67fcbb9d95b6aee5acc3a74ba7d8e2883
4
- data.tar.gz: 28cf879c56d17ac119c2913c14d2ce09548c226b8f9120aa5fd5ccc3ab8334d0
3
+ metadata.gz: 991a6d473c51e10dce629da09a1b430ff316b448521bf8631b8994b358cdc809
4
+ data.tar.gz: 34398f5bf1e5e2d2793de422d43dfd9c57b4f1eed9933cb3e99db91778e15ef9
5
5
  SHA512:
6
- metadata.gz: 64ca501f703b329e9c4a8872a237480a4a751ffdbb82cadfc7ca67a31fcaffffd6c18c26d5eff045f69600c6bf2e6f82c9607b47ce83dbb9333a5b6d67f40692
7
- data.tar.gz: 5d8951b905ad94aecc0b10756c9ff16bb25f9b6ee791c57694ad7bfdfd2f0c27cebe6e980b975f3a0cb17b3afa25a750d0808cfad221729e7d1c50caeba20e8e
6
+ metadata.gz: 772f197217bc1ffdd29b432b3c615c34f13f286e694d33abec58a468722d3217c1d8ffcd893aadab57b3f2be4b57fbe693c08e7976d72f9c7aeee33bea67e837
7
+ data.tar.gz: 679738f907ba017a94dc6e73b29ff82500765c207fb48a5da42c037e0ec9dbfb6155e4d26abc465b205271fbb1928ef29d677f1510c40f9a62dbb829e9e26d73
data/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.5.6
4
+
5
+ ### Added
6
+
7
+ * Added record type
8
+
9
+ ## 0.5.5
10
+
11
+ ### Added
12
+
13
+ * Added case conversion check for object keys.
14
+
3
15
  ## 0.5.4
4
16
 
5
17
  ### Added
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- camille (0.5.4)
4
+ camille (0.5.6)
5
5
  rails (>= 6.1, < 8)
6
6
 
7
7
  GEM
data/README.md CHANGED
@@ -163,9 +163,11 @@ params(
163
163
  boolean_literal: false,
164
164
  # a custom type we defined above
165
165
  product: Product,
166
- # Pick and Omit accepts a type and an array of symbols
166
+ # Pick and Omit accept a type and an array of symbols
167
167
  pick: Pick[{a: 1, b: 2}, [:a, :b]],
168
- omit: Omit[Product, [:id]]
168
+ omit: Omit[Product, [:id]],
169
+ # Record accepts a key type and a value type
170
+ record: Record[Number, String]
169
171
  )
170
172
  ```
171
173
 
@@ -0,0 +1,58 @@
1
+ module Camille
2
+ module Types
3
+ class Record < Camille::BasicType
4
+ attr_reader :left, :right
5
+ attr_reader :key, :value
6
+
7
+ def initialize key, value
8
+ @key = Camille::Type.instance key
9
+ @value = Camille::Type.instance value
10
+ end
11
+
12
+ def transform_and_check value
13
+ if value.is_a? ::Hash
14
+
15
+ transform_and_check_results = value.map.with_index do |(k, v), index|
16
+ [index, transform_and_check_pair(k, v)]
17
+ end
18
+
19
+ errors = transform_and_check_results.map do |index, (error, transformed)|
20
+ ["record[#{index}]", error]
21
+ end.select{|x| x[1]}
22
+
23
+ if errors.empty?
24
+ transformed = transform_and_check_results.map{|_, (_, transformed)| transformed}.to_h
25
+ [nil, transformed]
26
+ else
27
+ [Camille::TypeError.new(**errors.to_h), nil]
28
+ end
29
+ else
30
+ [Camille::TypeError.new("Expected hash, got #{value.inspect}."), nil]
31
+ end
32
+ end
33
+
34
+ def self.[] key, value
35
+ self.new key, value
36
+ end
37
+
38
+ def literal
39
+ "Record<#{@key.literal}, #{@value.literal}>"
40
+ end
41
+
42
+ private
43
+ def transform_and_check_pair key, value
44
+ key_error, key_transformed = @key.transform_and_check key
45
+ value_error, value_transformed = @value.transform_and_check value
46
+
47
+ if key_error.nil? && value_error.nil?
48
+ [nil, [key_transformed, value_transformed]]
49
+ else
50
+ errors = [['record.key', key_error], ['record.value', value_error]].select{|x| x[1]}.to_h
51
+
52
+ error = Camille::TypeError.new(**errors)
53
+ [error, nil]
54
+ end
55
+ end
56
+ end
57
+ end
58
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Camille
4
- VERSION = "0.5.5"
4
+ VERSION = "0.5.6"
5
5
  end
data/lib/camille.rb CHANGED
@@ -21,6 +21,7 @@ require_relative "camille/types/boolean_literal"
21
21
  require_relative "camille/pick_and_omit"
22
22
  require_relative "camille/types/pick"
23
23
  require_relative "camille/types/omit"
24
+ require_relative "camille/types/record"
24
25
  require_relative "camille/type"
25
26
  require_relative "camille/type_error"
26
27
  require_relative "camille/type_error_printer"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: camille
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.5
4
+ version: 0.5.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - 辻彩
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-13 00:00:00.000000000 Z
11
+ date: 2023-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -84,6 +84,7 @@ files:
84
84
  - lib/camille/types/object.rb
85
85
  - lib/camille/types/omit.rb
86
86
  - lib/camille/types/pick.rb
87
+ - lib/camille/types/record.rb
87
88
  - lib/camille/types/string.rb
88
89
  - lib/camille/types/string_literal.rb
89
90
  - lib/camille/types/tuple.rb