easy_talk 0.1.5 → 0.1.7

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: e57fb697edd24d973df8ef2903607dabf1175e0d9948e84c8db7ac211f59ad0c
4
- data.tar.gz: ac6e7e9c69f4072d8fb782c6044e225bf07cd573b9be2c0e4698e1db025d6185
3
+ metadata.gz: f412e6a4ef70f8a8912def5e60e4f9a2fbb80a47c0f22e7f46af9caed9d153fa
4
+ data.tar.gz: ee7bfc2e77fef086bff23db293eec6f6d7f47ed47488a803737e2831895feb88
5
5
  SHA512:
6
- metadata.gz: 6f07bea45b29633c00586c4e8f1d012f19cb70998f33bf60d1c299f05468c7658de3db500c8c319f474c29779980dedebcffa561eb1870cd2c1b225953736527
7
- data.tar.gz: 19f836dad8842c5109ea2250f5db3c85e1273bf0565cb33f74096872334617f550078d76479c8ea2b401de08bb85c65c0d1f25e4a51b77afc82992fafedee723
6
+ metadata.gz: feb1884f28b4c0400ccbe3fb651f2d87e4650a25180ed804bab8c7b2493ebc7f0d7fb769271788a7dc0e0e6cdc6c2793fb1cbaa064df881aef2d797242b70860
7
+ data.tar.gz: 1c2ac812a423169c0bc0d43afac4f86711acad7bbab28aeb40e249df65258be4cb845903edc585d43f835b2717b9fc4003817b0ae2c704d20a28ff583290f3c5
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ ## [0.1.7] - 2024-04-16
2
+ - general cleanup and refactoring.
3
+
4
+ ## [0.1.6] - 2024-04-16
5
+ - model instance takes a hash and converts it to attribute methods.
6
+
7
+ ## [0.1.5] - 2024-04-15
8
+ - Added helper method for generating an openai function.
9
+
1
10
  ## [0.1.4] - 2024-04-12
2
11
  - Bumped activesupport gem version.
3
12
 
@@ -53,6 +53,10 @@ module EasyTalk
53
53
  obj[value[:key]] = T.let(@options[key], value[:type])
54
54
  end
55
55
  end
56
+
57
+ def self.collection_type?
58
+ false
59
+ end
56
60
  end
57
61
  end
58
62
  end
@@ -11,12 +11,11 @@ module EasyTalk
11
11
  # VALID_OPTIONS defines the valid options for a boolean property.
12
12
  VALID_OPTIONS = {
13
13
  enum: { type: T::Array[T::Boolean], key: :enum },
14
- const: { type: T::Boolean, key: :const },
15
14
  default: { type: T::Boolean, key: :default }
16
15
  }.freeze
17
16
 
18
- sig { params(name: Symbol, _type: T.untyped, constraints: Hash).void }
19
- def initialize(name, _type = nil, constraints = {})
17
+ sig { params(name: Symbol, constraints: Hash).void }
18
+ def initialize(name, constraints = {})
20
19
  super(name, { type: 'boolean' }, constraints, VALID_OPTIONS)
21
20
  end
22
21
  end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ module EasyTalk
4
+ module Builders
5
+ # Base builder class for array-type properties.
6
+ module CollectionHelpers
7
+ def collection_type?
8
+ true
9
+ end
10
+ end
11
+ end
12
+ end
@@ -1,11 +1,12 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base_builder'
3
+ require_relative 'collection_helpers'
4
4
 
5
5
  module EasyTalk
6
6
  module Builders
7
7
  # This class represents a builder for composing JSON schemas using the "allOf", "anyOf", or "oneOf" keywords.
8
8
  class CompositionBuilder
9
+ extend CollectionHelpers
9
10
  extend T::Sig
10
11
 
11
12
  COMPOSER_TO_KEYWORD = {
@@ -19,8 +19,8 @@ module EasyTalk
19
19
  }.freeze
20
20
 
21
21
  # Initializes a new instance of the IntegerBuilder class.
22
- sig { params(name: Symbol, _type: T.untyped, constraints: Hash).void }
23
- def initialize(name, _type = nil, constraints = {})
22
+ sig { params(name: Symbol, constraints: Hash).void }
23
+ def initialize(name, constraints = {})
24
24
  super(name, { type: 'integer' }, constraints, VALID_OPTIONS)
25
25
  end
26
26
  end
@@ -7,8 +7,8 @@ module EasyTalk
7
7
  # builder class for Null properties.
8
8
  class NullBuilder < BaseBuilder
9
9
  # Initializes a new instance of the NullBuilder class.
10
- sig { params(name: Symbol, _type: T.untyped, _constraints: Hash).void }
11
- def initialize(name, _type = nil, _constraints = {})
10
+ sig { params(name: Symbol, _constraints: Hash).void }
11
+ def initialize(name, _constraints = {})
12
12
  super(name, { type: 'null' }, {}, {})
13
13
  end
14
14
  end
@@ -18,8 +18,8 @@ module EasyTalk
18
18
  }.freeze
19
19
 
20
20
  # Initializes a new instance of the NumberBuilder class.
21
- sig { params(name: Symbol, _type: T.untyped, constraints: Hash).void }
22
- def initialize(name, _type = nil, constraints = {})
21
+ sig { params(name: Symbol, constraints: Hash).void }
22
+ def initialize(name, constraints = {})
23
23
  super(name, { type: 'number' }, constraints, VALID_OPTIONS)
24
24
  end
25
25
  end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'base_builder'
4
+
3
5
  module EasyTalk
4
6
  module Builders
5
7
  # Builder class for json schema objects.
@@ -18,8 +18,8 @@ module EasyTalk
18
18
  default: { type: String, key: :default }
19
19
  }.freeze
20
20
 
21
- sig { params(name: Symbol, _type: T.untyped, constraints: Hash).void }
22
- def initialize(name, _type = nil, constraints = {})
21
+ sig { params(name: Symbol, constraints: Hash).void }
22
+ def initialize(name, constraints = {})
23
23
  super(name, { type: 'string' }, constraints, VALID_OPTIONS)
24
24
  end
25
25
  end
@@ -1,9 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative 'collection_helpers'
4
+
3
5
  module EasyTalk
4
6
  module Builders
5
7
  # Builder class for array properties.
6
8
  class TypedArrayBuilder < BaseBuilder
9
+ extend CollectionHelpers
10
+ extend T::Sig
11
+
7
12
  VALID_OPTIONS = {
8
13
  min_items: { type: Integer, key: :minItems },
9
14
  max_items: { type: Integer, key: :maxItems },
@@ -1,12 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'base_builder'
3
+ require_relative 'collection_helpers'
4
4
 
5
5
  module EasyTalk
6
6
  module Builders
7
7
  # Base builder class for array-type properties.
8
8
  class UnionBuilder
9
+ extend CollectionHelpers
9
10
  extend T::Sig
11
+
10
12
  sig { params(name: Symbol, type: T.untyped, constraints: T.untyped).void }
11
13
  def initialize(name, type, constraints)
12
14
  @name = name
@@ -7,39 +7,14 @@ require 'active_support/time'
7
7
  require 'active_support/concern'
8
8
  require 'active_support/json'
9
9
  require 'json-schema'
10
- require_relative 'builder'
10
+ require_relative 'builders/object_builder'
11
11
  require_relative 'schema_definition'
12
12
 
13
13
  module EasyTalk
14
14
  # The Model module can be included in a class to add JSON schema definition and generation support.
15
15
  module Model
16
- def self.included(base)
17
- base.extend(ClassMethods)
18
-
19
- base.singleton_class.instance_eval do
20
- define_method(:inherited) do |subclass|
21
- super(subclass)
22
- subclass.extend(SubclassExtension)
23
- end
24
- end
25
- end
26
-
27
- # This module provides extension methods for subclasses with schema definitions.
28
- module SubclassExtension
29
- # Returns true if the class inherits a schema.
30
- def inherits_schema?
31
- true
32
- end
33
-
34
- # Returns the superclass that the class inherits from.
35
- def inherits_from
36
- superclass
37
- end
38
- end
39
-
40
- # Module containing class-level methods for defining and accessing the schema of a model.
16
+ # The `Model` module is a mixin that provides functionality for defining and accessing the schema of a model.
41
17
  #
42
- # This module provides methods for defining and accessing the JSON schema of a model.
43
18
  # It includes methods for defining the schema, retrieving the schema definition,
44
19
  # and generating the JSON schema for the model.
45
20
  #
@@ -68,37 +43,85 @@ module EasyTalk
68
43
  # MyModel.json_schema #=> returns the JSON schema for MyModel
69
44
  #
70
45
  # @see SchemaDefinition
71
- # @see Builder
46
+ #
47
+ def self.included(base)
48
+ base.extend(ClassMethods)
49
+ end
50
+
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
+ # Checks if the model is valid.
62
+ #
63
+ # This method calls the `validate_json` class method on the current class,
64
+ # passing the `properties` as the argument.
65
+ #
66
+ # @return [Boolean] true if the model is valid, false otherwise.
67
+ def valid?
68
+ self.class.validate_json(properties)
69
+ end
70
+
71
+ # Returns the properties of the model as a hash with symbolized keys.
72
+ def properties
73
+ as_json.symbolize_keys!
74
+ end
75
+
76
+ # Module containing class-level methods for defining and accessing the schema of a model.
72
77
  module ClassMethods
78
+ # Returns the schema for the model.
79
+ #
80
+ # @return [Schema] The schema for the model.
73
81
  def schema
74
- @schema ||= Builder.new(schema_definition).schema
82
+ @schema ||= build_schema(schema_definition)
75
83
  end
76
84
 
85
+ # Returns true if the class inherits a schema.
86
+ #
87
+ # @return [Boolean] `true` if the class inherits a schema, `false` otherwise.
77
88
  def inherits_schema?
78
89
  false
79
90
  end
80
91
 
92
+ # Returns the reference template for the model.
93
+ #
94
+ # @return [String] The reference template for the model.
81
95
  def ref_template
82
96
  "#/$defs/#{name}"
83
97
  end
84
98
 
99
+ # Returns the name of the model as a human-readable function name.
100
+ #
101
+ # @return [String] The human-readable function name of the model.
85
102
  def function_name
86
103
  name.humanize.titleize
87
104
  end
88
105
 
106
+ # Validates the given JSON against the model's JSON schema.
107
+ #
108
+ # @param json [Hash] The JSON to validate.
109
+ # @return [Boolean] `true` if the JSON is valid, `false` otherwise.
89
110
  def validate_json(json)
90
111
  JSON::Validator.validate(json_schema, json)
91
112
  end
92
113
 
93
114
  # Returns the JSON schema for the model.
115
+ #
116
+ # @return [Hash] The JSON schema for the model.
94
117
  def json_schema
95
- @json_schema ||= begin
96
- schema = Builder.new(schema_definition).schema
97
- schema.as_json
98
- end
118
+ @json_schema ||= schema.as_json
99
119
  end
100
120
 
101
- # Define the schema using the provided block.
121
+ # Define the schema for the model using the provided block.
122
+ #
123
+ # @yield The block to define the schema.
124
+ # @raise [ArgumentError] If the class does not have a name.
102
125
  def define_schema(&block)
103
126
  raise ArgumentError, 'The class must have a name' unless name.present?
104
127
 
@@ -106,9 +129,22 @@ module EasyTalk
106
129
  @schema_definition.instance_eval(&block)
107
130
  end
108
131
 
132
+ # Returns the unvalidated schema definition for the model.
133
+ #
134
+ # @return [SchemaDefinition] The unvalidated schema definition for the model.
109
135
  def schema_definition
110
136
  @schema_definition ||= {}
111
137
  end
138
+
139
+ private
140
+
141
+ # Builds the schema using the provided schema definition.
142
+ #
143
+ # @param schema_definition [SchemaDefinition] The schema definition.
144
+ # @return [Schema] The validated schema.
145
+ def build_schema(schema_definition)
146
+ Builders::ObjectBuilder.new(schema_definition).build
147
+ end
112
148
  end
113
149
  end
114
150
  end
@@ -57,13 +57,12 @@ module EasyTalk
57
57
  end
58
58
 
59
59
  def build
60
- if type.is_a?(T::Types::Simple)
61
- @type = type.raw_type
62
- return self
63
- end
64
-
65
60
  if builder
66
- builder.new(name, type, constraints).build
61
+ if builder.collection_type?
62
+ builder.new(name, type, constraints).build
63
+ else
64
+ builder.new(name, constraints).build
65
+ end
67
66
  else
68
67
  type.respond_to?(:schema) ? type.schema : 'object'
69
68
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module EasyTalk
2
4
  module Tools
3
5
  module FunctionBuilder
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module EasyTalk
4
- VERSION = '0.1.5'
4
+ VERSION = '0.1.7'
5
5
  end
data/lib/easy_talk.rb CHANGED
@@ -9,7 +9,6 @@ module EasyTalk
9
9
  require 'easy_talk/types/all_of'
10
10
  require 'easy_talk/types/one_of'
11
11
  require 'easy_talk/model'
12
- require 'easy_talk/builder'
13
12
  require 'easy_talk/property'
14
13
  require 'easy_talk/schema_definition'
15
14
  require 'easy_talk/tools/function_builder'
@@ -17,12 +16,4 @@ module EasyTalk
17
16
 
18
17
  class UnsupportedTypeError < ArgumentError; end
19
18
  class UnsupportedConstraintError < ArgumentError; end
20
-
21
- def self.schemas
22
- @schemas ||= {}
23
- end
24
-
25
- def self.add_schema(ref, schema)
26
- schemas[ref] = schema
27
- end
28
19
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: easy_talk
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.7
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-04-15 00:00:00.000000000 Z
11
+ date: 2024-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -95,11 +95,11 @@ files:
95
95
  - Rakefile
96
96
  - easy_talk.gemspec
97
97
  - lib/easy_talk.rb
98
- - lib/easy_talk/builder.rb
99
98
  - lib/easy_talk/builders/all_of_builder.rb
100
99
  - lib/easy_talk/builders/any_of_builder.rb
101
100
  - lib/easy_talk/builders/base_builder.rb
102
101
  - lib/easy_talk/builders/boolean_builder.rb
102
+ - lib/easy_talk/builders/collection_helpers.rb
103
103
  - lib/easy_talk/builders/composition_builder.rb
104
104
  - lib/easy_talk/builders/date_builder.rb
105
105
  - lib/easy_talk/builders/datetime_builder.rb
@@ -108,7 +108,6 @@ files:
108
108
  - lib/easy_talk/builders/number_builder.rb
109
109
  - lib/easy_talk/builders/object_builder.rb
110
110
  - lib/easy_talk/builders/one_of_builder.rb
111
- - lib/easy_talk/builders/ref_array_builder.rb
112
111
  - lib/easy_talk/builders/string_builder.rb
113
112
  - lib/easy_talk/builders/time_builder.rb
114
113
  - lib/easy_talk/builders/typed_array_builder.rb
@@ -1,51 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'property'
4
- require_relative 'builders/object_builder'
5
-
6
- module EasyTalk
7
- # The Builder class is responsible for building a schema for a class.
8
- class Builder
9
- extend T::Sig
10
-
11
- sig { params(schema_definition: SchemaDefinition).void }
12
- # Initializes a new instance of the Builder class.
13
- #
14
- # @param schema_definition [SchemaDefinition] The schema definition.
15
- def initialize(schema_definition)
16
- @schema_definition = schema_definition
17
- end
18
-
19
- sig { returns(Hash) }
20
- # Retrieves the schema document.
21
- #
22
- # @return [Hash] The schema document.
23
- def schema
24
- @schema = schema_document
25
- end
26
-
27
- sig { returns(String) }
28
- # Returns the JSON representation of the schema document.
29
- #
30
- # @return [String] The JSON schema.
31
- def json_schema
32
- @json_schema ||= schema_document.to_json
33
- end
34
-
35
- sig { returns(Hash) }
36
- # Returns the schema document, building it if necessary.
37
- #
38
- # @return [Hash] The schema document.
39
- def schema_document
40
- @schema_document ||= build_schema
41
- end
42
-
43
- sig { returns(Hash) }
44
- # Builds the schema using the schema definition.
45
- #
46
- # Returns the built schema.
47
- def build_schema
48
- Builders::ObjectBuilder.new(@schema_definition).build
49
- end
50
- end
51
- end
@@ -1,25 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require_relative 'base_builder'
4
-
5
- module EasyTalk
6
- module Builders
7
- # Builder class for array properties.
8
- class RefArrayBuilder < BaseBuilder
9
- # Initializes a new instance of the ArrayBuilder class.
10
- sig { params(name: Symbol).void }
11
- def initialize(name)
12
- super(name, { type: 'array' }, options, {})
13
- end
14
-
15
- private
16
-
17
- sig { void }
18
- # Updates the option types for the array builder.
19
- def update_option_types
20
- VALID_OPTIONS[:enum][:type] = T::Array[@inner_type]
21
- VALID_OPTIONS[:const][:type] = T::Array[@inner_type]
22
- end
23
- end
24
- end
25
- end