easy_talk 0.1.9 → 0.2.0
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 +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/easy_talk/builders/base_builder.rb +2 -1
- data/lib/easy_talk/builders/object_builder.rb +6 -2
- data/lib/easy_talk/builders/string_builder.rb +2 -1
- data/lib/easy_talk/model.rb +20 -26
- data/lib/easy_talk/schema_definition.rb +7 -3
- data/lib/easy_talk/version.rb +1 -1
- metadata +16 -3
- data/easy_talk.gemspec +0 -45
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8455d741b05a1a65ca7ea3f7e2d529271414fb04881066cc81bbb444399e200c
|
4
|
+
data.tar.gz: 9814e429530dbb42da5a3cca3310175ebe98038d91d5b7deeddcd68aa90b3199
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a85e59b3eaa7e0e9c2d57eb0283f2b4a45e6dfeb88778682738969617f751149aaf99cd93b4760c323eb84da476ac0ee8aba59eef003156d8d82aae60a940fd
|
7
|
+
data.tar.gz: 0c382d7989016e5a1c376439c96cd8b1d4acb7a6758a8fb2b406239551445ede641fb3a3ed64f833ce591409a75eefb0f3023a4a60cfffc92ca49ee5827bc24d
|
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,9 @@
|
|
1
|
+
## [0.2.0] - 2024-05-01
|
2
|
+
- Added ActiveModel::API functionality to EasyTalk::Model module. That means you get all the benefits of ActiveModel::API including attribute assignment, introspections, validations, translation (i18n) and more. See https://api.rubyonrails.org/classes/ActiveModel/API.html for more information.
|
3
|
+
|
4
|
+
## [0.1.10] - 2024-04-29
|
5
|
+
- Accept `:optional` key as constraint which excludes property from required node.
|
6
|
+
- Spec fixes
|
1
7
|
## [0.1.9] - 2024-04-29
|
2
8
|
- Added the ability to describe an object schema withing the define_schema block. Example:
|
3
9
|
```ruby
|
@@ -11,7 +11,8 @@ module EasyTalk
|
|
11
11
|
# representing schema properties.
|
12
12
|
COMMON_OPTIONS = {
|
13
13
|
title: { type: T.nilable(String), key: :title },
|
14
|
-
description: { type: T.nilable(String), key: :description }
|
14
|
+
description: { type: T.nilable(String), key: :description },
|
15
|
+
optional: { type: T.nilable(T::Boolean), key: :optional }
|
15
16
|
}.freeze
|
16
17
|
|
17
18
|
attr_reader :name, :schema, :options
|
@@ -14,7 +14,7 @@ module EasyTalk
|
|
14
14
|
properties: { type: T::Hash[T.any(Symbol, String), T.untyped], key: :properties },
|
15
15
|
additional_properties: { type: T::Boolean, key: :additionalProperties },
|
16
16
|
subschemas: { type: T::Array[T.untyped], key: :subschemas },
|
17
|
-
required: { type: T::Array[Symbol], key: :required },
|
17
|
+
required: { type: T::Array[T.any(Symbol, String)], key: :required },
|
18
18
|
defs: { type: T.untyped, key: :$defs },
|
19
19
|
allOf: { type: T.untyped, key: :allOf },
|
20
20
|
anyOf: { type: T.untyped, key: :anyOf },
|
@@ -41,11 +41,15 @@ module EasyTalk
|
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
44
|
+
# rubocop:disable Style/DoubleNegation
|
44
45
|
def add_required_property(property_name, options)
|
45
|
-
return
|
46
|
+
return if options.is_a?(Hash) && !!(options[:type].respond_to?(:nilable?) && options[:type].nilable?)
|
47
|
+
|
48
|
+
return if options.respond_to?(:optional?) && options.optional?
|
46
49
|
|
47
50
|
@required_properties << property_name
|
48
51
|
end
|
52
|
+
# rubocop:enable Style/DoubleNegation
|
49
53
|
|
50
54
|
def build_property(property_name, options)
|
51
55
|
if options.is_a?(EasyTalk::SchemaDefinition)
|
@@ -15,7 +15,8 @@ module EasyTalk
|
|
15
15
|
max_length: { type: Integer, key: :maxLength },
|
16
16
|
enum: { type: T::Array[String], key: :enum },
|
17
17
|
const: { type: String, key: :const },
|
18
|
-
default: { type: String, key: :default }
|
18
|
+
default: { type: String, key: :default },
|
19
|
+
optional: { type: T::Boolean, key: :optional }
|
19
20
|
}.freeze
|
20
21
|
|
21
22
|
sig { params(name: Symbol, constraints: Hash).void }
|
data/lib/easy_talk/model.rb
CHANGED
@@ -6,6 +6,7 @@ require 'active_support/core_ext'
|
|
6
6
|
require 'active_support/time'
|
7
7
|
require 'active_support/concern'
|
8
8
|
require 'active_support/json'
|
9
|
+
require 'active_model'
|
9
10
|
require 'json-schema'
|
10
11
|
require_relative 'builders/object_builder'
|
11
12
|
require_relative 'schema_definition'
|
@@ -20,44 +21,26 @@ module EasyTalk
|
|
20
21
|
#
|
21
22
|
# Example usage:
|
22
23
|
#
|
23
|
-
# class
|
24
|
-
#
|
24
|
+
# class Person
|
25
|
+
# include EasyTalk::Model
|
25
26
|
#
|
26
27
|
# define_schema do
|
27
|
-
#
|
28
|
+
# property :name, String, description: 'The person\'s name'
|
29
|
+
# property :age, Integer, description: 'The person\'s age'
|
28
30
|
# end
|
29
31
|
# end
|
30
32
|
#
|
31
|
-
#
|
32
|
-
#
|
33
|
-
#
|
34
|
-
#
|
35
|
-
# MyModel.ref_template #=> returns the reference template for MyModel
|
36
|
-
#
|
37
|
-
# MyModel.inherits_schema? #=> returns false
|
38
|
-
#
|
39
|
-
# MyModel.schema #=> returns the validated schema for MyModel
|
40
|
-
#
|
41
|
-
# MyModel.schema_definition #=> returns the unvalidated schema definition for MyModel
|
42
|
-
#
|
43
|
-
# MyModel.json_schema #=> returns the JSON schema for MyModel
|
33
|
+
# Person.json_schema #=> returns the JSON schema for Person
|
34
|
+
# jim = Person.new(name: 'Jim', age: 30)
|
35
|
+
# jim.valid? #=> returns true
|
44
36
|
#
|
45
37
|
# @see SchemaDefinition
|
46
38
|
#
|
47
39
|
def self.included(base)
|
40
|
+
base.include ActiveModel::API # Include ActiveModel::API in the class including EasyTalk::Model
|
48
41
|
base.extend(ClassMethods)
|
49
42
|
end
|
50
43
|
|
51
|
-
# Initializes a new instance of the Model class.
|
52
|
-
#
|
53
|
-
# @param properties [Hash] The properties to set for the instance.
|
54
|
-
def initialize(properties = {})
|
55
|
-
properties.each do |key, value|
|
56
|
-
instance_variable_set("@#{key}", value)
|
57
|
-
self.class.class_eval { attr_reader key }
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
44
|
# Checks if the model is valid.
|
62
45
|
#
|
63
46
|
# This method calls the `validate_json` class method on the current class,
|
@@ -103,6 +86,14 @@ module EasyTalk
|
|
103
86
|
name.humanize.titleize
|
104
87
|
end
|
105
88
|
|
89
|
+
def properties
|
90
|
+
@properties ||= begin
|
91
|
+
return unless schema[:properties].present?
|
92
|
+
|
93
|
+
schema[:properties].keys.map(&:to_sym)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
106
97
|
# Validates the given JSON against the model's JSON schema.
|
107
98
|
#
|
108
99
|
# @param json [Hash] The JSON to validate.
|
@@ -127,6 +118,9 @@ module EasyTalk
|
|
127
118
|
|
128
119
|
@schema_definition = SchemaDefinition.new(name)
|
129
120
|
@schema_definition.instance_eval(&block)
|
121
|
+
attr_accessor(*properties)
|
122
|
+
|
123
|
+
@schema_defintion
|
130
124
|
end
|
131
125
|
|
132
126
|
# Returns the unvalidated schema definition for the model.
|
@@ -16,8 +16,8 @@ module EasyTalk
|
|
16
16
|
|
17
17
|
attr_reader :name, :schema
|
18
18
|
|
19
|
-
def initialize(name)
|
20
|
-
@schema =
|
19
|
+
def initialize(name, schema = {})
|
20
|
+
@schema = schema
|
21
21
|
@name = name
|
22
22
|
end
|
23
23
|
|
@@ -39,12 +39,16 @@ module EasyTalk
|
|
39
39
|
@schema[:properties] ||= {}
|
40
40
|
|
41
41
|
if block_given?
|
42
|
-
property_schema = SchemaDefinition.new(name)
|
42
|
+
property_schema = SchemaDefinition.new(name, constraints)
|
43
43
|
property_schema.instance_eval(&blk)
|
44
44
|
@schema[:properties][name] = property_schema
|
45
45
|
else
|
46
46
|
@schema[:properties][name] = { type:, constraints: }
|
47
47
|
end
|
48
48
|
end
|
49
|
+
|
50
|
+
def optional?
|
51
|
+
@schema[:optional]
|
52
|
+
end
|
49
53
|
end
|
50
54
|
end
|
data/lib/easy_talk/version.rb
CHANGED
metadata
CHANGED
@@ -1,15 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: easy_talk
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sergio Bayona
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-05-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: activemodel
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '7.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '7.0'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: activesupport
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -177,7 +191,6 @@ files:
|
|
177
191
|
- LICENSE.txt
|
178
192
|
- README.md
|
179
193
|
- Rakefile
|
180
|
-
- easy_talk.gemspec
|
181
194
|
- lib/easy_talk.rb
|
182
195
|
- lib/easy_talk/builders/all_of_builder.rb
|
183
196
|
- lib/easy_talk/builders/any_of_builder.rb
|
data/easy_talk.gemspec
DELETED
@@ -1,45 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
require_relative 'lib/easy_talk/version'
|
4
|
-
|
5
|
-
Gem::Specification.new do |spec|
|
6
|
-
spec.name = 'easy_talk'
|
7
|
-
spec.version = EasyTalk::VERSION
|
8
|
-
spec.authors = ['Sergio Bayona']
|
9
|
-
spec.email = ['bayona.sergio@gmail.com']
|
10
|
-
|
11
|
-
spec.summary = 'Generate json-schema from Ruby classes.'
|
12
|
-
spec.description = 'Generate json-schema from plain Ruby classes.'
|
13
|
-
spec.homepage = 'https://github.com/sergiobayona/easy_talk'
|
14
|
-
spec.license = 'MIT'
|
15
|
-
spec.required_ruby_version = '>= 3.2'
|
16
|
-
|
17
|
-
spec.metadata['allowed_push_host'] = 'https://rubygems.org'
|
18
|
-
|
19
|
-
spec.metadata['homepage_uri'] = spec.homepage
|
20
|
-
spec.metadata['source_code_uri'] = 'https://github.com/sergiobayona/easy_talk'
|
21
|
-
spec.metadata['changelog_uri'] = 'https://github.com/sergiobayona/easy_talk/blob/main/CHANGELOG.md'
|
22
|
-
|
23
|
-
# Specify which files should be added to the gem when it is released.
|
24
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
25
|
-
spec.files = Dir.chdir(__dir__) do
|
26
|
-
`git ls-files -z`.split("\x0").reject do |f|
|
27
|
-
(File.expand_path(f) == __FILE__) ||
|
28
|
-
f.start_with?(*%w[bin/ spec/ .git .github Gemfile])
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
spec.require_paths = ['lib']
|
33
|
-
|
34
|
-
spec.add_dependency 'activesupport', '~> 7.0'
|
35
|
-
spec.add_dependency 'json-schema', '~> 4'
|
36
|
-
spec.add_dependency 'sorbet-runtime', '~> 0.5'
|
37
|
-
spec.add_development_dependency 'pry-byebug', '>= 3.10'
|
38
|
-
spec.add_development_dependency 'rake', '~> 13.1'
|
39
|
-
spec.add_development_dependency 'rspec', '~> 3.0'
|
40
|
-
spec.add_development_dependency 'rspec-json_expectations', '~> 2.0'
|
41
|
-
spec.add_development_dependency 'rspec-mocks', '~> 3.13'
|
42
|
-
spec.add_development_dependency 'rubocop', '~> 1.21'
|
43
|
-
spec.add_development_dependency 'rubocop-rake', '~> 0.6'
|
44
|
-
spec.add_development_dependency 'rubocop-rspec', '~> 2.29'
|
45
|
-
end
|