@seamapi/nextlove-sdk-generator 1.5.5 → 1.5.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.
Files changed (62) hide show
  1. package/lib/generate-php-sdk/generate-php-sdk.js +4 -4
  2. package/lib/generate-php-sdk/generate-php-sdk.js.map +1 -1
  3. package/lib/generate-python-sdk/class-file.js +8 -5
  4. package/lib/generate-python-sdk/class-file.js.map +1 -1
  5. package/lib/generate-python-sdk/generate-python-sdk.js +3 -4
  6. package/lib/generate-python-sdk/generate-python-sdk.js.map +1 -1
  7. package/lib/generate-ruby-sdk/generate-ruby-sdk.js +33 -14
  8. package/lib/generate-ruby-sdk/generate-ruby-sdk.js.map +1 -1
  9. package/lib/generate-ruby-sdk/ruby-client.d.ts +8 -2
  10. package/lib/generate-ruby-sdk/ruby-client.js +25 -6
  11. package/lib/generate-ruby-sdk/ruby-client.js.map +1 -1
  12. package/lib/generate-ruby-sdk/templates/.rspec.template.d.ts +2 -0
  13. package/lib/generate-ruby-sdk/templates/.rspec.template.js +4 -0
  14. package/lib/generate-ruby-sdk/templates/.rspec.template.js.map +1 -0
  15. package/lib/generate-ruby-sdk/templates/.ruby-version.template.d.ts +2 -0
  16. package/lib/generate-ruby-sdk/templates/.ruby-version.template.js +2 -0
  17. package/lib/generate-ruby-sdk/templates/.ruby-version.template.js.map +1 -0
  18. package/lib/generate-ruby-sdk/templates/base_resource.rb.template.js +2 -2
  19. package/lib/generate-ruby-sdk/templates/client.rb.template.d.ts +1 -1
  20. package/lib/generate-ruby-sdk/templates/client.rb.template.js +60 -73
  21. package/lib/generate-ruby-sdk/templates/client.rb.template.js.map +1 -1
  22. package/lib/generate-ruby-sdk/templates/request.rb.template.js +1 -1
  23. package/lib/generate-ruby-sdk/templates/resource_error.rb.template.js +2 -0
  24. package/lib/generate-ruby-sdk/templates/resource_error.rb.template.js.map +1 -1
  25. package/lib/generate-ruby-sdk/templates/resource_warning.rb.template.js +2 -0
  26. package/lib/generate-ruby-sdk/templates/resource_warning.rb.template.js.map +1 -1
  27. package/lib/generate-ruby-sdk/templates/seamapi.gemspec.template.js +2 -2
  28. package/lib/generate-ruby-sdk/templates/snippets/action-attempt-helpers-template.d.ts +2 -0
  29. package/lib/generate-ruby-sdk/templates/snippets/action-attempt-helpers-template.js +28 -0
  30. package/lib/generate-ruby-sdk/templates/snippets/action-attempt-helpers-template.js.map +1 -0
  31. package/lib/generate-ruby-sdk/templates/snippets/resource.rb.template.js +26 -7
  32. package/lib/generate-ruby-sdk/templates/snippets/resource.rb.template.js.map +1 -1
  33. package/lib/generate-ruby-sdk/templates/spec_helper.rb.template.d.ts +2 -0
  34. package/lib/generate-ruby-sdk/templates/spec_helper.rb.template.js +29 -0
  35. package/lib/generate-ruby-sdk/templates/spec_helper.rb.template.js.map +1 -0
  36. package/lib/generate-ruby-sdk/templates/support-helpers.rb.template.d.ts +2 -0
  37. package/lib/generate-ruby-sdk/templates/support-helpers.rb.template.js +12 -0
  38. package/lib/generate-ruby-sdk/templates/support-helpers.rb.template.js.map +1 -0
  39. package/lib/generate-ruby-sdk/templates/version.rb.template.js +1 -1
  40. package/lib/openapi/map-parent-to-children-resource.d.ts +2 -2
  41. package/lib/openapi/map-parent-to-children-resource.js +2 -2
  42. package/lib/openapi/map-parent-to-children-resource.js.map +1 -1
  43. package/package.json +1 -1
  44. package/src/lib/generate-php-sdk/generate-php-sdk.ts +4 -4
  45. package/src/lib/generate-python-sdk/class-file.ts +9 -6
  46. package/src/lib/generate-python-sdk/generate-python-sdk.ts +3 -4
  47. package/src/lib/generate-ruby-sdk/generate-ruby-sdk.ts +47 -14
  48. package/src/lib/generate-ruby-sdk/ruby-client.ts +42 -7
  49. package/src/lib/generate-ruby-sdk/templates/.rspec.template.ts +3 -0
  50. package/src/lib/generate-ruby-sdk/templates/.ruby-version.template.ts +1 -0
  51. package/src/lib/generate-ruby-sdk/templates/base_resource.rb.template.ts +2 -2
  52. package/src/lib/generate-ruby-sdk/templates/client.rb.template.ts +62 -73
  53. package/src/lib/generate-ruby-sdk/templates/request.rb.template.ts +1 -1
  54. package/src/lib/generate-ruby-sdk/templates/resource_error.rb.template.ts +2 -0
  55. package/src/lib/generate-ruby-sdk/templates/resource_warning.rb.template.ts +2 -0
  56. package/src/lib/generate-ruby-sdk/templates/seamapi.gemspec.template.ts +2 -2
  57. package/src/lib/generate-ruby-sdk/templates/snippets/action-attempt-helpers-template.ts +27 -0
  58. package/src/lib/generate-ruby-sdk/templates/snippets/resource.rb.template.ts +34 -9
  59. package/src/lib/generate-ruby-sdk/templates/spec_helper.rb.template.ts +28 -0
  60. package/src/lib/generate-ruby-sdk/templates/support-helpers.rb.template.ts +11 -0
  61. package/src/lib/generate-ruby-sdk/templates/version.rb.template.ts +1 -1
  62. package/src/lib/openapi/map-parent-to-children-resource.ts +2 -4
@@ -1,3 +1,5 @@
1
+ import endpoints_returning_deprecated_action_attempt from "lib/endpoints-returning-deprecated-action-attempt.js"
2
+
1
3
  export type RubyClientMethodParameter = {
2
4
  name: string
3
5
  required?: boolean | undefined
@@ -8,18 +10,26 @@ export type RubyClientMethod = {
8
10
  method_name: string
9
11
  path: string
10
12
  parameters: RubyClientMethodParameter[]
11
- return_resource: string
13
+ return_resource: string | null
12
14
  return_path: string
13
15
  }
14
16
 
17
+ type ChildClientIdentifier = {
18
+ client_name: string
19
+ namespace: string
20
+ }
21
+
15
22
  export class RubyClient {
16
23
  methods: RubyClientMethod[] = []
24
+ child_client_identifiers: ChildClientIdentifier[]
17
25
 
18
26
  constructor(
19
27
  public pascal_name: string,
20
- public snake_name: string
28
+ public snake_name: string,
29
+ child_client_identifiers: ChildClientIdentifier[]
21
30
  ) {
22
31
  this.methods = []
32
+ this.child_client_identifiers = child_client_identifiers
23
33
  }
24
34
 
25
35
  addMethod(method: RubyClientMethod) {
@@ -43,13 +53,30 @@ export class RubyClient {
43
53
  */
44
54
  serialize() {
45
55
  return [
56
+ `# frozen_string_literal: true`,
57
+ ``,
46
58
  `module Seam`,
47
59
  ` module Clients`,
48
60
  ` class ${this.pascal_name} < BaseClient`,
61
+ ...this.child_client_identifiers.map(({ client_name, namespace }) =>
62
+ [
63
+ `def ${namespace}`,
64
+ ` @${namespace} ||= Seam::Clients::${client_name}.new(self)`,
65
+ `end`,
66
+ ``,
67
+ ]
68
+ .flatMap((s) => ` ${s}`)
69
+ .join("\n")
70
+ ),
49
71
  ...this.methods.map(
50
72
  ({ method_name, path, parameters, return_resource, return_path }) => {
73
+ const is_action_attempt_client = this.pascal_name === "ActionAttempts"
74
+ const can_method_poll_action_attempt =
75
+ !endpoints_returning_deprecated_action_attempt.includes(path) &&
76
+ !is_action_attempt_client &&
77
+ return_resource === "ActionAttempt"
78
+
51
79
  return [
52
- " ",
53
80
  `def ${method_name}(${parameters
54
81
  .sort(
55
82
  (a, b) =>
@@ -58,18 +85,26 @@ export class RubyClient {
58
85
  )
59
86
  .map((p) => `${p.name}${p.required ? "" : ": nil"}`)
60
87
  .join(", ")})`,
61
- ` request_seam_object(`,
88
+ ` ${can_method_poll_action_attempt ? "action_attempt = " : ""}${
89
+ return_resource ? "request_seam_object" : "request_seam"
90
+ }(`,
62
91
  ` :post,`,
63
92
  ` "${path}",`,
64
- ` ${return_resource},`,
65
- ` '${return_path}',`,
93
+ return_resource ? ` Seam::${return_resource},` : [],
94
+ return_path ? ` '${return_path}',` : [],
66
95
  ` body: {${parameters
67
96
  .map((p) => `${p.name}: ${p.name}`)
68
97
  .join(", ")}}.compact`,
69
98
  ` )`,
99
+ ` ${
100
+ can_method_poll_action_attempt
101
+ ? "action_attempt.wait_until_finished\n action_attempt"
102
+ : ""
103
+ }`,
70
104
  `end`,
105
+ ``,
71
106
  ]
72
- .map((s) => ` ${s}`)
107
+ .flatMap((s) => ` ${s}`)
73
108
  .join("\n")
74
109
  }
75
110
  ),
@@ -0,0 +1,3 @@
1
+ export default () => `--format documentation
2
+ --color
3
+ --require spec_helper`
@@ -0,0 +1 @@
1
+ export default () => `3.0.4`
@@ -29,12 +29,12 @@ module Seam
29
29
  end
30
30
 
31
31
  def inspect
32
- "<#{self.class.name}:#{"0x00%x" % (object_id << 1)}\n" + # rubocop:disable Style/StringConcatenation, Style/FormatString
32
+ "<#{self.class.name}:#{"0x00%x" % (object_id << 1)}\\n" + # rubocop:disable Style/StringConcatenation, Style/FormatString
33
33
  instance_variables
34
34
  .map { |k| k.to_s.sub("@", "") }
35
35
  .filter { |k| k != "data" and k != "client" and respond_to? k }
36
36
  .map { |k| " #{k}=#{send(k).inspect}" }
37
- .join("\n") + ">"
37
+ .join("\\n") + ">"
38
38
  end
39
39
 
40
40
  def self.date_accessor(*attrs)
@@ -1,73 +1,62 @@
1
- export default () => `# frozen_string_literal: true
2
-
3
- module Seam
4
- class Client
5
- attr_accessor :api_key, :base_uri, :debug
6
-
7
- def initialize(api_key: nil, base_uri: "https://connect.getseam.com", debug: false)
8
- @api_key = api_key || ENV.fetch("SEAM_API_KEY", nil)
9
- @base_uri = base_uri
10
- @debug = debug
11
-
12
- raise ArgumentError, "SEAM_API_KEY not found in environment, and api_key not provided" unless @api_key
13
- end
14
-
15
- def health
16
- request_seam(:get, "/health")
17
- end
18
-
19
- def locks
20
- @locks ||= Seam::Clients::Locks.new(self)
21
- end
22
-
23
- def devices
24
- @devices ||= Seam::Clients::Devices.new(self)
25
- end
26
-
27
- def unmanaged_devices
28
- @unmanaged_devices ||= Seam::Clients::UnmanagedDevices.new(self)
29
- end
30
-
31
- def action_attempts
32
- @action_attempts ||= Seam::Clients::ActionAttempts.new(self)
33
- end
34
-
35
- def access_codes
36
- @access_codes ||= Seam::Clients::AccessCodes.new(self)
37
- end
38
-
39
- def connect_webviews
40
- @connect_webviews ||= Seam::Clients::ConnectWebviews.new(self)
41
- end
42
-
43
- def connected_accounts
44
- @connected_accounts ||= Seam::Clients::ConnectedAccounts.new(self)
45
- end
46
-
47
- def workspaces
48
- @workspaces ||= Seam::Clients::Workspaces.new(self)
49
- end
50
-
51
- def events
52
- @events ||= Seam::Clients::Events.new(self)
53
- end
54
-
55
- def request_seam_object(method, path, klass, inner_object, config = {})
56
- response = request_seam(method, path, config)
57
-
58
- data = response[inner_object]
59
-
60
- klass.load_from_response(data, self)
61
- end
62
-
63
- def request_seam(method, path, config = {})
64
- Seam::Request.new(
65
- api_key: api_key,
66
- base_uri: base_uri,
67
- debug: debug
68
- ).perform(
69
- method, path, config
70
- )
71
- end
72
- end
73
- end`
1
+ import { pascalCase } from "change-case"
2
+
3
+ export default (resource_client_names: string[]) => {
4
+ const resource_client_defs = resource_client_names
5
+ .map((client_name) => {
6
+ return `
7
+ def ${client_name}
8
+ @${client_name} ||= Seam::Clients::${pascalCase(client_name)}.new(self)
9
+ end
10
+ `
11
+ })
12
+ .join("")
13
+
14
+ return `# frozen_string_literal: true
15
+
16
+ module Seam
17
+ class Client
18
+ attr_accessor :api_key, :base_uri, :debug
19
+
20
+ def initialize(api_key: nil, base_uri: "https://connect.getseam.com", debug: false)
21
+ @api_key = api_key || ENV.fetch("SEAM_API_KEY", nil)
22
+ @base_uri = base_uri
23
+ @debug = debug
24
+
25
+ raise ArgumentError, "SEAM_API_KEY not found in environment, and api_key not provided" unless @api_key
26
+ end
27
+ ${resource_client_defs}
28
+
29
+ # @deprecated Please use {#devices.unmanaged} instead.
30
+ def unmanaged_devices
31
+ warn "[DEPRECATION] 'unmanaged_devices' is deprecated. Please use 'devices.unmanaged' instead."
32
+
33
+ @unmanaged_devices ||= Seam::Clients::DevicesUnmanaged.new(self)
34
+ end
35
+
36
+ # @deprecated Please use {#access_codes.unmanaged} instead.
37
+ def unmanaged_access_codes
38
+ warn "[DEPRECATION] 'unmanaged_access_codes' is deprecated. Please use 'access_codes.unmanaged' instead."
39
+
40
+ @unmanaged_access_codes ||= Seam::Clients::AccessCodesUnmanaged.new(self)
41
+ end
42
+
43
+ def request_seam_object(method, path, klass, inner_object, config = {})
44
+ response = request_seam(method, path, config)
45
+
46
+ data = response[inner_object]
47
+
48
+ klass.load_from_response(data, self)
49
+ end
50
+
51
+ def request_seam(method, path, config = {})
52
+ Seam::Request.new(
53
+ api_key: api_key,
54
+ base_uri: base_uri,
55
+ debug: debug
56
+ ).perform(
57
+ method, path, config
58
+ )
59
+ end
60
+ end
61
+ end`
62
+ }
@@ -45,7 +45,7 @@ module Seam
45
45
  code = response.status.code
46
46
 
47
47
  if code >= 400 && code < 500 && (err = response.parse["error"])
48
- msg = "Api Error #{err["type"]}\nrequest_id: #{err["request_id"]}\n#{err["message"]}"
48
+ msg = "Api Error #{err["type"]}\\nrequest_id: #{err["request_id"]}\\n#{err["message"]}"
49
49
  end
50
50
 
51
51
  raise Error.new(msg, code, response)
@@ -3,5 +3,7 @@ export default () => `# frozen_string_literal: true
3
3
  module Seam
4
4
  class ResourceError < BaseResource
5
5
  attr_accessor :error_code, :message
6
+
7
+ date_accessor :created_at
6
8
  end
7
9
  end`
@@ -3,5 +3,7 @@ export default () => `# frozen_string_literal: true
3
3
  module Seam
4
4
  class ResourceWarning < BaseResource
5
5
  attr_accessor :warning_code, :message
6
+
7
+ date_accessor :created_at
6
8
  end
7
9
  end`
@@ -6,7 +6,7 @@ Gem::Specification.new do |spec|
6
6
  spec.name = "seamapi"
7
7
  spec.version = Seam::VERSION
8
8
  spec.author = "Seam Labs, Inc."
9
- spec.email = "support@getseam.com"
9
+ spec.email = "devops@getseam.com"
10
10
 
11
11
  spec.summary = "Seam API Ruby SDK"
12
12
  spec.description = "Official interface to the Seam Connect API."
@@ -26,7 +26,7 @@ Gem::Specification.new do |spec|
26
26
  spec.files = Dir["lib/**/*.rb"]
27
27
  spec.files += Dir["[A-Z]*"]
28
28
 
29
- spec.add_dependency "http", "~> 5.0.0"
29
+ spec.add_dependency "http", "~> 5.0"
30
30
 
31
31
  spec.add_development_dependency "bundler", "~> 2.0"
32
32
  spec.add_development_dependency "gem-release", "~> 2.2"
@@ -0,0 +1,27 @@
1
+ export default () => `SLEEP_TIME = 0.2
2
+ MAX_ATTEMPTS = 10
3
+
4
+ def wait_until_finished
5
+ attempts = 0
6
+ while @status == "pending"
7
+ update!
8
+ sleep(SLEEP_TIME)
9
+ attempts += 1
10
+ end
11
+
12
+ raise "Timed out waiting for action attempt to finish" if attempts >= MAX_ATTEMPTS
13
+
14
+ self
15
+ end
16
+
17
+ def update!
18
+ response = @client.request_seam(
19
+ :post,
20
+ "/action_attempts/get",
21
+ body: {
22
+ action_attempt_id: action_attempt_id
23
+ }
24
+ )
25
+
26
+ update_from_response(response["action_attempt"])
27
+ end`
@@ -1,3 +1,5 @@
1
+ import actionAttemptHelpersTemplate from "./action-attempt-helpers-template.js"
2
+
1
3
  export default ({
2
4
  pascal_name,
3
5
  attrs,
@@ -6,19 +8,42 @@ export default ({
6
8
  pascal_name: string
7
9
  attrs: string[]
8
10
  date_attrs: string[]
9
- }) => `# frozen_string_literal: true
11
+ }) => {
12
+ const no_error_warning_attrs = attrs.filter(
13
+ (attr) => attr !== "errors" && attr !== "warnings"
14
+ )
15
+ const has_warnings_attr = attrs.includes("warnings")
16
+ const has_errors_attr = attrs.includes("errors")
17
+
18
+ const attr_accessors = no_error_warning_attrs
19
+ .map((attr) => `:${attr}`)
20
+ .join(", ")
21
+ const date_accessors =
22
+ date_attrs.length > 0
23
+ ? `date_accessor ${date_attrs.map((attr) => `:${attr}`).join(", ")}`
24
+ : ""
25
+
26
+ const resource_errors_support = has_errors_attr
27
+ ? "include Seam::ResourceErrorsSupport"
28
+ : ""
29
+ const resource_warnings_support = has_warnings_attr
30
+ ? "include Seam::ResourceWarningsSupport"
31
+ : ""
32
+
33
+ const is_action_attempt_resource = pascal_name === "ActionAttempt"
34
+
35
+ return `# frozen_string_literal: true
10
36
 
11
37
  module Seam
12
38
  class ${pascal_name} < BaseResource
13
- attr_reader ${attrs.map((attr) => `:${attr}`).join(", ")}
39
+ attr_accessor ${attr_accessors}
40
+
41
+ ${date_accessors}
14
42
 
15
- ${
16
- date_attrs.length > 0
17
- ? `date_accessor ${date_attrs.map((attr) => `:${attr}`).join(", ")}`
18
- : ""
19
- }
43
+ ${resource_errors_support}
44
+ ${resource_warnings_support}
20
45
 
21
- include Seam::ResourceErrorsSupport
22
- include Seam::ResourceWarningsSupport
46
+ ${is_action_attempt_resource ? actionAttemptHelpersTemplate() : ""}
23
47
  end
24
48
  end`
49
+ }
@@ -0,0 +1,28 @@
1
+ export default () => `# frozen_string_literal: true
2
+
3
+ require "simplecov"
4
+ require "simplecov-console"
5
+
6
+ SimpleCov.start
7
+
8
+ require "seamapi"
9
+ require "webmock/rspec"
10
+
11
+ require_relative "support/helpers"
12
+
13
+ SimpleCov.formatter = SimpleCov::Formatter::MultiFormatter.new([
14
+ SimpleCov::Formatter::HTMLFormatter,
15
+ SimpleCov::Formatter::Console
16
+ ])
17
+
18
+ RSpec.configure do |config|
19
+ config.example_status_persistence_file_path = ".rspec_status"
20
+
21
+ config.disable_monkey_patching!
22
+
23
+ config.expect_with :rspec do |c|
24
+ c.syntax = :expect
25
+ end
26
+
27
+ config.include Helpers
28
+ end`
@@ -0,0 +1,11 @@
1
+ export default () => `# frozen_string_literal: true
2
+
3
+ module Helpers
4
+ def stub_seam_request(method, path, response, status: 200, headers: {})
5
+ stub_request(
6
+ method,
7
+ "https://connect.getseam.com#{path}"
8
+ ).to_return(status: status, body: response.to_json,
9
+ headers: {"Content-Type" => "application/json"}.merge(headers))
10
+ end
11
+ end`
@@ -1,5 +1,5 @@
1
1
  export default () => `# frozen_string_literal: true
2
2
 
3
3
  module Seam
4
- VERSION = "1.11.2"
4
+ VERSION = "1.16.1"
5
5
  end`
@@ -1,8 +1,6 @@
1
1
  import type { Route } from "lib/types.js"
2
2
 
3
- const mapParentToChildrenResources = (
4
- routes: Route[]
5
- ): Record<string, string[]> =>
3
+ const mapParentToChildResources = (routes: Route[]): Record<string, string[]> =>
6
4
  routes.reduce((acc: Record<string, string[]>, route) => {
7
5
  if (!route.post?.["x-fern-sdk-group-name"]) return acc
8
6
 
@@ -25,4 +23,4 @@ const mapParentToChildrenResources = (
25
23
  return acc
26
24
  }, {})
27
25
 
28
- export default mapParentToChildrenResources
26
+ export default mapParentToChildResources