openlayer 0.2.2 → 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: 2c522a801c7673ccfe15d08aa8dffa01df36e9247cdd49181fb2f4f0a09b6ecc
4
- data.tar.gz: ce80b6e2d2333d8f9118bac2477835c0b2046994726513547cc82b61c3d25d61
3
+ metadata.gz: 9124105239930d01d444266033af79f2e1d2a7e6048b587e13dc6cfa1d00a0c3
4
+ data.tar.gz: 869c8e6a79e351d2b5047272558e4b33fb7e794276731cfbe4e246410804d57b
5
5
  SHA512:
6
- metadata.gz: a082fa2d42ce9fa5d1c13b8f883f675fc1235e4dcbc9699ba26e4bf06f7aff7fecee96295393dc9de650f8b388621b2fc939a20d38eb912943404a79f8595dd2
7
- data.tar.gz: cdb4dc6acbd4d643ed22a2b3655b949bdd4b99b34c35aaf798583e59175abbb40ab234ec4ab4a1809015457ab3faad820bde8dd0abb2bcad9b3fa0ac30b4dc61
6
+ metadata.gz: aaa1a3ec31f4dd6ef75ba1f3acd5d50cb49318ac899dd3ec0442ddbe332abebe1ff6c39b042f4cc9ec66b05bd59790baf4bcf2ebe26f601b36d823e228940f0a
7
+ data.tar.gz: 7d76c46e8c8b5d468a16421dc9d859c6768cdb1981afcd72b73cbfcfa307d3bdce1cd37f16066f4b46d7ab248ab1aef2cfe6f79ae20cee2ec0a72fc71fe667ed
data/README.md CHANGED
@@ -13,6 +13,7 @@ If bundler is not being used to manage dependencies, install the gem by executin
13
13
 
14
14
  ## Usage
15
15
 
16
+ ### Inference Monitoring Mode
16
17
  ```ruby
17
18
  client = Openlayer::Client.new(api_key: "YOUR_OPENLAYER_API_KEY")
18
19
  inference_pipeline = client.inference_pipeline("YOUR_INFERENCE_PIPELINE_ID")
@@ -24,6 +25,39 @@ inference_pipeline.stream_data(
24
25
  )
25
26
  ```
26
27
 
28
+
29
+
30
+ ### Projects
31
+ #### Load Project
32
+ Loads an existing project from the Openlayer platform.
33
+
34
+ ```ruby
35
+ client = Openlayer::Client.new(api_key: "YOUR_OPENLAYER_API_KEY")
36
+ project = client.load_project(name: "your_project_name")
37
+ ```
38
+
39
+ #### Development Mode for CI/CD
40
+ ```ruby
41
+ client = Openlayer::Client.new(api_key: "YOUR_OPENLAYER_API_KEY")
42
+ project = client.load_project(name: "your_project_name")
43
+
44
+
45
+ project.add_dataset(file_path: "DATASET_FILE_PATH", dataset_config_file_path: "DATASET_CONFIG_FILE_PATH")
46
+ project.add_model(model_config_file_path: "MODEL_CONFIG_PATH")
47
+ project.commit(message: "This is a commit message")
48
+ version = project.push
49
+
50
+ version.wait_for_completion(timeout: 500)
51
+ version.print_test_report
52
+
53
+ if version.failing_test_count > 0:
54
+ puts "Failing pipeline due to failing goals."
55
+ exit(1)
56
+ ```
57
+
58
+ - Check the example in `examples/staging` for what the YAMLs look like.
59
+ - Check the [Dataset Config](https://docs.openlayer.com/how-to-guides/write-dataset-configs/llm-dataset-config) and the [Model Config](https://docs.openlayer.com/how-to-guides/write-model-configs/llm-config) docs on Openlayer to see additional attributes for the configs.
60
+
27
61
  ## Development
28
62
 
29
63
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
Binary file
@@ -0,0 +1,2 @@
1
+ date: Sat Feb 25 14:24:18 2023
2
+ message: Initial commit!
@@ -0,0 +1,12 @@
1
+ architectureType: llm
2
+ inputVariableNames:
3
+ - input
4
+ metadata: {}
5
+ model: gpt-3.5-turbo
6
+ modelParameters:
7
+ temperature: 0.7
8
+ modelProvider: OpenAI
9
+ modelType: api
10
+ name: AI assistant
11
+ prompt:
12
+ - {"role": "user", "content": "{{ input }}"}
@@ -0,0 +1,12 @@
1
+ columnNames:
2
+ - input
3
+ - output
4
+ - ground_truth
5
+ groundTruthColumnName: ground_truth
6
+ inputVariableNames:
7
+ - input
8
+ label: validation
9
+ language: en
10
+ metadata: {}
11
+ outputColumnName: output
12
+ sep: ","
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "faraday"
4
+ require "faraday/multipart"
4
5
 
5
6
  module Openlayer
6
7
  class Client
@@ -14,6 +15,25 @@ module Openlayer
14
15
  @stubs = stubs
15
16
  end
16
17
 
18
+ def inference_pipeline(inference_pipeline_id)
19
+ InferencePipeline.new(self, inference_pipeline_id)
20
+ end
21
+
22
+ def load_project(name:)
23
+ Project.from_response self, connection.get("projects", project_search_params(name: name))
24
+ end
25
+
26
+ def presigned_url(object_name: nil, workspace_id: nil)
27
+ handle_response connection.post(
28
+ "storage/presigned-url?objectName=staging", presigned_url_params(object_name: object_name,
29
+ workspace_id: workspace_id)
30
+ )
31
+ end
32
+
33
+ def load_project_version(id:, payload: {})
34
+ ProjectVersion.from_response self, connection.post("projects/#{id}/versions", payload)
35
+ end
36
+
17
37
  def connection
18
38
  @connection ||= Faraday.new do |conn|
19
39
  conn.url_prefix = BASE_URL
@@ -24,8 +44,34 @@ module Openlayer
24
44
  end
25
45
  end
26
46
 
27
- def inference_pipeline(inference_pipeline_id)
28
- InferencePipeline.new(self, inference_pipeline_id)
47
+ private
48
+
49
+ def project_search_params(name:)
50
+ { version: "0.1.0a25", name: name }
51
+ end
52
+
53
+ def presigned_url_params(object_name: nil, workspace_id: nil)
54
+ { "objectName": object_name, "workspaceId": workspace_id, version: "0.1.0a25" }.compact
55
+ end
56
+
57
+ def handle_response(response)
58
+ message = response.body["error"]
59
+ case response.status
60
+ when 200
61
+ response.body
62
+ when 401
63
+ raise Error, message
64
+ when 404
65
+ raise Error, message
66
+ when 422
67
+ raise Error, message
68
+ when 500
69
+ raise Error, message
70
+ when 200..299
71
+ response.body
72
+ else
73
+ raise Error, message
74
+ end
29
75
  end
30
76
  end
31
77
  end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "ostruct"
4
+ module Openlayer
5
+ class Object
6
+ def initialize(attributes)
7
+ @attributes = OpenStruct.new(attributes)
8
+ end
9
+
10
+ def method_missing(method, *args, &block)
11
+ method = snake_to_camel(method.to_s)
12
+ attribute = @attributes.send(method, *args, &block)
13
+ attribute.is_a?(Hash) ? Object.new(attribute) : attribute
14
+ end
15
+
16
+ def respond_to_missing?(_method, _include_private = false)
17
+ true
18
+ end
19
+
20
+ private
21
+
22
+ def snake_to_camel(snake_str)
23
+ snake_str.split("_").each_with_index.map do |part, index|
24
+ index.zero? ? part : part.capitalize
25
+ end.join
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,185 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "fileutils"
4
+ require "find"
5
+ require "yaml"
6
+ require "pry"
7
+
8
+ module Openlayer
9
+ class Project < Object
10
+ class Error < StandardError; end
11
+ class NotFoundError < StandardError; end
12
+ class TarFileNotFoundError < StandardError; end
13
+
14
+ class CommitLengthError < StandardError
15
+ def message
16
+ "Commit message must be between 1 and 140 characters"
17
+ end
18
+ end
19
+
20
+ attr_reader :client, :workspace_id,
21
+ :data_tarfile_path, :s3_presigned_body,
22
+ :commit_message, :project_path
23
+
24
+ REQUIRED_TARFILE_STRUCTURE = [
25
+ "staging/commit.yaml",
26
+ "staging/validation/dataset_config.yaml",
27
+ "staging/validation/dataset.csv",
28
+ "staging/model/model_config.yaml"
29
+ ].freeze
30
+
31
+ COMMIT_LENGTH = (1..140).freeze
32
+
33
+ def self.from_response(client, response)
34
+ attributes_first_project = handle_response(response)&.dig("items")&.first
35
+ raise NotFoundError if attributes_first_project.nil?
36
+
37
+ new(client, attributes_first_project)
38
+ end
39
+
40
+ def initialize(client, attributes)
41
+ @client = client
42
+ super(attributes)
43
+ @data_tarfile_path = "#{Dir.home}/.openlayer/#{id}_staging.tar"
44
+ @project_path = "#{Dir.home}/.openlayer/#{id}"
45
+ init_staging_directories
46
+ end
47
+
48
+ def add_dataset(file_path:, dataset_config: nil, dataset_config_file_path: nil)
49
+ raise ArgumentError, "dataset config is required" if dataset_config.nil? && dataset_config_file_path.nil?
50
+
51
+ copy_file(file_path, "staging/validation/dataset.csv")
52
+ copy_or_create_config(dataset_config,
53
+ dataset_config_file_path,
54
+ "staging/validation/dataset_config.yaml")
55
+ end
56
+
57
+ def add_model(model_config: nil, model_config_file_path: nil)
58
+ raise ArgumentError, "model config is required" if model_config.nil? && model_config_file_path.nil?
59
+
60
+ copy_or_create_config(model_config,
61
+ model_config_file_path,
62
+ "staging/model/model_config.yaml")
63
+ end
64
+
65
+ def status
66
+ puts "Staging Area:"
67
+ Find.find(File.join(project_path, "/staging")) do |path|
68
+ puts path if File.file?(path)
69
+ end
70
+ end
71
+
72
+ def commit(message)
73
+ raise CommitLengthError unless COMMIT_LENGTH.include? message.length
74
+
75
+ @commit_message = message
76
+ commit_hash = {
77
+ "date": DateTime.now.strftime("%a %b %d %H:%M:%S %Y"),
78
+ "message": message
79
+ }
80
+ write_hash_to_file(commit_hash, "staging/commit.yaml")
81
+ end
82
+
83
+ def push
84
+ create_and_validate_tar_file
85
+ s3_client = create_s3_client
86
+ s3_client.post(s3_payload)
87
+ client.load_project_version(id: id, payload: version_payload)
88
+ end
89
+
90
+ private
91
+
92
+ def init_staging_directories
93
+ FileUtils.mkdir_p(File.join(project_path, "staging"))
94
+ FileUtils.mkdir_p(File.join(project_path, "staging/validation"))
95
+ FileUtils.mkdir_p(File.join(project_path, "staging/model"))
96
+ end
97
+
98
+ def copy_or_create_config(config_hash, config_file_path, destination)
99
+ if config_file_path.nil?
100
+ write_hash_to_file(config_hash, destination)
101
+ else
102
+ copy_file(config_file_path, destination)
103
+ end
104
+ end
105
+
106
+ def copy_file(file_path, destination)
107
+ FileUtils.copy(file_path, File.join(project_path, destination))
108
+ end
109
+
110
+ def write_hash_to_file(hash, destination)
111
+ File.open(File.join(project_path, destination), "w") do |file|
112
+ file.write hash.to_yaml
113
+ end
114
+ end
115
+
116
+ def create_s3_client
117
+ @s3_presigned_body = client.presigned_url(workspace_id: workspace_id, object_name: "staging")
118
+ S3PresignedClient.new(s3_presigned_body)
119
+ end
120
+
121
+ def create_and_validate_tar_file
122
+ TarFileHelper.create_tar_from_folders([File.join(project_path, "staging")], data_tarfile_path)
123
+ validate_tarfile(data_tarfile_path)
124
+ end
125
+
126
+ def validate_tarfile(file_path)
127
+ raise TarFileNotFoundError unless File.exist?(file_path)
128
+
129
+ TarFileHelper.validate_structure(file_path, REQUIRED_TARFILE_STRUCTURE)
130
+ end
131
+
132
+ def s3_payload
133
+ {
134
+ "file" => Faraday::Multipart::FilePart.new(data_tarfile_path, "application/x-tar")
135
+ }
136
+ end
137
+
138
+ def version_payload
139
+ {
140
+ "storageUri": s3_presigned_body["storageUri"],
141
+ "commit": { "message": commit_message }
142
+ }
143
+ end
144
+
145
+ def self.handle_response(response)
146
+ message = response.body["error"]
147
+ case response.status
148
+ when 200
149
+ response.body
150
+ when 401
151
+ raise Error, message
152
+ when 404
153
+ raise Error, message
154
+ when 422
155
+ raise Error, message
156
+ when 500
157
+ raise Error, message
158
+ when 200..299
159
+ response.body
160
+ else
161
+ raise Error, message
162
+ end
163
+ end
164
+
165
+ def handle_response(response)
166
+ message = response.body["error"]
167
+ case response.status
168
+ when 200
169
+ response.body
170
+ when 401
171
+ raise Error, message
172
+ when 404
173
+ raise Error, message
174
+ when 422
175
+ raise Error, message
176
+ when 500
177
+ raise Error, message
178
+ when 200..299
179
+ response.body
180
+ else
181
+ raise Error, message
182
+ end
183
+ end
184
+ end
185
+ end
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openlayer
4
+ class ProjectVersion < Object
5
+ attr_reader :client, :project_version_id, :all_attributes_hash
6
+
7
+ def self.from_response(client, response)
8
+ attributes = handle_response(response)
9
+ new(client, attributes)
10
+ end
11
+
12
+ def initialize(client, attributes)
13
+ @client = client
14
+ super(attributes)
15
+ @project_version_id = commit.projectVersionId
16
+ end
17
+
18
+ def print_status_report
19
+ puts "Status: #{status}"
20
+ puts "Status Message: #{status_message}" unless status_message.nil?
21
+ end
22
+
23
+ def print_test_report
24
+ puts "Failing Test Count: #{failing_test_count}"
25
+ puts "Passing Test Count: #{passing_test_count}"
26
+ puts "Total Test Count: #{total_test_count}"
27
+ end
28
+
29
+ def to_h
30
+ @attributes.to_h
31
+ end
32
+
33
+ def wait_for_completion(timeout: 300, interval: 10)
34
+ start_time = Time.now
35
+ while Time.now - start_time < timeout
36
+ refresh
37
+ break if status == "completed" || status == "failed"
38
+
39
+ sleep interval
40
+ end
41
+ end
42
+
43
+ def refresh
44
+ @attributes = OpenStruct.new handle_response client.connection.get("versions/#{project_version_id}")
45
+ end
46
+
47
+ private
48
+
49
+ def self.handle_response(response)
50
+ message = response.body["error"]
51
+ case response.status
52
+ when 200
53
+ response.body
54
+ when 401
55
+ raise Error, message
56
+ when 404
57
+ raise Error, message
58
+ when 422
59
+ raise Error, message
60
+ when 500
61
+ raise Error, message
62
+ when 200..299
63
+ response.body
64
+ else
65
+ raise Error, message
66
+ end
67
+ end
68
+
69
+ def handle_response(response)
70
+ message = response.body["error"]
71
+ case response.status
72
+ when 200
73
+ response.body
74
+ when 401
75
+ raise Error, message
76
+ when 404
77
+ raise Error, message
78
+ when 422
79
+ raise Error, message
80
+ when 500
81
+ raise Error, message
82
+ when 200..299
83
+ response.body
84
+ else
85
+ raise Error, message
86
+ end
87
+ end
88
+ end
89
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Openlayer
4
+ class S3PresignedClient
5
+ attr_reader :presigned_url, :payload_fields, :s3_conn
6
+
7
+ def initialize(presigned_url)
8
+ @presigned_url = presigned_url
9
+ @payload_fields = presigned_url["fields"]
10
+ @s3_conn = Faraday.new(url: presigned_url["url"]) do |f|
11
+ f.request :multipart
12
+ f.adapter :net_http
13
+ end
14
+ end
15
+
16
+ def post(data)
17
+ handle_response @s3_conn.post("/", merge_fields(data))
18
+ end
19
+
20
+ private
21
+
22
+ def merge_fields(data)
23
+ payload_fields.merge!(data)
24
+ end
25
+
26
+ def handle_response(response)
27
+ message = response.body["error"]
28
+ case response.status
29
+ when 200
30
+ return response
31
+ when 401
32
+ raise Error, message
33
+ when 404
34
+ raise Error, message
35
+ when 422
36
+ raise Error, message
37
+ when 500
38
+ raise Error, message
39
+ when 200..299
40
+ return response
41
+ else
42
+ raise Error, message
43
+ end
44
+ response
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rubygems/package"
4
+ require "fileutils"
5
+ require "zlib"
6
+ require "logger"
7
+
8
+ module Openlayer
9
+ class TarFileHelper
10
+ LOGGER = Logger.new($stdout)
11
+
12
+ def self.create_tar_from_folders(folders, tar_file_name)
13
+ File.open(tar_file_name, "wb") do |file|
14
+ Gem::Package::TarWriter.new(Zlib::GzipWriter.open(file)) do |tar|
15
+ folders.each do |folder|
16
+ base_name = File.basename(folder)
17
+ add_directory_to_tar(tar, folder, base_name)
18
+ end
19
+ end
20
+ end
21
+ end
22
+
23
+ def self.validate_structure(file_path, required_structure)
24
+ tarfile_structure = []
25
+ begin
26
+ Gem::Package::TarReader.new(Zlib::GzipReader.open(file_path)).each do |entry|
27
+ tarfile_structure << entry.full_name
28
+ end
29
+ rescue Zlib::GzipFile::Error => e
30
+ stacktrace = e.backtrace.join("\n")
31
+ LOGGER.error("ERROR: #{e.message}\n #{stacktrace}")
32
+ return nil
33
+ end
34
+
35
+ required_structure.each do |required_file|
36
+ raise Error, "Missing file: #{required_file}" unless tarfile_structure.include?(required_file)
37
+ end
38
+ end
39
+
40
+ def self.add_directory_to_tar(tar, folder, base_name)
41
+ Dir[File.join(folder, "**/*")].each do |file|
42
+ mode = File.stat(file).mode
43
+ relative_file = File.join(base_name, file.sub("#{folder}/", ""))
44
+
45
+ if File.directory?(file)
46
+ tar.mkdir(relative_file, mode)
47
+ else
48
+ tar.add_file_simple(relative_file, mode, File.size(file)) do |io|
49
+ File.open(file, "rb") { |f| io.write(f.read) }
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Openlayer
4
- VERSION = "0.2.2"
4
+ VERSION = "0.3.0"
5
5
  end
data/lib/openlayer.rb CHANGED
@@ -5,7 +5,12 @@ require_relative "openlayer/version"
5
5
  module Openlayer
6
6
  autoload :Client, "openlayer/client"
7
7
  autoload :Error, "openlayer/error"
8
+ autoload :Object, "openlayer/object"
8
9
  autoload :InferencePipeline, "openlayer/inference_pipeline"
10
+ autoload :S3PresignedClient, "openlayer/services/s3_presigned_client"
11
+ autoload :TarFileHelper, "openlayer/services/tar_file_helper"
9
12
 
10
- # Your code goes here...
13
+ # Classes used to return a nicer object wrapping the response data
14
+ autoload :Project, "openlayer/objects/project"
15
+ autoload :ProjectVersion, "openlayer/objects/project_version"
11
16
  end
data/openlayer.gemspec CHANGED
@@ -34,7 +34,11 @@ Gem::Specification.new do |spec|
34
34
 
35
35
  # Uncomment to register a new dependency of your gem
36
36
  # spec.add_dependency "example-gem", "~> 1.0"
37
+ spec.add_dependency "date"
37
38
  spec.add_dependency "faraday", "~> 2.9.0"
39
+ spec.add_dependency "faraday-multipart"
40
+ spec.add_dependency "yaml"
41
+ spec.add_dependency "zlib"
38
42
 
39
43
  # For more information and examples about making a new gem, check out our
40
44
  # guide at: https://bundler.io/guides/creating_gem.html
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openlayer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.2
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jose Fernando Davila
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2024-01-19 00:00:00.000000000 Z
11
+ date: 2024-03-21 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: date
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: faraday
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -24,6 +38,48 @@ dependencies:
24
38
  - - "~>"
25
39
  - !ruby/object:Gem::Version
26
40
  version: 2.9.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: faraday-multipart
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: yaml
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: zlib
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ">="
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ">="
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
27
83
  description: Openlayer api wrapper
28
84
  email:
29
85
  - davila.jose23@gmail.com
@@ -37,10 +93,19 @@ files:
37
93
  - LICENSE
38
94
  - README.md
39
95
  - Rakefile
96
+ - examples/staging/.DS_Store
97
+ - examples/staging/commit.yaml
98
+ - examples/staging/model/model_config.yaml
99
+ - examples/staging/validation/dataset_config.yaml
40
100
  - lib/openlayer.rb
41
101
  - lib/openlayer/client.rb
42
102
  - lib/openlayer/error.rb
43
103
  - lib/openlayer/inference_pipeline.rb
104
+ - lib/openlayer/object.rb
105
+ - lib/openlayer/objects/project.rb
106
+ - lib/openlayer/objects/project_version.rb
107
+ - lib/openlayer/services/s3_presigned_client.rb
108
+ - lib/openlayer/services/tar_file_helper.rb
44
109
  - lib/openlayer/version.rb
45
110
  - openlayer.gemspec
46
111
  - sig/openlayer.rbs
@@ -65,7 +130,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
65
130
  - !ruby/object:Gem::Version
66
131
  version: '0'
67
132
  requirements: []
68
- rubygems_version: 3.3.7
133
+ rubygems_version: 3.5.3
69
134
  signing_key:
70
135
  specification_version: 4
71
136
  summary: Openlayer api wrapper