envless-sdk 0.0.1

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 (91) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +24 -0
  3. data/README.md +171 -0
  4. data/lib/envless/sdk/api_error.rb +54 -0
  5. data/lib/envless/sdk/bodies.rb +49 -0
  6. data/lib/envless/sdk/client.rb +39 -0
  7. data/lib/envless/sdk/clock.rb +24 -0
  8. data/lib/envless/sdk/connection_pool.rb +83 -0
  9. data/lib/envless/sdk/connector.rb +26 -0
  10. data/lib/envless/sdk/constants.rb +262 -0
  11. data/lib/envless/sdk/crypto/cipher.rb +58 -0
  12. data/lib/envless/sdk/crypto/codec.rb +23 -0
  13. data/lib/envless/sdk/crypto/envelope.rb +41 -0
  14. data/lib/envless/sdk/crypto/keys.rb +42 -0
  15. data/lib/envless/sdk/crypto/passphrase.rb +38 -0
  16. data/lib/envless/sdk/crypto/passphrase_rules.rb +42 -0
  17. data/lib/envless/sdk/crypto/values.rb +31 -0
  18. data/lib/envless/sdk/crypto/workspace_key.rb +40 -0
  19. data/lib/envless/sdk/crypto_messages.rb +31 -0
  20. data/lib/envless/sdk/default_client.rb +55 -0
  21. data/lib/envless/sdk/defaults.rb +32 -0
  22. data/lib/envless/sdk/envelope.rb +48 -0
  23. data/lib/envless/sdk/environment.rb +42 -0
  24. data/lib/envless/sdk/errors.rb +23 -0
  25. data/lib/envless/sdk/exchange.rb +27 -0
  26. data/lib/envless/sdk/helpers.rb +49 -0
  27. data/lib/envless/sdk/http.rb +46 -0
  28. data/lib/envless/sdk/listing.rb +54 -0
  29. data/lib/envless/sdk/messages.rb +43 -0
  30. data/lib/envless/sdk/net_http_adapter.rb +84 -0
  31. data/lib/envless/sdk/numbers.rb +44 -0
  32. data/lib/envless/sdk/options.rb +56 -0
  33. data/lib/envless/sdk/pagination.rb +31 -0
  34. data/lib/envless/sdk/paths.rb +70 -0
  35. data/lib/envless/sdk/received.rb +28 -0
  36. data/lib/envless/sdk/redirects.rb +56 -0
  37. data/lib/envless/sdk/resource.rb +50 -0
  38. data/lib/envless/sdk/resources/environments.rb +61 -0
  39. data/lib/envless/sdk/resources/invites.rb +28 -0
  40. data/lib/envless/sdk/resources/keys.rb +36 -0
  41. data/lib/envless/sdk/resources/me.rb +11 -0
  42. data/lib/envless/sdk/resources/members.rb +36 -0
  43. data/lib/envless/sdk/resources/product_access.rb +30 -0
  44. data/lib/envless/sdk/resources/products.rb +62 -0
  45. data/lib/envless/sdk/resources/projects.rb +42 -0
  46. data/lib/envless/sdk/resources/roles.rb +40 -0
  47. data/lib/envless/sdk/resources/variable_changes.rb +57 -0
  48. data/lib/envless/sdk/resources/variables.rb +49 -0
  49. data/lib/envless/sdk/resources/versions.rb +60 -0
  50. data/lib/envless/sdk/resources/webhook_deliveries.rb +33 -0
  51. data/lib/envless/sdk/resources/webhooks.rb +44 -0
  52. data/lib/envless/sdk/resources/workspace.rb +26 -0
  53. data/lib/envless/sdk/resources/workspace_domain.rb +31 -0
  54. data/lib/envless/sdk/resources/workspaces.rb +24 -0
  55. data/lib/envless/sdk/results.rb +43 -0
  56. data/lib/envless/sdk/retry_policy.rb +36 -0
  57. data/lib/envless/sdk/rotation/entry_rotator.rb +61 -0
  58. data/lib/envless/sdk/rotation/key_ring.rb +34 -0
  59. data/lib/envless/sdk/rotation/ledger.rb +36 -0
  60. data/lib/envless/sdk/rotation/runner.rb +45 -0
  61. data/lib/envless/sdk/rotation/variable_rotator.rb +38 -0
  62. data/lib/envless/sdk/text.rb +71 -0
  63. data/lib/envless/sdk/transport.rb +62 -0
  64. data/lib/envless/sdk/update_notice.rb +66 -0
  65. data/lib/envless/sdk/urls.rb +70 -0
  66. data/lib/envless/sdk/variable_names.rb +55 -0
  67. data/lib/envless/sdk/version.rb +5 -0
  68. data/lib/envless/sdk/webhooks/headers.rb +49 -0
  69. data/lib/envless/sdk/webhooks/verify.rb +58 -0
  70. data/lib/envless/sdk/wire.rb +77 -0
  71. data/lib/envless/sdk.rb +77 -0
  72. data/sig/envless/sdk/adapter.rbs +60 -0
  73. data/sig/envless/sdk/client.rbs +31 -0
  74. data/sig/envless/sdk/crypto.rbs +92 -0
  75. data/sig/envless/sdk/errors.rbs +37 -0
  76. data/sig/envless/sdk/http.rbs +31 -0
  77. data/sig/envless/sdk/pagination.rbs +81 -0
  78. data/sig/envless/sdk/results.rbs +62 -0
  79. data/sig/envless/sdk/rotation.rbs +86 -0
  80. data/sig/envless/sdk/settings.rbs +81 -0
  81. data/sig/envless/sdk/stdlib.rbs +8 -0
  82. data/sig/envless/sdk/text.rbs +52 -0
  83. data/sig/envless/sdk/transport.rbs +79 -0
  84. data/sig/envless/sdk/urls.rbs +73 -0
  85. data/sig/envless/sdk/webhooks.rbs +23 -0
  86. data/sig/envless/sdk.rbs +36 -0
  87. data/sig/generated/constants.rbs +57 -0
  88. data/sig/generated/resources.rbs +209 -0
  89. data/sig/generated/types.rbs +466 -0
  90. data/sig/manifest.yaml +3 -0
  91. metadata +134 -0
@@ -0,0 +1,81 @@
1
+ module Envless
2
+ class Listing < Data
3
+ KEYS: untyped
4
+ MAX_LIMIT: Integer
5
+
6
+ attr_reader limit: Integer?
7
+ attr_reader offset: Integer?
8
+ type text = (String | Symbol)?
9
+
10
+ attr_reader search: text
11
+ attr_reader order: text
12
+ attr_reader product: text
13
+ attr_reader status: text
14
+
15
+ def self.new: (Integer? limit, Integer? offset, text search, text order, text product, text status) -> Listing
16
+ | (limit: Integer?, offset: Integer?, search: text, order: text, product: text, status: text) -> Listing
17
+
18
+ def self.of: (?limit: untyped, ?offset: untyped, ?search: text, ?order: text, ?product: text, ?status: text) -> Listing
19
+ def with: (?limit: Integer?, ?offset: Integer?, ?search: text, ?order: text, ?product: text, ?status: text) -> Listing
20
+ def query: () -> Hash[String, untyped]
21
+ def walk: () -> Listing
22
+ def advance: (Integer count) -> Listing
23
+ end
24
+
25
+ module Pages
26
+ def self?.page_of: (untyped payload, String collection) -> Page[untyped]
27
+ def self?.field: (untyped payload, Symbol key) -> untyped
28
+ def self?.access_page_of: (untyped payload, String collection) -> ProductAccessPage
29
+ def self?.more?: (Page[untyped] page) -> bool
30
+ end
31
+
32
+ module Pagination
33
+ def self?.fetch_page: (Transport transport, String path, String collection, Listing listing, seconds? timeout) -> Page[untyped]
34
+ def self?.iterate: (Transport transport, String path, String collection, Listing listing, seconds? timeout) -> Enumerator[untyped, nil]
35
+ def self?.collect_all: (Transport transport, String path, String collection, Listing listing, seconds? timeout) -> Array[untyped]
36
+ end
37
+
38
+ module Bodies
39
+ def self?.merge: (untyped body, Hash[untyped, untyped] fields) -> Hash[String, untyped]
40
+ def self?.hash_of: (untyped body) -> Hash[untyped, untyped]
41
+ def self?.mapping: (untyped value) -> Hash[untyped, untyped]?
42
+ def self?.entries: (untyped values, String name) -> Array[untyped]
43
+ def self?.list: (untyped values, String name) -> Array[untyped]
44
+ def self?.field: (untyped hash, String key) -> untyped
45
+ def self?.field?: (untyped hash, String key) -> bool
46
+ end
47
+
48
+ module VariableNames
49
+ LIMITS: { MIN: Integer, MAX: Integer }
50
+ ERRORS: { REQUIRED: String, TOO_LONG: String, SHAPE: String }
51
+ REFUSAL: { STATUS: Integer, VARIABLE_RESOURCE: String, NAME_FIELD: String }
52
+
53
+ def self?.validation: (untyped name) -> Validation
54
+ def self?.refused: (String error) -> Validation
55
+ def self?.assert: (untyped name) -> void
56
+ def self?.received: (untyped name) -> String
57
+ def self?.assert_input: (untyped body) -> void
58
+ def self?.assert_patch: (untyped patch) -> void
59
+ def self?.assert_inputs: (Array[untyped] items) -> void
60
+ def self?.assert_changes: (untyped changes) -> void
61
+ end
62
+
63
+ class Resource
64
+ include Constants
65
+
66
+ @transport: Transport
67
+
68
+ def initialize: (Transport transport) -> void
69
+ def inspect: () -> String
70
+
71
+ private
72
+
73
+ def request: (String path, ?method: String, ?query: Hash[String, untyped]?, ?body: untyped, ?timeout: seconds?) -> untyped
74
+ def scoped: ((String | Symbol)? product) -> Hash[String, untyped]
75
+ def page: (String path, String collection, Listing listing, seconds? timeout) -> Page[untyped]
76
+ def all: (String path, String collection, Listing listing, seconds? timeout) -> Array[untyped]
77
+ def each_item: (String path, String collection, Listing listing, seconds? timeout) ?{ (untyped) -> void } -> Enumerator[untyped, nil]?
78
+ def body_of: (untyped body, Hash[untyped, untyped] fields) -> Hash[String, untyped]
79
+ def list_of: (untyped values, String name) -> Array[untyped]
80
+ end
81
+ end
@@ -0,0 +1,62 @@
1
+ module Envless
2
+ class Page[T] < Data
3
+ attr_reader items: Array[T]
4
+ attr_reader pagination: pagination_envelope
5
+
6
+ def self.new: [T] (Array[T] items, pagination_envelope pagination) -> Page[T]
7
+ | [T] (items: Array[T], pagination: pagination_envelope) -> Page[T]
8
+
9
+ def has_more?: () -> bool
10
+ def total_count: () -> Integer?
11
+ end
12
+
13
+ class ProductAccessPage < Data
14
+ attr_reader items: Array[product_access_entry]
15
+ attr_reader pagination: pagination_envelope
16
+ attr_reader is_private: bool
17
+
18
+ def self.new: (Array[product_access_entry] items, pagination_envelope pagination, bool is_private) -> ProductAccessPage
19
+ | (items: Array[product_access_entry], pagination: pagination_envelope, is_private: bool) -> ProductAccessPage
20
+
21
+ def private?: () -> bool
22
+ def has_more?: () -> bool
23
+ def total_count: () -> Integer?
24
+ end
25
+
26
+ class Validation < Data
27
+ attr_reader valid: bool
28
+ attr_reader error: String?
29
+
30
+ def self.new: (bool valid, String? error) -> Validation
31
+ | (valid: bool, error: String?) -> Validation
32
+
33
+ def valid?: () -> bool
34
+ end
35
+
36
+ class RotationIssue < Data
37
+ attr_reader scope: String
38
+ attr_reader id: String
39
+ attr_reader field: String?
40
+ attr_reader reason: String
41
+
42
+ def self.new: (String scope, String id, String? field, String reason) -> RotationIssue
43
+ | (scope: String, id: String, field: String?, reason: String) -> RotationIssue
44
+ end
45
+
46
+ class RotationResult < Data
47
+ attr_reader variables: Integer
48
+ attr_reader version_entries: Integer
49
+ attr_reader skipped: Array[RotationIssue]
50
+ attr_reader failures: Array[RotationIssue]
51
+
52
+ def self.new: (Integer variables, Integer version_entries, Array[RotationIssue] skipped, Array[RotationIssue] failures) -> RotationResult
53
+ | (variables: Integer, version_entries: Integer, skipped: Array[RotationIssue], failures: Array[RotationIssue]) -> RotationResult
54
+ end
55
+
56
+ class Reply < Data
57
+ attr_reader data: untyped
58
+
59
+ def self.new: (untyped data) -> Reply
60
+ | (data: untyped) -> Reply
61
+ end
62
+ end
@@ -0,0 +1,86 @@
1
+ module Envless
2
+ module Rotation
3
+ class KeyRing
4
+ @workspace: String
5
+ @current: String
6
+ @following: String
7
+ @opening: Hash[Integer?, WorkspaceKey]
8
+ @sealing: WorkspaceKey?
9
+
10
+ def initialize: (String workspace_unique_id, String current, String following) -> void
11
+ def rotate: (String value) -> String
12
+
13
+ private
14
+
15
+ def opening_key: (Integer? iterations) -> WorkspaceKey
16
+ def sealing_key: () -> WorkspaceKey
17
+ end
18
+
19
+ class Ledger
20
+ @skipped: Array[RotationIssue]
21
+ @failures: Array[RotationIssue]
22
+
23
+ def initialize: () -> void
24
+ def rotatable?: (String scope, String id, String field, untyped value) -> bool
25
+ def stranded: (String scope, String id, String field) -> void
26
+ def failed: (String scope, String id, Exception error) -> void
27
+ def result: (Integer variables, Integer version_entries) -> RotationResult
28
+ def self.identifier: (untyped item) -> String
29
+ end
30
+
31
+ class VariableRotator
32
+ SCOPE: String
33
+ FIELDS: Array[String]
34
+
35
+ @client: Client
36
+ @ring: KeyRing
37
+ @ledger: Ledger
38
+ @product: String?
39
+
40
+ def initialize: (Client client, KeyRing ring, Ledger ledger, String? product) -> void
41
+ def rotate: (untyped variable) -> Integer
42
+
43
+ private
44
+
45
+ def rotated: (untyped variable) -> Integer
46
+ end
47
+
48
+ class EntryRotator
49
+ SCOPE: String
50
+ FIELDS: untyped
51
+
52
+ @client: Client
53
+ @ring: KeyRing
54
+ @ledger: Ledger
55
+ @scope: [String, String]
56
+ @product: String?
57
+
58
+ def initialize: (Client client, KeyRing ring, Ledger ledger, [String, String] scope, String? product) -> void
59
+ def rotate: (Array[untyped] batch) -> Integer
60
+
61
+ private
62
+
63
+ def attempt: (untyped entry) -> reencrypt_entry_input?
64
+ def write: (Array[reencrypt_entry_input] rewritten) -> Integer
65
+ def rotated: (untyped entry) -> reencrypt_entry_input?
66
+ def strand: (untyped entry, String id) -> nil
67
+ end
68
+
69
+ class Runner
70
+ @client: Client
71
+ @following: String
72
+ @scope: [String, String]
73
+ @product: String?
74
+ @ledger: Ledger
75
+ @variables: VariableRotator
76
+ @entries: EntryRotator
77
+
78
+ def initialize: (client: Client, workspace_unique_id: String, from: String, to: String, project: String, environment: String, ?product: String?) -> void
79
+ def run: () -> RotationResult
80
+
81
+ private
82
+
83
+ def totals: (Array[untyped] variables, Array[Array[untyped]] batches) -> [Integer, Integer]
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,81 @@
1
+ module Envless
2
+ module Defaults
3
+ BASE_URL: String
4
+ MAX_RETRIES: Integer
5
+ TIMEOUT: Integer
6
+ USER_AGENT: String
7
+ KEEP_ALIVE_TIMEOUT: Integer
8
+ MAX_IDLE_CONNECTIONS: Integer
9
+ MAX_REDIRECTS: Integer
10
+ MAX_TIMEOUT: Integer
11
+ DEADLINE_GRACE: Float
12
+ MESSAGE_LIMIT: Integer
13
+ REQUEST_ID_HEADER: String
14
+ LOCATION_HEADER: String
15
+ REDACTED: String
16
+ UPDATE_NOTICE_ENV_DISABLE: String
17
+ UPDATE_NOTICE_TIMEOUT: Integer
18
+ UPDATE_NOTICE_PACKAGE: String
19
+ UPDATE_NOTICE_HOST: String
20
+ UPDATE_NOTICE_PATH: String
21
+ UPDATE_NOTICE_COMMAND: String
22
+ UPDATE_NOTICE_CHANGELOG_URL: String
23
+ UPDATE_NOTICE_ICON: String
24
+ NAMESPACES: Array[Symbol]
25
+ end
26
+
27
+ module Messages
28
+ TOKEN_REQUIRED: String
29
+ TOKEN_TWICE: String
30
+ TOKEN_SHAPE: String
31
+ TOKEN_CHARACTERS: String
32
+ USER_AGENT_SHAPE: String
33
+ BASE_URL_SHAPE: String
34
+ BASE_URL_USERINFO: String
35
+ PATH_SHAPE: String
36
+ SEGMENT_SHAPE: String
37
+ EMPTY_SEGMENT: String
38
+ DOT_SEGMENT: String
39
+ TIMEOUT_SHAPE: String
40
+ RETRIES_SHAPE: String
41
+ PAGING_SHAPE: String
42
+ ADAPTER_SHAPE: String
43
+ METHOD_SHAPE: String
44
+ QUERY_SHAPE: String
45
+ BODY_SHAPE: String
46
+ LIST_SHAPE: String
47
+ JSON_SHAPE: String
48
+ JSON_KEY_SHAPE: String
49
+ JSON_DEPTH: String
50
+ NOT_FINITE: String
51
+ TIMED_OUT: String
52
+ UNREACHABLE: String
53
+ TOO_MANY_REDIRECTS: String
54
+ REDIRECT_SCHEME: String
55
+ NO_RESPONSE: String
56
+ REQUEST_FAILED: String
57
+ HTTP_STATUS: String
58
+ UPDATE_AVAILABLE: String
59
+ end
60
+
61
+ module CryptoMessages
62
+ PASSPHRASE_REQUIRED: String
63
+ WORKSPACE_REQUIRED: String
64
+ PINNED_COST: String
65
+ TOO_SHORT: String
66
+ UNDECRYPTABLE: String
67
+ KEY_LENGTH: String
68
+ KEY_SHAPE: String
69
+ TEXT_SHAPE: String
70
+ UTF8_SHAPE: String
71
+ WEAK_ROTATION: String
72
+ WEBHOOK_MISSING_HEADERS: String
73
+ WEBHOOK_TIMESTAMP_SHAPE: String
74
+ WEBHOOK_OUT_OF_TOLERANCE: String
75
+ WEBHOOK_MISSING_SECRET: String
76
+ WEBHOOK_MISMATCH: String
77
+ WEBHOOK_NOT_JSON: String
78
+ WEBHOOK_PAYLOAD_SHAPE: String
79
+ WEBHOOK_TOLERANCE_SHAPE: String
80
+ end
81
+ end
@@ -0,0 +1,8 @@
1
+ class Net::HTTP
2
+ attr_accessor ignore_eof: bool
3
+
4
+ def open_timeout=: (Float | Integer | nil) -> (Float | Integer | nil) | ...
5
+ def read_timeout=: (Float | Integer | nil) -> (Float | Integer | nil) | ...
6
+ def write_timeout=: (Float | Integer | nil) -> (Float | Integer | nil) | ...
7
+ def request: (Net::HTTPGenericRequest req, ?String? body) ?{ (Net::HTTPResponse response) -> void } -> Net::HTTPResponse | ...
8
+ end
@@ -0,0 +1,52 @@
1
+ module Envless
2
+ module Text
3
+ BYTE_ORDER_MARK: String
4
+ HTTP_WHITESPACE: String
5
+ JS_WHITESPACE: String
6
+ JS_TRIM: Regexp
7
+ HTTP_TRIM: Regexp
8
+ TOKEN: Regexp
9
+ HEADER_VALUE: Regexp
10
+ TRANSCODABLE: Array[Encoding]
11
+
12
+ def self?.utf8: (String text) -> String
13
+ def self?.strict: (untyped text, String name) -> String
14
+ def self?.decode: (String bytes) -> String
15
+ def self?.js_trim: (String text) -> String
16
+ def self?.http_trim: (String text) -> String
17
+ def self?.token?: (String text) -> bool
18
+ def self?.header_value?: (String text) -> bool
19
+ def self?.utf16_units: (String text) -> Array[Integer]
20
+ def self?.utf16_length: (String text) -> Integer
21
+ end
22
+
23
+ module Numbers
24
+ DECIMAL: Regexp
25
+ INFINITY: Regexp
26
+ RADIX_DIGITS: Regexp
27
+ RADIXES: Hash[String, Integer]
28
+
29
+ def self?.js_number: (String text) -> Float
30
+ def self?.radix: (String trimmed) -> Float
31
+ def self?.whole: (Integer | Float value) -> (Integer | Float)
32
+ def self?.text: (Integer | Float | Rational value) -> String
33
+ end
34
+
35
+ module Wire
36
+ LONE_SURROGATE: Regexp
37
+ SURROGATE_ESCAPE: Regexp
38
+ REPLACEMENT_ESCAPE: String
39
+ ISO_INSTANT: String
40
+ MAX_DEPTH: Integer
41
+
42
+ def self?.encode: (untyped value) -> String
43
+ def self?.ready: (untyped value, ?Integer depth) -> untyped
44
+ def self?.key_text: (untyped key) -> String
45
+ def self?.finite: (Float value) -> Float
46
+ def self?.instant: (untyped value) -> String?
47
+ def self?.structure: (untyped value) -> Hash[untyped, untyped]
48
+ def self?.decode: (String text) -> untyped
49
+ def self?.without_lone_surrogates: (String text) -> String
50
+ def self?.truthy?: (untyped value) -> bool
51
+ end
52
+ end
@@ -0,0 +1,79 @@
1
+ module Envless
2
+ module Envelope
3
+ type envelope = Hash[Symbol, untyped]
4
+
5
+ def self?.read: (Integer status, String reason, String content) -> envelope
6
+ def self?.fallback: (Integer status, String message) -> envelope
7
+ def self?.success?: (Integer status, envelope envelope) -> bool
8
+ def self?.api_error: (Integer status, Hash[String, String] headers, envelope envelope, Float retry_after) -> ApiError
9
+ def self?.mapping: (untyped value) -> Hash[Symbol, untyped]
10
+ def self?.text: (untyped value) -> String?
11
+ end
12
+
13
+ module RetryPolicy
14
+ MILLISECONDS: Float
15
+
16
+ def self?.retry_after_of: (String? header) -> Float
17
+ def self?.delay: (Integer status, String verb, Integer attempt, Integer max_retries, Float retry_after) -> Float?
18
+ def self?.settle: (String verb, Integer attempt, Integer max_retries, HttpResponse response) -> (Reply | Float)
19
+ end
20
+
21
+ module Redirects
22
+ STATUSES: Array[Integer]
23
+ SAFE_METHODS: Array[String]
24
+ BODY_HEADERS: Array[String]
25
+ UNSAFE: Regexp
26
+
27
+ def self?.follow: (_Adapter adapter, HttpRequest request, Float? deadline) -> HttpResponse
28
+ def self?.following: (HttpRequest request, Integer status, String location) -> HttpRequest
29
+ def self?.target_of: (String base, String location) -> String
30
+ def self?.rewritten: (HttpRequest request, Integer status) -> [String, String?, Hash[String, String]]
31
+ def self?.same_origin?: (String left, String right) -> bool
32
+ end
33
+
34
+ module Exchange
35
+ PROGRAMMING_ERRORS: Array[singleton(Exception)]
36
+
37
+ def self?.call: (_Adapter adapter, HttpRequest request, seconds seconds, String base_url) -> HttpResponse
38
+ def self?.reason_of: (Exception error) -> String
39
+ end
40
+
41
+ class Transport
42
+ @token: String
43
+ @base_url: String
44
+ @max_retries: Integer
45
+ @timeout: seconds
46
+ @user_agent: String
47
+ @owned: NetHttpAdapter?
48
+ @adapter: _Adapter
49
+
50
+ attr_reader base_url: String
51
+ attr_reader max_retries: Integer
52
+ attr_reader timeout: seconds
53
+ attr_reader user_agent: String
54
+
55
+ def initialize: (token: String, base_url: String, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> void
56
+ def request: (String path, ?method: String | Symbol, ?query: Hash[String | Symbol, untyped]?, ?body: untyped, ?timeout: seconds?) -> untyped
57
+ def close: () -> nil
58
+ def inspect: () -> String
59
+
60
+ private
61
+
62
+ def headers: (bool with_body) -> Hash[String, String]
63
+ def pause: (Float seconds) -> void
64
+ end
65
+
66
+ module UpdateNotice
67
+ self.@checked: bool
68
+ self.@lock: Thread::Mutex
69
+
70
+ def self.check: () -> nil
71
+ def self.claim: () -> bool
72
+ def self.disabled?: () -> bool
73
+ def self.announce: () -> void
74
+ def self.latest_version: () -> String?
75
+ def self.newer?: (String candidate, String current) -> bool
76
+ def self.parts: (String value) -> Array[Integer]?
77
+ def self.notice: (String latest) -> String
78
+ end
79
+ end
@@ -0,0 +1,73 @@
1
+ module Envless
2
+ module Urls
3
+ SCHEMES: Array[String]
4
+ TRAILING_SLASHES: Regexp
5
+
6
+ def self?.valid_base_url: (untyped value) -> String
7
+ def self?.usable?: (URI::Generic? uri) -> bool
8
+ def self?.parse: (String text) -> URI::Generic?
9
+ def self?.api_url: (String base_url, untyped path) -> String
10
+ def self?.build_url: (String base_url, String path, ?Hash[String | Symbol, untyped]? query) -> String
11
+ def self?.query_value: (untyped value) -> String
12
+ def self?.form: (String text) -> String
13
+ def self?.origin: (String url) -> [String, String, Integer?]
14
+ end
15
+
16
+ module Paths
17
+ UNSAFE: Regexp
18
+ DOTS: Regexp
19
+ PATHS: untyped
20
+ SEGMENTS: untyped
21
+
22
+ type segment = String | Symbol | Integer
23
+
24
+ def self?.segment: (untyped value) -> String
25
+ def self?.segment_text: (untyped value) -> String
26
+ def self?.product_path: (segment slug) -> String
27
+ def self?.product_projects_path: (segment slug) -> String
28
+ def self?.product_access_path: (segment slug) -> String
29
+ def self?.product_access_member_path: (segment slug, segment member_id) -> String
30
+ def self?.project_path: (segment slug) -> String
31
+ def self?.environments_path: (segment project) -> String
32
+ def self?.environment_path: (segment project, segment environment) -> String
33
+ def self?.variables_path: (segment project, segment environment) -> String
34
+ def self?.variable_path: (segment project, segment environment, segment name) -> String
35
+ def self?.history_path: (segment project, segment environment, segment name) -> String
36
+ def self?.versions_path: (segment project, segment environment) -> String
37
+ def self?.entries_path: (segment project, segment environment) -> String
38
+ def self?.variable_by_id_path: (segment id) -> String
39
+ def self?.version_by_id_path: (segment id) -> String
40
+ def self?.member_path: (segment id) -> String
41
+ def self?.invite_path: (segment id) -> String
42
+ def self?.role_path: (segment id) -> String
43
+ def self?.key_path: (segment id) -> String
44
+ def self?.webhook_path: (segment id) -> String
45
+ def self?.deliveries_path: (segment id) -> String
46
+ def self?.delivery_path: (segment id, segment delivery_id) -> String
47
+ end
48
+
49
+ module Environment
50
+ def self?.from_environment: (String name) -> String?
51
+ def self?.normalise_endpoint: (String? value) -> String?
52
+ def self?.resolve_token: (untyped token) -> String
53
+ def self?.resolve_base_url: (untyped base_url) -> String
54
+ end
55
+
56
+ module Options
57
+ VERB: Regexp
58
+
59
+ def self?.valid_timeout: (untyped value) -> seconds
60
+ def self?.deadline_of: (seconds seconds) -> seconds?
61
+ def self?.valid_retries: (untyped value) -> Integer
62
+ def self?.user_agent: (untyped value) -> String
63
+ def self?.adapter: (untyped value) -> _Adapter
64
+ def self?.verb: (untyped method) -> String
65
+ def self?.paging: (untyped value, String name) -> Integer?
66
+ end
67
+
68
+ module Clock
69
+ def self?.now: () -> Float
70
+ def self?.deadline: (seconds? seconds) -> Float?
71
+ def self?.remaining: (Float? deadline) -> Float?
72
+ end
73
+ end
@@ -0,0 +1,23 @@
1
+ module Envless
2
+ module Webhooks
3
+ module Headers
4
+ SEPARATOR: Regexp
5
+
6
+ def self?.read: (untyped headers, String name) -> String
7
+ def self?.scan: (untyped headers, String name) -> untyped
8
+ def self?.lookup: (untyped headers, String name) -> untyped
9
+ def self?.candidates: (String provided) -> Array[String]
10
+ def self?.same?: (String expected, String candidate) -> bool
11
+ end
12
+
13
+ module Verify
14
+ HEADERS: untyped
15
+ MESSAGES: singleton(CryptoMessages)
16
+
17
+ def self?.call: (payload: untyped, headers: untyped, secret: untyped, ?tolerance_seconds: untyped) -> untyped
18
+ def self?.tolerance_of: (untyped value) -> seconds
19
+ def self?.fresh!: (String timestamp, seconds tolerance) -> void
20
+ def self?.parsed: (String body) -> untyped
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,36 @@
1
+ module Envless
2
+ VERSION: String
3
+
4
+ self.@default_client: Client?
5
+ self.@default_lock: Thread::Mutex
6
+
7
+ def self.new: (?String? token_argument, ?token: String?, ?base_url: (String | URI::Generic)?, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> Client
8
+ def self.create_client: (?String? token_argument, ?token: String?, ?base_url: (String | URI::Generic)?, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> Client
9
+ def self.init: (?String? token_argument, ?token: String?, ?base_url: (String | URI::Generic)?, ?adapter: _Adapter?, ?max_retries: Integer?, ?timeout: seconds?, ?user_agent: String?, ?disable_update_notice: bool) -> Client
10
+ def self.client: () -> Client
11
+ def self.reset_client: () -> nil
12
+
13
+ def self.encrypt_value: (String plaintext, String passphrase, String workspace_unique_id) -> String
14
+ def self.decrypt_value: (String ciphertext, String passphrase, String workspace_unique_id) -> String
15
+ def self.encrypt_with_key: (WorkspaceKey | String key, String plaintext) -> String
16
+ def self.decrypt_with_key: (WorkspaceKey | String key, String ciphertext) -> String
17
+ def self.derive_workspace_key: (String passphrase, String workspace_unique_id) -> WorkspaceKey
18
+ def self.import_workspace_key: (String key) -> WorkspaceKey
19
+ def self.ciphertext?: (untyped value) -> bool
20
+ def self.passphrase_strength: (untyped passphrase) -> Validation
21
+ def self.variable_name_validation: (untyped name) -> Validation
22
+ def self.verify_webhook_signature: (payload: String, headers: untyped, secret: String, ?tolerance_seconds: seconds?) -> webhook_event[Hash[Symbol, untyped]]
23
+ def self.rotate_workspace_passphrase: (client: Client, workspace_unique_id: String, from: String, to: String, project: String, environment: String, ?product: String?) -> RotationResult
24
+
25
+ type seconds = Integer | Float | Rational
26
+
27
+ interface _Adapter
28
+ def call: (HttpRequest request) -> _Response
29
+ end
30
+
31
+ interface _Response
32
+ def status: () -> (Integer | String)
33
+ def headers: () -> Hash[untyped, untyped]?
34
+ def body: () -> String?
35
+ end
36
+ end
@@ -0,0 +1,57 @@
1
+ module Envless
2
+ module Constants
3
+ CIPHERTEXT_MESSAGES: { UNSUPPORTED: String }
4
+ CIPHERTEXT_PREFIXES: Array[String]
5
+ COLLECTIONS: { ACCESS: String, EVENTS: String, WORKSPACES: String, PRODUCTS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, HISTORY: String, VERSIONS: String, ENTRIES: String, MEMBERS: String, INVITES: String, ROLES: String, KEYS: String, WEBHOOKS: String, DELIVERIES: String }
6
+ CONTENT_TYPES: { JSON: String }
7
+ CRYPTO: { PBKDF2_ITERATIONS: Integer, PBKDF2_ITERATIONS_MIN: Integer, PBKDF2_ITERATIONS_MAX: Integer, HASH: String, AES_ALGORITHM: String, KDF_ALGORITHM: String, HMAC_ALGORITHM: String, AES_LENGTH: Integer, IV_LENGTH: Integer, SALT_LENGTH: Integer, WORKSPACE_SALT_NAMESPACE: String, CIPHERTEXT_VERSION_PREFIX: String, CIPHERTEXT_VERSION_PREFIX_V2: String }
8
+ EMPTY_PAGINATION: { limit: Integer, offset: Integer, totalCount: Integer, hasMore: bool }
9
+ ENCRYPTION_PARAMETERS: { pbkdf2Iterations: Integer, hash: String, aesAlgorithm: String, kdfAlgorithm: String, aesLength: Integer, ivLength: Integer, saltLength: Integer, saltNamespace: String, ciphertextVersionPrefix: String }
10
+ ENV_KEY_PATTERN: Regexp
11
+ ENV_VARS: { TOKEN: String, BASE_URL: String, PASSPHRASE: String }
12
+ ERROR_CODES: { BODY_INVALID: String, SERVER_ERROR: String }
13
+ HEADER_KEYS: { AUTHORIZATION: String, ACCEPT: String, CONTENT_TYPE: String, USER_AGENT: String, RETRY_AFTER: String }
14
+ HTTP_METHODS: { GET: String, POST: String, PUT: String, PATCH: String, DELETE: String }
15
+ INPUT_LIMITS: { VARIABLE_NAME: { MIN: Integer, MAX: Integer } }
16
+ KEY_SCOPE_LEVELS: { NONE: String, READ: String, WRITE: String }
17
+ KEY_SCOPE_RESOURCES: { WORKSPACE: String, PRODUCTS: String, PRODUCT_ACCESS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, VERSIONS: String, MEMBERS: String, ROLES: String, KEYS: String, WEBHOOKS: String }
18
+ LOCAL_REFUSAL: { STATUS: Integer, VARIABLE_RESOURCE: String, NAME_FIELD: String }
19
+ PAGINATION: { MAX_LIMIT: Integer, DEFAULT_LIMIT: Integer }
20
+ PASSPHRASE_CHARACTER_CLASSES: { LOWERCASE: Regexp, UPPERCASE: Regexp, DIGIT: Regexp, SYMBOL: Regexp }
21
+ PASSPHRASE_STRENGTH: { MIN_LENGTH: Integer, MIN_CHARACTER_CLASSES: Integer, LONG_LENGTH: Integer, LONG_MIN_CHARACTER_CLASSES: Integer, MAX_REPEATED_RUN: Integer, MAX_SEQUENTIAL_RUN: Integer, WEAK_FRAGMENT_COVERAGE: Float }
22
+ PASSPHRASE_STRENGTH_ERRORS: { REQUIRED: String, TOO_SHORT: String, LOW_VARIETY: String, REPEATED: String, SEQUENCE: String, COMMON: String }
23
+ PATHS: { ME: String, WORKSPACE: String, WORKSPACES: String, WORKSPACE_DOMAIN: String, WORKSPACE_DOMAIN_VERIFY: String, PRODUCTS: String, PERMISSIONS: String, ROLES: String, INVITES: String, MEMBERS: String, MEMBERS_ME: String, PROJECTS: String, VARIABLES: String, VERSIONS: String, KEYS: String, WEBHOOKS: String, WEBHOOK_EVENT_TYPES: String }
24
+ QUERY_KEYS: { LIMIT: String, OFFSET: String, SEARCH: String, ORDER: String, PRODUCT: String, STATUS: String }
25
+ REENCRYPT_BATCH_SIZE: Integer
26
+ RETRY: { STATUSES: Array[Integer], METHODS: Array[String], BASE_BACKOFF_MS: Integer, MAX_BACKOFF_MS: Integer }
27
+ ROTATION_FIELDS: { VALUE: String, DEFAULT_VALUE: String }
28
+ ROTATION_MESSAGES: { NOT_CIPHERTEXT: String, DEFAULT_STRANDED: String }
29
+ ROTATION_SCOPES: { VARIABLE: String, VERSION_ENTRY: String }
30
+ SEGMENTS: { ACCESS: String, APPLY: String, BULK: String, DELIVERIES: String, DUPLICATE: String, ENTRIES: String, ENVIRONMENTS: String, EXPOSE: String, HISTORY: String, PROJECTS: String, REDELIVER: String, REENCRYPT: String, RESEND: String, ROLLBACK: String, ROTATE: String, VARIABLES: String, VERSIONS: String }
31
+ VARIABLE_NAME_ERRORS: { REQUIRED: String, TOO_LONG: String, SHAPE: String }
32
+ VARIABLE_TYPES: { STRING: String, NUMBER: String, BOOLEAN: String }
33
+ VARIABLE_VISIBILITY: { SERVER: String, CLIENT: String }
34
+ WEAK_PASSPHRASE_FRAGMENTS: { PASSWORD: String, PASSPHRASE: String, QWERTY: String, ASDFGH: String, ZXCVBN: String, LETMEIN: String, CHANGEME: String, ILOVEYOU: String, TRUSTNO: String, ABC123: String, ENVLESS: String, SECRET123: String, ADMIN123: String, CORRECTHORSE: String }
35
+ WEBHOOK_HEADERS: { ID: String, TIMESTAMP: String, SIGNATURE: String, EVENT: String, DELIVERY: String }
36
+ WEBHOOK_SIGNATURE: { VERSION: String, SEPARATOR: String, TOLERANCE_SECONDS: Integer }
37
+ PAGE_LIMITS: { MAX_LIMIT: Integer, DEFAULT_LIMIT: Integer }
38
+ SCOPE_LEVELS: { NONE: String, READ: String, WRITE: String }
39
+ SCOPE_RESOURCES: { WORKSPACE: String, PRODUCTS: String, PRODUCT_ACCESS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, VERSIONS: String, MEMBERS: String, ROLES: String, KEYS: String, WEBHOOKS: String }
40
+ VARIABLE_TYPE: { STRING: String, NUMBER: String, BOOLEAN: String }
41
+ VARIABLE_VISIBILITY_LEVELS: { SERVER: String, CLIENT: String }
42
+ WEBHOOK_SIGNATURE_HEADERS: { ID: String, TIMESTAMP: String, SIGNATURE: String, EVENT: String, DELIVERY: String }
43
+ BASE64_NON_ALPHABET_PATTERN: Regexp
44
+ ENDPOINT_SCHEME_PATTERN: Regexp
45
+ LOCAL_HOSTS: Array[String]
46
+ RETRYABLE_METHODS: Set[String]
47
+ RETRYABLE_STATUSES: Set[Integer]
48
+ end
49
+
50
+ ENCRYPTION_PARAMETERS: { pbkdf2Iterations: Integer, hash: String, aesAlgorithm: String, kdfAlgorithm: String, aesLength: Integer, ivLength: Integer, saltLength: Integer, saltNamespace: String, ciphertextVersionPrefix: String }
51
+ PAGE_LIMITS: { MAX_LIMIT: Integer, DEFAULT_LIMIT: Integer }
52
+ SCOPE_LEVELS: { NONE: String, READ: String, WRITE: String }
53
+ SCOPE_RESOURCES: { WORKSPACE: String, PRODUCTS: String, PRODUCT_ACCESS: String, PROJECTS: String, ENVIRONMENTS: String, VARIABLES: String, VERSIONS: String, MEMBERS: String, ROLES: String, KEYS: String, WEBHOOKS: String }
54
+ VARIABLE_TYPE: { STRING: String, NUMBER: String, BOOLEAN: String }
55
+ VARIABLE_VISIBILITY_LEVELS: { SERVER: String, CLIENT: String }
56
+ WEBHOOK_SIGNATURE_HEADERS: { ID: String, TIMESTAMP: String, SIGNATURE: String, EVENT: String, DELIVERY: String }
57
+ end