administrate-sdk 0.1.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.
Files changed (40) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +493 -0
  4. data/lib/administrate/base_model.rb +108 -0
  5. data/lib/administrate/client.rb +27 -0
  6. data/lib/administrate/configuration.rb +22 -0
  7. data/lib/administrate/cursor_iterator.rb +41 -0
  8. data/lib/administrate/errors.rb +42 -0
  9. data/lib/administrate/models/account.rb +24 -0
  10. data/lib/administrate/models/api_token.rb +16 -0
  11. data/lib/administrate/models/client_model.rb +16 -0
  12. data/lib/administrate/models/execution.rb +12 -0
  13. data/lib/administrate/models/instance.rb +17 -0
  14. data/lib/administrate/models/llm_cost.rb +37 -0
  15. data/lib/administrate/models/llm_project.rb +10 -0
  16. data/lib/administrate/models/llm_provider.rb +16 -0
  17. data/lib/administrate/models/pagination_meta.rb +9 -0
  18. data/lib/administrate/models/sync_run.rb +23 -0
  19. data/lib/administrate/models/user.rb +14 -0
  20. data/lib/administrate/models/webhook.rb +11 -0
  21. data/lib/administrate/models/workflow.rb +18 -0
  22. data/lib/administrate/page.rb +25 -0
  23. data/lib/administrate/resources/account.rb +24 -0
  24. data/lib/administrate/resources/api_tokens.rb +37 -0
  25. data/lib/administrate/resources/base_resource.rb +37 -0
  26. data/lib/administrate/resources/clients.rb +49 -0
  27. data/lib/administrate/resources/executions.rb +28 -0
  28. data/lib/administrate/resources/instances.rb +61 -0
  29. data/lib/administrate/resources/llm_costs.rb +70 -0
  30. data/lib/administrate/resources/llm_projects.rb +20 -0
  31. data/lib/administrate/resources/llm_providers.rb +47 -0
  32. data/lib/administrate/resources/sync_runs.rb +30 -0
  33. data/lib/administrate/resources/users.rb +33 -0
  34. data/lib/administrate/resources/webhooks.rb +43 -0
  35. data/lib/administrate/resources/workflows.rb +29 -0
  36. data/lib/administrate/transport.rb +101 -0
  37. data/lib/administrate/version.rb +5 -0
  38. data/lib/administrate-sdk.rb +3 -0
  39. data/lib/administrate.rb +42 -0
  40. metadata +123 -0
@@ -0,0 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Administrate
4
+ module Resources
5
+ class LlmProjects < BaseResource
6
+ def list(provider_id, page: nil, per_page: nil)
7
+ params = {}
8
+ params[:page] = page unless page.nil?
9
+ params[:per_page] = per_page unless per_page.nil?
10
+ list_resource(path: "llm_providers/#{provider_id}/llm_projects", model: Models::LlmProject, params: params)
11
+ end
12
+
13
+ def update(provider_id, project_id, client_id: nil)
14
+ body = {}
15
+ body[:client_id] = client_id unless client_id.nil?
16
+ update_resource("llm_providers/#{provider_id}/llm_projects/#{project_id}", Models::LlmProject, body)
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Administrate
4
+ module Resources
5
+ class LlmProviders < BaseResource
6
+ def list(page: nil, per_page: nil)
7
+ params = {}
8
+ params[:page] = page unless page.nil?
9
+ params[:per_page] = per_page unless per_page.nil?
10
+ list_resource(path: 'llm_providers', model: Models::LlmProvider, params: params)
11
+ end
12
+
13
+ def get(provider_id)
14
+ get_resource("llm_providers/#{provider_id}", Models::LlmProvider)
15
+ end
16
+
17
+ def create(name:, provider_type:, api_key:, organization_id: nil, config: nil)
18
+ body = {
19
+ name: name,
20
+ provider_type: provider_type,
21
+ api_key: api_key
22
+ }
23
+ body[:organization_id] = organization_id unless organization_id.nil?
24
+ body[:config] = config unless config.nil?
25
+ create_resource('llm_providers', Models::LlmProvider, body)
26
+ end
27
+
28
+ def update(provider_id, name: nil, api_key: nil, organization_id: nil, config: nil)
29
+ body = {}
30
+ body[:name] = name unless name.nil?
31
+ body[:api_key] = api_key unless api_key.nil?
32
+ body[:organization_id] = organization_id unless organization_id.nil?
33
+ body[:config] = config unless config.nil?
34
+ update_resource("llm_providers/#{provider_id}", Models::LlmProvider, body)
35
+ end
36
+
37
+ def delete(provider_id)
38
+ delete_resource("llm_providers/#{provider_id}")
39
+ end
40
+
41
+ def sync(provider_id)
42
+ response = @transport.post("llm_providers/#{provider_id}/sync")
43
+ response.body
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Administrate
4
+ module Resources
5
+ class SyncRuns < BaseResource
6
+ def list(instance_id: nil, client_id: nil, sync_type: nil, status: nil,
7
+ start_date: nil, end_date: nil, page: nil, per_page: nil)
8
+ params = {}
9
+ params[:instance_id] = instance_id unless instance_id.nil?
10
+ params[:client_id] = client_id unless client_id.nil?
11
+ params[:sync_type] = sync_type unless sync_type.nil?
12
+ params[:status] = status unless status.nil?
13
+ params[:start_date] = start_date unless start_date.nil?
14
+ params[:end_date] = end_date unless end_date.nil?
15
+ params[:page] = page unless page.nil?
16
+ params[:per_page] = per_page unless per_page.nil?
17
+ list_resource(path: 'sync_runs', model: Models::SyncRun, params: params)
18
+ end
19
+
20
+ def get(sync_run_id)
21
+ get_resource("sync_runs/#{sync_run_id}", Models::SyncRun)
22
+ end
23
+
24
+ def health
25
+ response = @transport.get('sync_health')
26
+ (response.body['data'] || []).map { |item| Models::SyncHealthEntry.new(item) }
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Administrate
4
+ module Resources
5
+ class Users < BaseResource
6
+ def list(page: nil, per_page: nil)
7
+ params = {}
8
+ params[:page] = page unless page.nil?
9
+ params[:per_page] = per_page unless per_page.nil?
10
+ list_resource(path: 'users', model: Models::User, params: params)
11
+ end
12
+
13
+ def get(user_id)
14
+ get_resource("users/#{user_id}", Models::User)
15
+ end
16
+
17
+ def invite(email:, role: nil)
18
+ body = { email: email }
19
+ body[:role] = role unless role.nil?
20
+ response = @transport.post('users/invite', body)
21
+ Models::Invitation.new(response.body['data'])
22
+ end
23
+
24
+ def update(user_id, role:)
25
+ update_resource("users/#{user_id}", Models::User, { role: role })
26
+ end
27
+
28
+ def delete(user_id)
29
+ delete_resource("users/#{user_id}")
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Administrate
4
+ module Resources
5
+ class Webhooks < BaseResource
6
+ def list(page: nil, per_page: nil)
7
+ params = {}
8
+ params[:page] = page unless page.nil?
9
+ params[:per_page] = per_page unless per_page.nil?
10
+ list_resource(path: 'webhooks', model: Models::Webhook, params: params)
11
+ end
12
+
13
+ def get(webhook_id)
14
+ get_resource("webhooks/#{webhook_id}", Models::Webhook)
15
+ end
16
+
17
+ def create(url:, events:, description: nil, enabled: nil)
18
+ body = { url: url, events: events }
19
+ body[:description] = description unless description.nil?
20
+ body[:enabled] = enabled unless enabled.nil?
21
+ create_resource('webhooks', Models::Webhook, body)
22
+ end
23
+
24
+ def update(webhook_id, url: nil, events: nil, description: nil, enabled: nil)
25
+ body = {}
26
+ body[:url] = url unless url.nil?
27
+ body[:events] = events unless events.nil?
28
+ body[:description] = description unless description.nil?
29
+ body[:enabled] = enabled unless enabled.nil?
30
+ update_resource("webhooks/#{webhook_id}", Models::Webhook, body)
31
+ end
32
+
33
+ def delete(webhook_id)
34
+ delete_resource("webhooks/#{webhook_id}")
35
+ end
36
+
37
+ def regenerate_secret(webhook_id)
38
+ response = @transport.post("webhooks/#{webhook_id}/regenerate_secret")
39
+ Models::Webhook.new(response.body['data'])
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Administrate
4
+ module Resources
5
+ class Workflows < BaseResource
6
+ def list(client_id: nil, instance_id: nil, active: nil, search: nil, page: nil, per_page: nil)
7
+ params = {}
8
+ params[:company_id] = client_id unless client_id.nil?
9
+ params[:instance_id] = instance_id unless instance_id.nil?
10
+ params[:active] = active.to_s unless active.nil?
11
+ params[:search] = search unless search.nil?
12
+ params[:page] = page unless page.nil?
13
+ params[:per_page] = per_page unless per_page.nil?
14
+ list_resource(path: 'workflows', model: Models::Workflow, params: params)
15
+ end
16
+
17
+ def get(workflow_id)
18
+ get_resource("workflows/#{workflow_id}", Models::Workflow)
19
+ end
20
+
21
+ def update(workflow_id, minutes_saved_per_success: nil, minutes_saved_per_failure: nil)
22
+ body = {}
23
+ body[:minutes_saved_per_success] = minutes_saved_per_success unless minutes_saved_per_success.nil?
24
+ body[:minutes_saved_per_failure] = minutes_saved_per_failure unless minutes_saved_per_failure.nil?
25
+ update_resource("workflows/#{workflow_id}", Models::Workflow, body)
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'faraday/retry'
5
+
6
+ module Administrate
7
+ class Transport
8
+ def initialize(config)
9
+ @config = config
10
+ @base_url = "#{config.base_url.chomp('/')}/api/#{API_VERSION}"
11
+ @connection = build_connection
12
+ end
13
+
14
+ def get(path, params = {})
15
+ handle_request { @connection.get(url_for(path), params) }
16
+ end
17
+
18
+ def post(path, body = {})
19
+ handle_request { @connection.post(url_for(path), body) }
20
+ end
21
+
22
+ def patch(path, body = {})
23
+ handle_request { @connection.patch(url_for(path), body) }
24
+ end
25
+
26
+ def delete(path)
27
+ handle_request { @connection.delete(url_for(path)) }
28
+ end
29
+
30
+ private
31
+
32
+ def url_for(path)
33
+ "#{@base_url}/#{path.sub(%r{^/}, '')}"
34
+ end
35
+
36
+ def build_connection
37
+ Faraday.new do |f|
38
+ f.request :json
39
+ f.request :retry,
40
+ max: @config.max_retries,
41
+ interval: 0.5,
42
+ backoff_factor: 2,
43
+ retry_statuses: [429, 500, 502, 503, 504],
44
+ retry_block: ->(**_) {}
45
+ f.response :json, content_type: /\bjson$/
46
+ f.headers = default_headers
47
+ f.options.timeout = @config.timeout
48
+ f.options.open_timeout = @config.timeout
49
+ end
50
+ end
51
+
52
+ def default_headers
53
+ {
54
+ 'Authorization' => "Bearer #{@config.api_key}",
55
+ 'User-Agent' => "administrate-ruby/#{VERSION}",
56
+ 'Content-Type' => 'application/json',
57
+ 'Accept' => 'application/json'
58
+ }
59
+ end
60
+
61
+ def handle_request
62
+ response = yield
63
+ handle_response(response)
64
+ response
65
+ rescue Faraday::TimeoutError => e
66
+ raise Administrate::TimeoutError, "Request timed out: #{e.message}"
67
+ rescue Faraday::ConnectionFailed => e
68
+ if e.cause.is_a?(::Timeout::Error) || e.cause.is_a?(Net::OpenTimeout)
69
+ raise Administrate::TimeoutError, "Request timed out: #{e.message}"
70
+ end
71
+
72
+ raise Administrate::ConnectionError, "Connection failed: #{e.message}"
73
+ end
74
+
75
+ def handle_response(response)
76
+ return if response.success?
77
+
78
+ body = response.body
79
+ message = if body.is_a?(Hash)
80
+ body['error'] || response.reason_phrase
81
+ else
82
+ body.to_s
83
+ end
84
+
85
+ status = response.status
86
+ exc_class = STATUS_CODE_MAP[status]
87
+
88
+ if exc_class == RateLimitError
89
+ retry_after = response.headers['Retry-After']
90
+ retry_after = retry_after.to_f if retry_after
91
+ raise RateLimitError.new(message, status_code: status, response: response, body: body, retry_after: retry_after)
92
+ elsif exc_class
93
+ raise exc_class.new(message, status_code: status, response: response, body: body)
94
+ elsif status >= 500
95
+ raise InternalServerError.new(message, status_code: status, response: response, body: body)
96
+ else
97
+ raise APIError.new(message, status_code: status, response: response, body: body)
98
+ end
99
+ end
100
+ end
101
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Administrate
4
+ VERSION = '0.1.0'
5
+ end
@@ -0,0 +1,3 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'administrate'
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'administrate/version'
4
+ require_relative 'administrate/errors'
5
+ require_relative 'administrate/configuration'
6
+ require_relative 'administrate/base_model'
7
+ require_relative 'administrate/page'
8
+ require_relative 'administrate/models/pagination_meta'
9
+ require_relative 'administrate/models/account'
10
+ require_relative 'administrate/models/user'
11
+ require_relative 'administrate/models/webhook'
12
+ require_relative 'administrate/models/api_token'
13
+ require_relative 'administrate/models/client_model'
14
+ require_relative 'administrate/models/instance'
15
+ require_relative 'administrate/models/workflow'
16
+ require_relative 'administrate/models/execution'
17
+ require_relative 'administrate/models/sync_run'
18
+ require_relative 'administrate/models/llm_provider'
19
+ require_relative 'administrate/models/llm_project'
20
+ require_relative 'administrate/models/llm_cost'
21
+ require_relative 'administrate/transport'
22
+ require_relative 'administrate/cursor_iterator'
23
+ require_relative 'administrate/resources/base_resource'
24
+ require_relative 'administrate/resources/account'
25
+ require_relative 'administrate/resources/users'
26
+ require_relative 'administrate/resources/webhooks'
27
+ require_relative 'administrate/resources/api_tokens'
28
+ require_relative 'administrate/resources/clients'
29
+ require_relative 'administrate/resources/instances'
30
+ require_relative 'administrate/resources/workflows'
31
+ require_relative 'administrate/resources/executions'
32
+ require_relative 'administrate/resources/sync_runs'
33
+ require_relative 'administrate/resources/llm_providers'
34
+ require_relative 'administrate/resources/llm_projects'
35
+ require_relative 'administrate/resources/llm_costs'
36
+ require_relative 'administrate/client'
37
+
38
+ module Administrate
39
+ def self.new(**kwargs)
40
+ Client.new(**kwargs)
41
+ end
42
+ end
metadata ADDED
@@ -0,0 +1,123 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: administrate-sdk
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Administrate
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: faraday
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - ">="
17
+ - !ruby/object:Gem::Version
18
+ version: '2.0'
19
+ - - "<"
20
+ - !ruby/object:Gem::Version
21
+ version: '3.0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ version: '2.0'
29
+ - - "<"
30
+ - !ruby/object:Gem::Version
31
+ version: '3.0'
32
+ - !ruby/object:Gem::Dependency
33
+ name: faraday-retry
34
+ requirement: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - ">="
37
+ - !ruby/object:Gem::Version
38
+ version: '2.0'
39
+ - - "<"
40
+ - !ruby/object:Gem::Version
41
+ version: '3.0'
42
+ type: :runtime
43
+ prerelease: false
44
+ version_requirements: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - ">="
47
+ - !ruby/object:Gem::Version
48
+ version: '2.0'
49
+ - - "<"
50
+ - !ruby/object:Gem::Version
51
+ version: '3.0'
52
+ description: Typed Ruby client for the Administrate.dev API with auto-pagination,
53
+ retry, and typed exceptions.
54
+ email:
55
+ - support@administrate.dev
56
+ executables: []
57
+ extensions: []
58
+ extra_rdoc_files: []
59
+ files:
60
+ - LICENSE
61
+ - README.md
62
+ - lib/administrate-sdk.rb
63
+ - lib/administrate.rb
64
+ - lib/administrate/base_model.rb
65
+ - lib/administrate/client.rb
66
+ - lib/administrate/configuration.rb
67
+ - lib/administrate/cursor_iterator.rb
68
+ - lib/administrate/errors.rb
69
+ - lib/administrate/models/account.rb
70
+ - lib/administrate/models/api_token.rb
71
+ - lib/administrate/models/client_model.rb
72
+ - lib/administrate/models/execution.rb
73
+ - lib/administrate/models/instance.rb
74
+ - lib/administrate/models/llm_cost.rb
75
+ - lib/administrate/models/llm_project.rb
76
+ - lib/administrate/models/llm_provider.rb
77
+ - lib/administrate/models/pagination_meta.rb
78
+ - lib/administrate/models/sync_run.rb
79
+ - lib/administrate/models/user.rb
80
+ - lib/administrate/models/webhook.rb
81
+ - lib/administrate/models/workflow.rb
82
+ - lib/administrate/page.rb
83
+ - lib/administrate/resources/account.rb
84
+ - lib/administrate/resources/api_tokens.rb
85
+ - lib/administrate/resources/base_resource.rb
86
+ - lib/administrate/resources/clients.rb
87
+ - lib/administrate/resources/executions.rb
88
+ - lib/administrate/resources/instances.rb
89
+ - lib/administrate/resources/llm_costs.rb
90
+ - lib/administrate/resources/llm_projects.rb
91
+ - lib/administrate/resources/llm_providers.rb
92
+ - lib/administrate/resources/sync_runs.rb
93
+ - lib/administrate/resources/users.rb
94
+ - lib/administrate/resources/webhooks.rb
95
+ - lib/administrate/resources/workflows.rb
96
+ - lib/administrate/transport.rb
97
+ - lib/administrate/version.rb
98
+ homepage: https://github.com/administrate-dev/administrate-ruby-sdk
99
+ licenses:
100
+ - MIT
101
+ metadata:
102
+ homepage_uri: https://github.com/administrate-dev/administrate-ruby-sdk
103
+ source_code_uri: https://github.com/administrate-dev/administrate-ruby-sdk
104
+ changelog_uri: https://github.com/administrate-dev/administrate-ruby-sdk/blob/main/CHANGELOG.md
105
+ rubygems_mfa_required: 'true'
106
+ rdoc_options: []
107
+ require_paths:
108
+ - lib
109
+ required_ruby_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '3.1'
114
+ required_rubygems_version: !ruby/object:Gem::Requirement
115
+ requirements:
116
+ - - ">="
117
+ - !ruby/object:Gem::Version
118
+ version: '0'
119
+ requirements: []
120
+ rubygems_version: 3.7.2
121
+ specification_version: 4
122
+ summary: Ruby client for the Administrate.dev REST API
123
+ test_files: []