@seamapi/nextlove-sdk-generator 1.4.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 (287) hide show
  1. package/LICENSE.txt +20 -0
  2. package/README.md +16 -0
  3. package/index.d.ts +6 -0
  4. package/index.js +7 -0
  5. package/index.js.map +1 -0
  6. package/lib/cli.d.ts +2 -0
  7. package/lib/cli.js +53 -0
  8. package/lib/cli.js.map +1 -0
  9. package/lib/fs-util/index.d.ts +2 -0
  10. package/lib/fs-util/index.js +3 -0
  11. package/lib/fs-util/index.js.map +1 -0
  12. package/lib/fs-util/populate-fs.d.ts +1 -0
  13. package/lib/fs-util/populate-fs.js +11 -0
  14. package/lib/fs-util/populate-fs.js.map +1 -0
  15. package/lib/fs-util/write-fs.d.ts +1 -0
  16. package/lib/fs-util/write-fs.js +10 -0
  17. package/lib/fs-util/write-fs.js.map +1 -0
  18. package/lib/generate-csharp-sdk/codegen.d.ts +235 -0
  19. package/lib/generate-csharp-sdk/codegen.js +432 -0
  20. package/lib/generate-csharp-sdk/codegen.js.map +1 -0
  21. package/lib/generate-csharp-sdk/constants.d.ts +1 -0
  22. package/lib/generate-csharp-sdk/constants.js +2 -0
  23. package/lib/generate-csharp-sdk/constants.js.map +1 -0
  24. package/lib/generate-csharp-sdk/generate-csharp-sdk.d.ts +1 -0
  25. package/lib/generate-csharp-sdk/generate-csharp-sdk.js +81 -0
  26. package/lib/generate-csharp-sdk/generate-csharp-sdk.js.map +1 -0
  27. package/lib/generate-csharp-sdk/generate-csproj.d.ts +1 -0
  28. package/lib/generate-csharp-sdk/generate-csproj.js +45 -0
  29. package/lib/generate-csharp-sdk/generate-csproj.js.map +1 -0
  30. package/lib/generate-csharp-sdk/templates/dataclass.d.ts +24 -0
  31. package/lib/generate-csharp-sdk/templates/dataclass.js +468 -0
  32. package/lib/generate-csharp-sdk/templates/dataclass.js.map +1 -0
  33. package/lib/generate-csharp-sdk/templates/fs/csharp-testing.sln +34 -0
  34. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ApiResponse.cs +159 -0
  35. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ClientUtils.cs +280 -0
  36. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ExceptionFactory.cs +12 -0
  37. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/GlobalSeamRequestConfiguration.cs +60 -0
  38. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/HttpMethod.cs +29 -0
  39. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/IAsynchronousSeam.cs +142 -0
  40. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/IReadableSeamRequestConfiguration.cs +68 -0
  41. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ISynchronousSeam.cs +103 -0
  42. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/Multimap.cs +286 -0
  43. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/RequestOptions.cs +74 -0
  44. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/RetryConfiguration.cs +21 -0
  45. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/Seam.cs +1070 -0
  46. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/SeamException.cs +64 -0
  47. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/SeamRequestConfiguration.cs +662 -0
  48. package/lib/generate-csharp-sdk/templates/fs/src/Seam/Model/AsbtractModelSchema.cs +62 -0
  49. package/lib/generate-php-sdk/generate-php-sdk.d.ts +1 -0
  50. package/lib/generate-php-sdk/generate-php-sdk.js +127 -0
  51. package/lib/generate-php-sdk/generate-php-sdk.js.map +1 -0
  52. package/lib/generate-php-sdk/index.d.ts +1 -0
  53. package/lib/generate-php-sdk/index.js +2 -0
  54. package/lib/generate-php-sdk/index.js.map +1 -0
  55. package/lib/generate-php-sdk/templates/composer.json.template.d.ts +2 -0
  56. package/lib/generate-php-sdk/templates/composer.json.template.js +25 -0
  57. package/lib/generate-php-sdk/templates/composer.json.template.js.map +1 -0
  58. package/lib/generate-php-sdk/templates/env.example.template.d.ts +2 -0
  59. package/lib/generate-php-sdk/templates/env.example.template.js +4 -0
  60. package/lib/generate-php-sdk/templates/env.example.template.js.map +1 -0
  61. package/lib/generate-php-sdk/templates/gitignore.template.d.ts +2 -0
  62. package/lib/generate-php-sdk/templates/gitignore.template.js +6 -0
  63. package/lib/generate-php-sdk/templates/gitignore.template.js.map +1 -0
  64. package/lib/generate-php-sdk/templates/package.json.template.d.ts +2 -0
  65. package/lib/generate-php-sdk/templates/package.json.template.js +12 -0
  66. package/lib/generate-php-sdk/templates/package.json.template.js.map +1 -0
  67. package/lib/generate-php-sdk/templates/readme.md.template.d.ts +2 -0
  68. package/lib/generate-php-sdk/templates/readme.md.template.js +86 -0
  69. package/lib/generate-php-sdk/templates/readme.md.template.js.map +1 -0
  70. package/lib/generate-php-sdk/templates/smoke-test.template.d.ts +2 -0
  71. package/lib/generate-php-sdk/templates/smoke-test.template.js +30 -0
  72. package/lib/generate-php-sdk/templates/smoke-test.template.js.map +1 -0
  73. package/lib/generate-php-sdk/templates/test-fixture.template.d.ts +2 -0
  74. package/lib/generate-php-sdk/templates/test-fixture.template.js +21 -0
  75. package/lib/generate-php-sdk/templates/test-fixture.template.js.map +1 -0
  76. package/lib/generate-php-sdk/utils/deep-extract-resource-object-schemas.d.ts +16 -0
  77. package/lib/generate-php-sdk/utils/deep-extract-resource-object-schemas.js +97 -0
  78. package/lib/generate-php-sdk/utils/deep-extract-resource-object-schemas.js.map +1 -0
  79. package/lib/generate-php-sdk/utils/deep-flatten-one-of-and-all-of-schema.d.ts +2 -0
  80. package/lib/generate-php-sdk/utils/deep-flatten-one-of-and-all-of-schema.js +95 -0
  81. package/lib/generate-php-sdk/utils/deep-flatten-one-of-and-all-of-schema.js.map +1 -0
  82. package/lib/generate-php-sdk/utils/generate-resource-object-class.d.ts +8 -0
  83. package/lib/generate-php-sdk/utils/generate-resource-object-class.js +73 -0
  84. package/lib/generate-php-sdk/utils/generate-resource-object-class.js.map +1 -0
  85. package/lib/generate-php-sdk/utils/generate-seam-client.d.ts +7 -0
  86. package/lib/generate-php-sdk/utils/generate-seam-client.js +103 -0
  87. package/lib/generate-php-sdk/utils/generate-seam-client.js.map +1 -0
  88. package/lib/generate-php-sdk/utils/get-php-type.d.ts +1 -0
  89. package/lib/generate-php-sdk/utils/get-php-type.js +17 -0
  90. package/lib/generate-php-sdk/utils/get-php-type.js.map +1 -0
  91. package/lib/generate-php-sdk/utils/php-client.d.ts +31 -0
  92. package/lib/generate-php-sdk/utils/php-client.js +130 -0
  93. package/lib/generate-php-sdk/utils/php-client.js.map +1 -0
  94. package/lib/generate-python-sdk/class-file.d.ts +20 -0
  95. package/lib/generate-python-sdk/class-file.js +75 -0
  96. package/lib/generate-python-sdk/class-file.js.map +1 -0
  97. package/lib/generate-python-sdk/generate-python-sdk.d.ts +1 -0
  98. package/lib/generate-python-sdk/generate-python-sdk.js +117 -0
  99. package/lib/generate-python-sdk/generate-python-sdk.js.map +1 -0
  100. package/lib/generate-python-sdk/index.d.ts +1 -0
  101. package/lib/generate-python-sdk/index.js +2 -0
  102. package/lib/generate-python-sdk/index.js.map +1 -0
  103. package/lib/generate-python-sdk/map-python-type.d.ts +2 -0
  104. package/lib/generate-python-sdk/map-python-type.js +26 -0
  105. package/lib/generate-python-sdk/map-python-type.js.map +1 -0
  106. package/lib/generate-python-sdk/templates/conftest.py.template.d.ts +2 -0
  107. package/lib/generate-python-sdk/templates/conftest.py.template.js +12 -0
  108. package/lib/generate-python-sdk/templates/conftest.py.template.js.map +1 -0
  109. package/lib/generate-python-sdk/templates/pyproject.toml.template.d.ts +2 -0
  110. package/lib/generate-python-sdk/templates/pyproject.toml.template.js +21 -0
  111. package/lib/generate-python-sdk/templates/pyproject.toml.template.js.map +1 -0
  112. package/lib/generate-python-sdk/templates/readme.md.template.d.ts +2 -0
  113. package/lib/generate-python-sdk/templates/readme.md.template.js +48 -0
  114. package/lib/generate-python-sdk/templates/readme.md.template.js.map +1 -0
  115. package/lib/generate-python-sdk/templates/routes.py.template.d.ts +2 -0
  116. package/lib/generate-python-sdk/templates/routes.py.template.js +13 -0
  117. package/lib/generate-python-sdk/templates/routes.py.template.js.map +1 -0
  118. package/lib/generate-python-sdk/templates/seam.py.template.d.ts +2 -0
  119. package/lib/generate-python-sdk/templates/seam.py.template.js +74 -0
  120. package/lib/generate-python-sdk/templates/seam.py.template.js.map +1 -0
  121. package/lib/generate-python-sdk/templates/snippets/abstract-routes.template.d.ts +2 -0
  122. package/lib/generate-python-sdk/templates/snippets/abstract-routes.template.js +9 -0
  123. package/lib/generate-python-sdk/templates/snippets/abstract-routes.template.js.map +1 -0
  124. package/lib/generate-python-sdk/templates/snippets/abstract-seam.template.d.ts +2 -0
  125. package/lib/generate-python-sdk/templates/snippets/abstract-seam.template.js +9 -0
  126. package/lib/generate-python-sdk/templates/snippets/abstract-seam.template.js.map +1 -0
  127. package/lib/generate-python-sdk/templates/snippets/resource-dataclass.template.d.ts +5 -0
  128. package/lib/generate-python-sdk/templates/snippets/resource-dataclass.template.js +10 -0
  129. package/lib/generate-python-sdk/templates/snippets/resource-dataclass.template.js.map +1 -0
  130. package/lib/generate-python-sdk/templates/test_smoke.py.template.d.ts +2 -0
  131. package/lib/generate-python-sdk/templates/test_smoke.py.template.js +13 -0
  132. package/lib/generate-python-sdk/templates/test_smoke.py.template.js.map +1 -0
  133. package/lib/generate-python-sdk/templates/utils/deep_attr_dict.py.template.d.ts +2 -0
  134. package/lib/generate-python-sdk/templates/utils/deep_attr_dict.py.template.js +28 -0
  135. package/lib/generate-python-sdk/templates/utils/deep_attr_dict.py.template.js.map +1 -0
  136. package/lib/generate-ruby-sdk/generate-ruby-sdk.d.ts +1 -0
  137. package/lib/generate-ruby-sdk/generate-ruby-sdk.js +132 -0
  138. package/lib/generate-ruby-sdk/generate-ruby-sdk.js.map +1 -0
  139. package/lib/generate-ruby-sdk/index.d.ts +1 -0
  140. package/lib/generate-ruby-sdk/index.js +2 -0
  141. package/lib/generate-ruby-sdk/index.js.map +1 -0
  142. package/lib/generate-ruby-sdk/request.rb.template.d.ts +1 -0
  143. package/lib/generate-ruby-sdk/request.rb.template.js +2 -0
  144. package/lib/generate-ruby-sdk/request.rb.template.js.map +1 -0
  145. package/lib/generate-ruby-sdk/ruby-client.d.ts +35 -0
  146. package/lib/generate-ruby-sdk/ruby-client.js +59 -0
  147. package/lib/generate-ruby-sdk/ruby-client.js.map +1 -0
  148. package/lib/generate-ruby-sdk/templates/base_client.rb.template.d.ts +2 -0
  149. package/lib/generate-ruby-sdk/templates/base_client.rb.template.js +22 -0
  150. package/lib/generate-ruby-sdk/templates/base_client.rb.template.js.map +1 -0
  151. package/lib/generate-ruby-sdk/templates/base_resource.rb.template.d.ts +2 -0
  152. package/lib/generate-ruby-sdk/templates/base_resource.rb.template.js +59 -0
  153. package/lib/generate-ruby-sdk/templates/base_resource.rb.template.js.map +1 -0
  154. package/lib/generate-ruby-sdk/templates/client.rb.template.d.ts +2 -0
  155. package/lib/generate-ruby-sdk/templates/client.rb.template.js +74 -0
  156. package/lib/generate-ruby-sdk/templates/client.rb.template.js.map +1 -0
  157. package/lib/generate-ruby-sdk/templates/gemfile.template.d.ts +2 -0
  158. package/lib/generate-ruby-sdk/templates/gemfile.template.js +7 -0
  159. package/lib/generate-ruby-sdk/templates/gemfile.template.js.map +1 -0
  160. package/lib/generate-ruby-sdk/templates/logger.rb.template.d.ts +2 -0
  161. package/lib/generate-ruby-sdk/templates/logger.rb.template.js +13 -0
  162. package/lib/generate-ruby-sdk/templates/logger.rb.template.js.map +1 -0
  163. package/lib/generate-ruby-sdk/templates/rakefile.template.d.ts +2 -0
  164. package/lib/generate-ruby-sdk/templates/rakefile.template.js +23 -0
  165. package/lib/generate-ruby-sdk/templates/rakefile.template.js.map +1 -0
  166. package/lib/generate-ruby-sdk/templates/readme.md.template.d.ts +2 -0
  167. package/lib/generate-ruby-sdk/templates/readme.md.template.js +184 -0
  168. package/lib/generate-ruby-sdk/templates/readme.md.template.js.map +1 -0
  169. package/lib/generate-ruby-sdk/templates/request.rb.template.d.ts +2 -0
  170. package/lib/generate-ruby-sdk/templates/request.rb.template.js +71 -0
  171. package/lib/generate-ruby-sdk/templates/request.rb.template.js.map +1 -0
  172. package/lib/generate-ruby-sdk/templates/resource_error.rb.template.d.ts +2 -0
  173. package/lib/generate-ruby-sdk/templates/resource_error.rb.template.js +8 -0
  174. package/lib/generate-ruby-sdk/templates/resource_error.rb.template.js.map +1 -0
  175. package/lib/generate-ruby-sdk/templates/resource_errors_support.rb.template.d.ts +2 -0
  176. package/lib/generate-ruby-sdk/templates/resource_errors_support.rb.template.js +10 -0
  177. package/lib/generate-ruby-sdk/templates/resource_errors_support.rb.template.js.map +1 -0
  178. package/lib/generate-ruby-sdk/templates/resource_warning.rb.template.d.ts +2 -0
  179. package/lib/generate-ruby-sdk/templates/resource_warning.rb.template.js +8 -0
  180. package/lib/generate-ruby-sdk/templates/resource_warning.rb.template.js.map +1 -0
  181. package/lib/generate-ruby-sdk/templates/resource_warnings_support.rb.template.d.ts +2 -0
  182. package/lib/generate-ruby-sdk/templates/resource_warnings_support.rb.template.js +10 -0
  183. package/lib/generate-ruby-sdk/templates/resource_warnings_support.rb.template.js.map +1 -0
  184. package/lib/generate-ruby-sdk/templates/seamapi.gemspec.template.d.ts +2 -0
  185. package/lib/generate-ruby-sdk/templates/seamapi.gemspec.template.js +41 -0
  186. package/lib/generate-ruby-sdk/templates/seamapi.gemspec.template.js.map +1 -0
  187. package/lib/generate-ruby-sdk/templates/snippets/resource.rb.template.d.ts +6 -0
  188. package/lib/generate-ruby-sdk/templates/snippets/resource.rb.template.js +15 -0
  189. package/lib/generate-ruby-sdk/templates/snippets/resource.rb.template.js.map +1 -0
  190. package/lib/generate-ruby-sdk/templates/version.rb.template.d.ts +2 -0
  191. package/lib/generate-ruby-sdk/templates/version.rb.template.js +6 -0
  192. package/lib/generate-ruby-sdk/templates/version.rb.template.js.map +1 -0
  193. package/lib/index.d.ts +2 -0
  194. package/lib/index.js +3 -0
  195. package/lib/index.js.map +1 -0
  196. package/lib/openapi/flatten-obj-schema.d.ts +5 -0
  197. package/lib/openapi/flatten-obj-schema.js +86 -0
  198. package/lib/openapi/flatten-obj-schema.js.map +1 -0
  199. package/lib/openapi/get-parameter-and-response-schema.d.ts +20 -0
  200. package/lib/openapi/get-parameter-and-response-schema.js +42 -0
  201. package/lib/openapi/get-parameter-and-response-schema.js.map +1 -0
  202. package/lib/openapi/index.d.ts +2 -0
  203. package/lib/openapi/index.js +3 -0
  204. package/lib/openapi/index.js.map +1 -0
  205. package/lib/types.d.ts +91 -0
  206. package/lib/types.js +2 -0
  207. package/lib/types.js.map +1 -0
  208. package/package.json +95 -0
  209. package/src/index.ts +6 -0
  210. package/src/lib/cli.ts +71 -0
  211. package/src/lib/fs-util/index.ts +2 -0
  212. package/src/lib/fs-util/populate-fs.ts +14 -0
  213. package/src/lib/fs-util/write-fs.ts +10 -0
  214. package/src/lib/generate-csharp-sdk/codegen.ts +648 -0
  215. package/src/lib/generate-csharp-sdk/constants.ts +1 -0
  216. package/src/lib/generate-csharp-sdk/generate-csharp-sdk.ts +126 -0
  217. package/src/lib/generate-csharp-sdk/generate-csproj.ts +45 -0
  218. package/src/lib/generate-csharp-sdk/templates/dataclass.ts +973 -0
  219. package/src/lib/generate-csharp-sdk/templates/fs/csharp-testing.sln +34 -0
  220. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ApiResponse.cs +159 -0
  221. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ClientUtils.cs +280 -0
  222. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ExceptionFactory.cs +12 -0
  223. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/GlobalSeamRequestConfiguration.cs +60 -0
  224. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/HttpMethod.cs +29 -0
  225. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/IAsynchronousSeam.cs +142 -0
  226. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/IReadableSeamRequestConfiguration.cs +68 -0
  227. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/ISynchronousSeam.cs +103 -0
  228. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/Multimap.cs +286 -0
  229. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/RequestOptions.cs +74 -0
  230. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/RetryConfiguration.cs +21 -0
  231. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/Seam.cs +1070 -0
  232. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/SeamException.cs +64 -0
  233. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Client/SeamRequestConfiguration.cs +662 -0
  234. package/src/lib/generate-csharp-sdk/templates/fs/src/Seam/Model/AsbtractModelSchema.cs +62 -0
  235. package/src/lib/generate-php-sdk/generate-php-sdk.ts +176 -0
  236. package/src/lib/generate-php-sdk/index.ts +1 -0
  237. package/src/lib/generate-php-sdk/templates/composer.json.template.ts +24 -0
  238. package/src/lib/generate-php-sdk/templates/env.example.template.ts +3 -0
  239. package/src/lib/generate-php-sdk/templates/gitignore.template.ts +5 -0
  240. package/src/lib/generate-php-sdk/templates/package.json.template.ts +11 -0
  241. package/src/lib/generate-php-sdk/templates/readme.md.template.ts +85 -0
  242. package/src/lib/generate-php-sdk/templates/smoke-test.template.ts +29 -0
  243. package/src/lib/generate-php-sdk/templates/test-fixture.template.ts +20 -0
  244. package/src/lib/generate-php-sdk/utils/deep-extract-resource-object-schemas.ts +160 -0
  245. package/src/lib/generate-php-sdk/utils/deep-flatten-one-of-and-all-of-schema.ts +128 -0
  246. package/src/lib/generate-php-sdk/utils/generate-resource-object-class.ts +105 -0
  247. package/src/lib/generate-php-sdk/utils/generate-seam-client.ts +115 -0
  248. package/src/lib/generate-php-sdk/utils/get-php-type.ts +21 -0
  249. package/src/lib/generate-php-sdk/utils/php-client.ts +189 -0
  250. package/src/lib/generate-python-sdk/class-file.ts +114 -0
  251. package/src/lib/generate-python-sdk/generate-python-sdk.ts +147 -0
  252. package/src/lib/generate-python-sdk/index.ts +1 -0
  253. package/src/lib/generate-python-sdk/map-python-type.ts +29 -0
  254. package/src/lib/generate-python-sdk/templates/conftest.py.template.ts +11 -0
  255. package/src/lib/generate-python-sdk/templates/pyproject.toml.template.ts +20 -0
  256. package/src/lib/generate-python-sdk/templates/readme.md.template.ts +47 -0
  257. package/src/lib/generate-python-sdk/templates/routes.py.template.ts +13 -0
  258. package/src/lib/generate-python-sdk/templates/seam.py.template.ts +73 -0
  259. package/src/lib/generate-python-sdk/templates/snippets/abstract-routes.template.ts +9 -0
  260. package/src/lib/generate-python-sdk/templates/snippets/abstract-seam.template.ts +8 -0
  261. package/src/lib/generate-python-sdk/templates/snippets/resource-dataclass.template.ts +15 -0
  262. package/src/lib/generate-python-sdk/templates/test_smoke.py.template.ts +12 -0
  263. package/src/lib/generate-python-sdk/templates/utils/deep_attr_dict.py.template.ts +27 -0
  264. package/src/lib/generate-ruby-sdk/generate-ruby-sdk.ts +153 -0
  265. package/src/lib/generate-ruby-sdk/index.ts +1 -0
  266. package/src/lib/generate-ruby-sdk/request.rb.template.ts +0 -0
  267. package/src/lib/generate-ruby-sdk/ruby-client.ts +81 -0
  268. package/src/lib/generate-ruby-sdk/templates/base_client.rb.template.ts +21 -0
  269. package/src/lib/generate-ruby-sdk/templates/base_resource.rb.template.ts +58 -0
  270. package/src/lib/generate-ruby-sdk/templates/client.rb.template.ts +73 -0
  271. package/src/lib/generate-ruby-sdk/templates/gemfile.template.ts +6 -0
  272. package/src/lib/generate-ruby-sdk/templates/logger.rb.template.ts +12 -0
  273. package/src/lib/generate-ruby-sdk/templates/rakefile.template.ts +22 -0
  274. package/src/lib/generate-ruby-sdk/templates/readme.md.template.ts +183 -0
  275. package/src/lib/generate-ruby-sdk/templates/request.rb.template.ts +70 -0
  276. package/src/lib/generate-ruby-sdk/templates/resource_error.rb.template.ts +7 -0
  277. package/src/lib/generate-ruby-sdk/templates/resource_errors_support.rb.template.ts +9 -0
  278. package/src/lib/generate-ruby-sdk/templates/resource_warning.rb.template.ts +7 -0
  279. package/src/lib/generate-ruby-sdk/templates/resource_warnings_support.rb.template.ts +9 -0
  280. package/src/lib/generate-ruby-sdk/templates/seamapi.gemspec.template.ts +40 -0
  281. package/src/lib/generate-ruby-sdk/templates/snippets/resource.rb.template.ts +24 -0
  282. package/src/lib/generate-ruby-sdk/templates/version.rb.template.ts +5 -0
  283. package/src/lib/index.ts +2 -0
  284. package/src/lib/openapi/flatten-obj-schema.ts +124 -0
  285. package/src/lib/openapi/get-parameter-and-response-schema.ts +59 -0
  286. package/src/lib/openapi/index.ts +2 -0
  287. package/src/lib/types.ts +96 -0
@@ -0,0 +1,147 @@
1
+ import axios from "axios"
2
+ import type { ObjSchema, OpenAPISchema, Route } from "lib/types.js"
3
+ import { ClassFile } from "./class-file.js"
4
+ import { pascalCase } from "change-case"
5
+ import { flattenObjSchema } from "lib/openapi/index.js"
6
+ import conftestPyTemplate from "./templates/conftest.py.template.js"
7
+ import routesPyTemplate from "./templates/routes.py.template.js"
8
+ import seamPyTemplate from "./templates/seam.py.template.js"
9
+ import test_smokePyTemplate from "./templates/test_smoke.py.template.js"
10
+ import pyprojectTomlTemplate from "./templates/pyproject.toml.template.js"
11
+ import { mapPythonType } from "./map-python-type.js"
12
+ import deep_attr_dictPyTemplate from "./templates/utils/deep_attr_dict.py.template.js"
13
+ import abstractRoutesTemplate from "./templates/snippets/abstract-routes.template.js"
14
+ import abstractSeamTemplate from "./templates/snippets/abstract-seam.template.js"
15
+ import resourceDataclassTemplate from "./templates/snippets/resource-dataclass.template.js"
16
+ import readmeMdTemplate from "./templates/readme.md.template.js"
17
+ import { getParameterAndResponseSchema } from "lib/openapi/get-parameter-and-response-schema.js"
18
+
19
+ export const generatePythonSDK = async () => {
20
+ const openapi: OpenAPISchema = await axios
21
+ .get("https://connect.getseam.com/openapi.json")
22
+ .then((res) => res.data)
23
+ const routes: Route[] = Object.entries(openapi.paths).map(([path, v]) => ({
24
+ path,
25
+ ...v,
26
+ }))
27
+
28
+ const fs: any = {}
29
+
30
+ fs["README.md"] = readmeMdTemplate()
31
+
32
+ const class_map: Record<string, ClassFile> = {}
33
+
34
+ const namespaces: string[][] = []
35
+
36
+ for (const route of routes) {
37
+ if (!route.post) continue
38
+ if (!route.post["x-fern-sdk-group-name"]) continue
39
+ const group_names = [...route.post["x-fern-sdk-group-name"]]
40
+ const namespace = group_names.join("_")
41
+ group_names.reverse()
42
+ const class_name = pascalCase(group_names.join("_"))
43
+ if (!class_map[class_name]) {
44
+ namespaces.push(route.post["x-fern-sdk-group-name"])
45
+ class_map[class_name] = new ClassFile(class_name, namespace)
46
+ }
47
+ const cls = class_map[class_name]
48
+
49
+ if (!cls) {
50
+ console.warn(`No class for "${route.path}", skipping`)
51
+ continue
52
+ }
53
+
54
+ const { parameter_schema, response_obj_type, response_arr_type } =
55
+ getParameterAndResponseSchema(route)
56
+
57
+ if (!response_obj_type && !response_arr_type) {
58
+ console.warn(`No response object/array ref for "${route.path}", skipping`)
59
+ continue
60
+ }
61
+
62
+ if (!parameter_schema) {
63
+ console.warn(`No parameter schema for "${route.path}", skipping`)
64
+ continue
65
+ }
66
+
67
+ cls.addMethod({
68
+ method_name: route.post["x-fern-sdk-method-name"],
69
+ path: route.path,
70
+ parameters: Object.entries(parameter_schema.properties)
71
+ .filter(
72
+ ([_, param_val]) =>
73
+ param_val && typeof param_val === "object" && "type" in param_val
74
+ )
75
+ .map(([param_name, param_val]: any) => ({
76
+ name: param_name,
77
+ type: mapPythonType(param_val.type),
78
+ position:
79
+ route.post["x-fern-sdk-method-name"] === "get" &&
80
+ param_name === `${route.post["x-fern-sdk-return-value"]}_id`
81
+ ? 0
82
+ : undefined,
83
+ })),
84
+ return_path: [route.post["x-fern-sdk-return-value"]],
85
+ return_resource: response_obj_type
86
+ ? pascalCase(response_obj_type)
87
+ : `List[${pascalCase(response_arr_type)}]`,
88
+ })
89
+ }
90
+
91
+ const top_level_namespaces = namespaces
92
+ .map((ns) => (ns.length === 1 ? ns[0] : null))
93
+ .filter<string>(Boolean as any)
94
+
95
+ for (const [_, cls] of Object.entries(class_map)) {
96
+ fs[`seamapi/${cls.namespace}.py`] = cls.serializeToClass()
97
+ }
98
+
99
+ fs[`seamapi/types.py`] = [
100
+ `from typing import Any, Dict, List, Optional, Union`,
101
+ `import abc`,
102
+ `from dataclasses import dataclass`,
103
+ `from seamapi.utils.deep_attr_dict import DeepAttrDict`,
104
+ "",
105
+ "",
106
+ ...Object.entries(openapi.components.schemas)
107
+ .map(
108
+ ([schema_name, schema]) =>
109
+ [schema_name, flattenObjSchema(schema as any)] as [string, ObjSchema]
110
+ )
111
+ .map(([schema_name, schema]) =>
112
+ resourceDataclassTemplate(
113
+ pascalCase(schema_name),
114
+ Object.entries(schema.properties).map(([name, property_schema]) => ({
115
+ name,
116
+ type: mapPythonType(property_schema as any),
117
+ }))
118
+ )
119
+ ),
120
+ "",
121
+ "",
122
+ `class SeamAPIException(Exception):`,
123
+ ` pass`,
124
+ "",
125
+ "",
126
+ ...Object.entries(class_map).map(([_, cls]) =>
127
+ cls.serializeToAbstractClassWithoutImports()
128
+ ),
129
+ "",
130
+ "",
131
+ abstractRoutesTemplate(top_level_namespaces),
132
+ "",
133
+ abstractSeamTemplate(),
134
+ ].join("\n")
135
+
136
+ fs["seamapi/__init__.py"] = `from seamapi.seam import Seam`
137
+ fs["seamapi/routes.py"] = routesPyTemplate(top_level_namespaces)
138
+ fs["seamapi/seam.py"] = seamPyTemplate()
139
+ fs["seamapi/utils/deep_attr_dict.py"] = deep_attr_dictPyTemplate()
140
+ fs["pyproject.toml"] = pyprojectTomlTemplate()
141
+
142
+ fs["tests/conftest.py"] = conftestPyTemplate()
143
+ fs["tests/test_smoke.py"] = test_smokePyTemplate()
144
+ fs["tests/__init__.py"] = ""
145
+
146
+ return fs
147
+ }
@@ -0,0 +1 @@
1
+ export * from "./generate-python-sdk.js"
@@ -0,0 +1,29 @@
1
+ import type { PropertySchema } from "lib/types.js"
2
+
3
+ // TODO literals?
4
+ export const mapPythonType = (property_schema: PropertySchema) => {
5
+ if (typeof property_schema !== "object") {
6
+ return "Any"
7
+ }
8
+
9
+ if ("type" in property_schema && property_schema.type === "string") {
10
+ // TODO handle format="date-time"
11
+ // if (property_schema.enum)
12
+ // return `Union[${property_schema.enum
13
+ // .map((v) => `Literal["${v}"]`)
14
+ // .join(",")}]`
15
+ return "str"
16
+ }
17
+ if ("type" in property_schema && property_schema.type === "integer")
18
+ return "int"
19
+ if ("type" in property_schema && property_schema.type === "boolean")
20
+ return "bool"
21
+ if ("type" in property_schema && property_schema.type === "number")
22
+ return "float"
23
+ if ("type" in property_schema && property_schema.type === "array")
24
+ return "List[Any]" // TODO, make more specific
25
+ if ("type" in property_schema && property_schema.type === "object")
26
+ return "Dict[str, Any]" // TODO, make more specific
27
+
28
+ return "Any"
29
+ }
@@ -0,0 +1,11 @@
1
+ export default () => `import pytest
2
+ import random
3
+ import string
4
+ from seamapi import Seam
5
+
6
+
7
+ @pytest.fixture(scope="function")
8
+ def seam():
9
+ r = ''.join(random.choices(string.ascii_uppercase + string.digits, k=10))
10
+ seam = Seam(api_url=f"https://{r}.fakeseamconnect.seam.vc", api_key="seam_apikey1_token")
11
+ yield seam`
@@ -0,0 +1,20 @@
1
+ export default () => `[tool.poetry]
2
+ name = "seamapi"
3
+ version = "2.14.0"
4
+ description = "A Python Library for Seam's API https://getseam.com"
5
+ authors = ["Severin Ibarluzea <seveibar@gmail.com>"]
6
+ license = "MIT"
7
+
8
+ [tool.poetry.dependencies]
9
+ python = "^3.7"
10
+ requests = "^2.26.0"
11
+
12
+ [tool.poetry.dev-dependencies]
13
+ pytest = "^6.2.5"
14
+ python-dotenv = "^0.19.2"
15
+ black = "^21.12b0"
16
+ responses = "^0.22.0"
17
+
18
+ [build-system]
19
+ requires = ["poetry-core>=1.0.0"]
20
+ build-backend = "poetry.core.masonry.api"`
@@ -0,0 +1,47 @@
1
+ export default () => `# Seam for Python
2
+
3
+ Control locks, lights and other internet of things devices with Seam's simple API. Check out the [documentation](https://docs.getseam.com) or [some examples](examples)
4
+
5
+ ## Setup
6
+
7
+ \`\`\`bash
8
+ pip install seamapi
9
+ \`\`\`
10
+
11
+ ## Usage
12
+
13
+ \`\`\`python
14
+ from seamapi import Seam
15
+
16
+ # export SEAM_API_KEY=***
17
+ seam = Seam()
18
+
19
+ some_lock = seam.locks.get(
20
+ name="Front Door"
21
+ )
22
+
23
+ seam.locks.lock_door(some_lock)
24
+ \`\`\`
25
+
26
+ ## Development
27
+
28
+ This project uses [poetry](https://github.com/python-poetry/poetry)
29
+
30
+ - To setup the project and install dependencies run \`poetry install\`
31
+ - To run tests, run \`poetry run pytest -s\`
32
+ - To build the project for publishing, run \`poetry build\`
33
+
34
+ Commits to \`main\` following [Conventional Commits](https://www.conventionalcommits.org/en/v1.0.0/) will automatically be published to PyPI.
35
+
36
+ Our tests use a seam sandbox environment given by the environment
37
+ variables \`SEAM_SANDBOX_API_KEY\`. If you want to run the tests, you should
38
+ first create a sandbox workspace [on your Developer Console](https://console.getseam.com)
39
+ then create a sandbox workspace.
40
+
41
+ > NOTE: For installation on m1 mac, you may need to export the following lines
42
+ > prior to \`poetry install\`...
43
+ >
44
+ > \`export CPPFLAGS="-I/opt/homebrew/opt/openssl@1.1/include"\`
45
+ >
46
+ > \`export LDFLAGS="-L/opt/homebrew/opt/openssl@1.1/lib -L\${HOME}/.pyenv/versions/3.8.10/lib"\`
47
+ `
@@ -0,0 +1,13 @@
1
+ import { pascalCase } from "change-case"
2
+ export default (namespaces: string[]) =>
3
+ [
4
+ `from .types import AbstractRoutes`,
5
+ ...namespaces.map((ns) => `from .${ns} import ${pascalCase(ns)}`),
6
+ ``,
7
+ `class Routes(AbstractRoutes):`,
8
+ ` def __init__(self):`,
9
+ ...namespaces.map((ns) => ` self.${ns} = ${pascalCase(ns)}(seam=self)`),
10
+ ``,
11
+ ` def make_request(self):`,
12
+ ` raise NotImplementedError()`,
13
+ ].join("\n")
@@ -0,0 +1,73 @@
1
+ export default () => `import os
2
+
3
+ from .routes import Routes
4
+ import requests
5
+ from importlib.metadata import version
6
+ from typing import Optional, cast
7
+ from .types import AbstractSeam, SeamAPIException
8
+
9
+
10
+ class Seam(AbstractSeam):
11
+ api_key: str
12
+ api_url: str = "https://connect.getseam.com"
13
+
14
+ def __init__(
15
+ self,
16
+ api_key: Optional[str] = None,
17
+ api_url: Optional[str] = None,
18
+ should_report_exceptions: Optional[bool] = False,
19
+ ):
20
+ """
21
+ Parameters
22
+ ----------
23
+ api_key : str, optional
24
+ API key
25
+ api_url : str, optional
26
+ API url
27
+ """
28
+ Routes.__init__(self)
29
+
30
+ if api_key is None:
31
+ api_key = os.environ.get("SEAM_API_KEY", None)
32
+ if api_key is None:
33
+ raise Exception(
34
+ "SEAM_API_KEY not found in environment, and api_key not provided"
35
+ )
36
+ if api_url is None:
37
+ api_url = os.environ.get("SEAM_API_URL", self.api_url)
38
+ self.api_key = api_key
39
+ self.api_url = cast(str, api_url)
40
+
41
+ def make_request(self, method: str, path: str, **kwargs):
42
+ """
43
+ Makes a request to the API
44
+
45
+ Parameters
46
+ ----------
47
+ method : str
48
+ Request method
49
+ path : str
50
+ Request path
51
+ **kwargs
52
+ Keyword arguments passed to requests.request
53
+ """
54
+
55
+ url = self.api_url + path
56
+ headers = {
57
+ "Authorization": "Bearer " + self.api_key,
58
+ "Content-Type": "application/json",
59
+ "User-Agent": "Python SDK v" + version("seamapi") + " (https://github.com/seamapi/python)",
60
+ }
61
+ response = requests.request(method, url, headers=headers, **kwargs)
62
+
63
+ parsed_response = response.json()
64
+
65
+ if response.status_code != 200:
66
+ raise SeamAPIException(
67
+ response.status_code,
68
+ response.headers.get("seam-request-id", None),
69
+ parsed_response["error"],
70
+ )
71
+ ## TODO automatically paginate if kwargs["auto_paginate"] is True
72
+
73
+ return parsed_response`
@@ -0,0 +1,9 @@
1
+ import { pascalCase } from "change-case"
2
+
3
+ export default (namespaces: string[]) => `@dataclass
4
+ class AbstractRoutes(abc.ABC):
5
+ ${namespaces.map((ns) => ` ${ns}: Abstract${pascalCase(ns)}`).join("\n")}
6
+
7
+ @abc.abstractmethod
8
+ def make_request(self, method: str, path: str, **kwargs) -> Any:
9
+ raise NotImplementedError`
@@ -0,0 +1,8 @@
1
+ export default () => `@dataclass
2
+ class AbstractSeam(AbstractRoutes):
3
+ api_key: str
4
+ api_url: str
5
+
6
+ @abc.abstractmethod
7
+ def __init__(self, api_key: Optional[str] = None):
8
+ raise NotImplementedError`
@@ -0,0 +1,15 @@
1
+ export default (
2
+ name: string,
3
+ parameters: Array<{
4
+ name: string
5
+ type: string
6
+ }>
7
+ ) => `@dataclass
8
+ class ${name}:
9
+ ${parameters.map((p) => ` ${p.name}: ${p.type}`).join("\n")}
10
+
11
+ @staticmethod
12
+ def from_dict(d: Dict[str, Any]):
13
+ return ${name}(
14
+ ${parameters.map((p) => ` ${p.name}=d.get("${p.name}", None),`).join("\n")}
15
+ )`
@@ -0,0 +1,12 @@
1
+ export default () => `from seamapi import Seam
2
+
3
+
4
+ def test_get_devices(seam: Seam):
5
+ devices_response = seam.devices.list()
6
+ assert devices_response[0].device_id
7
+
8
+
9
+ def test_create_access_code(seam: Seam):
10
+ access_code = seam.access_codes.create(device_id="august_device_1", code="1234")
11
+ assert access_code.status == "setting"
12
+ assert access_code.code == "1234"`
@@ -0,0 +1,27 @@
1
+ export default () => `# https://stackoverflow.com/a/3031270/559475
2
+ class DeepAttrDict(dict):
3
+ MARKER = object()
4
+
5
+ def __init__(self, value=None):
6
+ if value is None:
7
+ pass
8
+ elif isinstance(value, dict):
9
+ for key in value:
10
+ self.__setitem__(key, value[key])
11
+ else:
12
+ raise TypeError("expected dict")
13
+
14
+ def __setitem__(self, key, value):
15
+ if isinstance(value, dict) and not isinstance(value, DeepAttrDict):
16
+ value = DeepAttrDict(value)
17
+ super(DeepAttrDict, self).__setitem__(key, value)
18
+
19
+ def __getitem__(self, key):
20
+ found = self.get(key, DeepAttrDict.MARKER)
21
+ if found is DeepAttrDict.MARKER:
22
+ found = DeepAttrDict()
23
+ super(DeepAttrDict, self).__setitem__(key, found)
24
+ return found
25
+
26
+ __setattr__, __getattr__ = __setitem__, __getitem__
27
+ `
@@ -0,0 +1,153 @@
1
+ import axios from "axios"
2
+ import { flattenObjSchema } from "lib/index.js"
3
+ import type { ObjSchema, OpenAPISchema, Route } from "lib/types.js"
4
+ import resourceRbTemplate from "./templates/snippets/resource.rb.template.js"
5
+ import { pascalCase } from "change-case"
6
+ import { RubyClient } from "./ruby-client.js"
7
+ import { getParameterAndResponseSchema } from "lib/openapi/get-parameter-and-response-schema.js"
8
+ import base_clientRbTemplate from "./templates/base_client.rb.template.js"
9
+ import readmeMdTemplate from "./templates/readme.md.template.js"
10
+ import rakefileTemplate from "./templates/rakefile.template.js"
11
+ import versionRbTemplate from "./templates/version.rb.template.js"
12
+ import requestRbTemplate from "./templates/request.rb.template.js"
13
+ import loggerRbTemplate from "./templates/logger.rb.template.js"
14
+ import clientRbTemplate from "./templates/client.rb.template.js"
15
+ import gemfileTemplate from "./templates/gemfile.template.js"
16
+ import seamapiGemspecTemplate from "./templates/seamapi.gemspec.template.js"
17
+ import base_resourceRbTemplate from "./templates/base_resource.rb.template.js"
18
+ import resource_errorRbTemplate from "./templates/resource_error.rb.template.js"
19
+ import resource_warningRbTemplate from "./templates/resource_warning.rb.template.js"
20
+ import resource_errors_supportRbTemplate from "./templates/resource_errors_support.rb.template.js"
21
+ import resource_warnings_supportRbTemplate from "./templates/resource_warnings_support.rb.template.js"
22
+
23
+ export const generateRubySDK = async () => {
24
+ const openapi: OpenAPISchema = await axios
25
+ .get("https://connect.getseam.com/openapi.json")
26
+ .then((res) => res.data)
27
+ const routes: Route[] = Object.entries(openapi.paths).map(([path, v]) => ({
28
+ path,
29
+ ...v,
30
+ }))
31
+
32
+ const fs: any = {}
33
+
34
+ fs["README.md"] = readmeMdTemplate()
35
+ fs["Rakefile"] = rakefileTemplate()
36
+ fs["spec/spec_helper.rb"] = ""
37
+ fs["spec/smoketest.rb"] = ""
38
+ fs["Gemfile"] = gemfileTemplate()
39
+ fs["seamapi.gemspec"] = seamapiGemspecTemplate()
40
+ fs["lib/seam/version.rb"] = versionRbTemplate()
41
+ fs["lib/seam/request.rb"] = requestRbTemplate()
42
+ fs["lib/seam/logger.rb"] = loggerRbTemplate()
43
+ fs["lib/seam/client.rb"] = clientRbTemplate()
44
+ fs["lib/seam/clients/base_client.rb"] = base_clientRbTemplate()
45
+ fs["lib/seam/resources/base_resource.rb"] = base_resourceRbTemplate()
46
+ fs["lib/seam/resources/resource_error.rb"] = resource_errorRbTemplate()
47
+ fs["lib/seam/resources/resource_warning.rb"] = resource_warningRbTemplate()
48
+ fs["lib/seam/resources/resource_errors_support.rb"] =
49
+ resource_errors_supportRbTemplate()
50
+ fs["lib/seam/resources/resource_warnings_support.rb"] =
51
+ resource_warnings_supportRbTemplate()
52
+
53
+ const seamapi_rb_requires = [
54
+ "seam/version",
55
+ "seam/request",
56
+ "seam/logger",
57
+ "seam/client",
58
+ "seam/clients/base_client",
59
+ "seam/resources/base_resource",
60
+ "seam/resources/resource_error",
61
+ "seam/resources/resource_warning",
62
+ "seam/resources/resource_errors_support",
63
+ "seam/resources/resource_warnings_support",
64
+ ]
65
+
66
+ const resources = Object.entries(openapi.components.schemas).map(
67
+ ([schema_name, schema]) =>
68
+ [schema_name, flattenObjSchema(schema as any)] as [string, ObjSchema]
69
+ )
70
+ for (const [snake_name, schema] of resources) {
71
+ const params = Object.entries(schema.properties).map(
72
+ ([name, property_schema]) => ({
73
+ name,
74
+ is_date_time:
75
+ "format" in property_schema && property_schema.format === "date-time",
76
+ })
77
+ )
78
+
79
+ fs[`lib/seam/resources/${snake_name}.rb`] = resourceRbTemplate({
80
+ pascal_name: pascalCase(snake_name),
81
+ attrs: params.filter((p) => !p.is_date_time).map((p) => p.name),
82
+ date_attrs: params.filter((p) => p.is_date_time).map((p) => p.name),
83
+ })
84
+ seamapi_rb_requires.push(`seam/resources/${snake_name}`)
85
+ }
86
+
87
+ const clients: Record<string, RubyClient> = {}
88
+ for (const route of routes) {
89
+ if (!route.post) continue
90
+ if (!route.post["x-fern-sdk-group-name"]) continue
91
+ const group_names = [...route.post["x-fern-sdk-group-name"]]
92
+ const namespace = group_names.join("_")
93
+ group_names.reverse()
94
+ const class_name = pascalCase(group_names.join("_"))
95
+ if (!clients[class_name]) {
96
+ // namespaces.push(route.post["x-fern-sdk-group-name"])
97
+ clients[class_name] = new RubyClient(class_name, namespace)
98
+ }
99
+ const client = clients[class_name]
100
+
101
+ if (!client) {
102
+ console.warn(`No client for "${class_name}", skipping`)
103
+ continue
104
+ }
105
+
106
+ const { parameter_schema, response_obj_type, response_arr_type } =
107
+ getParameterAndResponseSchema(route)
108
+
109
+ if (!parameter_schema) {
110
+ console.warn(`No parameter schema for "${route.path}", skipping`)
111
+ continue
112
+ }
113
+
114
+ if (!response_obj_type && !response_arr_type) {
115
+ console.warn(`No response object/array ref for "${route.path}", skipping`)
116
+ continue
117
+ }
118
+
119
+ client.addMethod({
120
+ method_name: route.post["x-fern-sdk-method-name"],
121
+ path: route.path,
122
+ parameters: Object.entries(parameter_schema.properties)
123
+ .filter(([_, param_val]) => "type" in param_val)
124
+ .map(([param_name, _]: any) => ({
125
+ name: param_name,
126
+ required: parameter_schema.required?.includes(param_name),
127
+ position:
128
+ route.post["x-fern-sdk-method-name"] === "get" &&
129
+ param_name === `${route.post["x-fern-sdk-return-value"]}_id`
130
+ ? 0
131
+ : undefined,
132
+ })),
133
+ return_path: route.post["x-fern-sdk-return-value"],
134
+ return_resource: pascalCase(response_obj_type ?? response_arr_type),
135
+ })
136
+ }
137
+
138
+ for (const client of Object.values(clients)) {
139
+ fs[`lib/seam/clients/${client.snake_name}.rb`] = client.serialize()
140
+ seamapi_rb_requires.push(`seam/clients/${client.snake_name}`)
141
+ }
142
+
143
+ fs["lib/seamapi.rb"] = [
144
+ `# frozen_string_literal: true`,
145
+ "",
146
+ ...seamapi_rb_requires.map((r) => `require_relative "${r}"`),
147
+ "",
148
+ `module Seam`,
149
+ `end`,
150
+ ].join("\n")
151
+
152
+ return fs
153
+ }
@@ -0,0 +1 @@
1
+ export * from "./generate-ruby-sdk.js"
@@ -0,0 +1,81 @@
1
+ export type RubyClientMethodParameter = {
2
+ name: string
3
+ required?: boolean | undefined
4
+ position?: number | undefined
5
+ }
6
+
7
+ export type RubyClientMethod = {
8
+ method_name: string
9
+ path: string
10
+ parameters: RubyClientMethodParameter[]
11
+ return_resource: string
12
+ return_path: string
13
+ }
14
+
15
+ export class RubyClient {
16
+ methods: RubyClientMethod[] = []
17
+
18
+ constructor(
19
+ public pascal_name: string,
20
+ public snake_name: string
21
+ ) {
22
+ this.methods = []
23
+ }
24
+
25
+ addMethod(method: RubyClientMethod) {
26
+ this.methods.push(method)
27
+ }
28
+
29
+ /**
30
+ * Example:
31
+ *
32
+ * ```
33
+ * def create(device_id: nil, name: nil, code: nil, starts_at: nil, ends_at: nil)
34
+ * request_seam_object(
35
+ * :post,
36
+ * "/access_codes/create",
37
+ * Seam::AccessCode,
38
+ * "action_attempt",
39
+ * body: {device_id: device_id, code: code, starts_at: starts_at, ends_at: ends_at, name: name}.compact
40
+ * )
41
+ * end
42
+ * ```
43
+ */
44
+ serialize() {
45
+ return [
46
+ `module Seam`,
47
+ ` module Clients`,
48
+ ` class ${this.pascal_name} < BaseClient`,
49
+ ...this.methods.map(
50
+ ({ method_name, path, parameters, return_resource, return_path }) => {
51
+ return [
52
+ " ",
53
+ `def ${method_name}(${parameters
54
+ .sort(
55
+ (a, b) =>
56
+ (a.position ?? a.required ? 1000 : 9999) -
57
+ (b.position ?? b.required ? 1000 : 9999)
58
+ )
59
+ .map((p) => `${p.name}${p.required ? "" : ": nil"}`)
60
+ .join(", ")})`,
61
+ ` request_seam_object(`,
62
+ ` :post,`,
63
+ ` "${path}",`,
64
+ ` ${return_resource},`,
65
+ ` '${return_path}',`,
66
+ ` body: {${parameters
67
+ .map((p) => `${p.name}: ${p.name}`)
68
+ .join(", ")}}.compact`,
69
+ ` )`,
70
+ `end`,
71
+ ]
72
+ .map((s) => ` ${s}`)
73
+ .join("\n")
74
+ }
75
+ ),
76
+ ` end`,
77
+ ` end`,
78
+ `end`,
79
+ ].join("\n")
80
+ }
81
+ }