haveapi 0.29.1 → 0.29.3
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.
- checksums.yaml +4 -4
- data/README.md +21 -0
- data/haveapi.gemspec +1 -1
- data/lib/haveapi/authentication/basic/provider.rb +1 -2
- data/lib/haveapi/authentication/chain.rb +1 -1
- data/lib/haveapi/authentication/oauth2/provider.rb +1 -17
- data/lib/haveapi/authentication/token/provider.rb +9 -1
- data/lib/haveapi/locales/cs.yml +100 -63
- data/lib/haveapi/locales/en.yml +103 -67
- data/lib/haveapi/parameters/metadata_i18n.rb +80 -3
- data/lib/haveapi/parameters/typed.rb +5 -1
- data/lib/haveapi/resources/action_state.rb +6 -4
- data/lib/haveapi/version.rb +1 -1
- data/spec/action/runtime_spec.rb +1 -1
- data/spec/action/validation_http_status_spec.rb +2 -2
- data/spec/action_state_spec.rb +4 -4
- data/spec/authentication/basic_spec.rb +3 -3
- data/spec/authentication/oauth2_spec.rb +3 -1
- data/spec/authentication/token_spec.rb +8 -0
- data/spec/extensions/exception_mailer_spec.rb +2 -2
- data/spec/i18n_spec.rb +88 -9
- data/spec/model_adapters/active_record_spec.rb +8 -8
- data/spec/params_spec.rb +18 -0
- data/spec/server/integration_spec.rb +5 -5
- metadata +3 -3
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 885ac3cc2e4b40ee6595f9beadad79e75f371d607dd0d49d02f67a01cece7d7f
|
|
4
|
+
data.tar.gz: 8c8b186ae1299655f952bedf5cd857042df97b060a0fda7e43ef6b9bc0ec6393
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 8b3cd3b9dabb84f88119dde487b150ea6694ab76450d24df1c8f7ff9309b5fcb91638d58f4794db0236de5d8a81c01693c3a5adfc9665200bdb24915599d131e
|
|
7
|
+
data.tar.gz: c738c43d4cc3437124e9af50cd1ae70c84d3f5a91cb93f4c6d1b0966257e011f438f8ecf36639ba0da5044b0b06aa5c8b6072dce4793d4546df424ebdc50a1a9
|
data/README.md
CHANGED
|
@@ -328,6 +328,27 @@ cs:
|
|
|
328
328
|
label: "Hostname"
|
|
329
329
|
```
|
|
330
330
|
|
|
331
|
+
Choice labels declared through the `choices`/`include` validator use the same
|
|
332
|
+
parameter metadata path with `choices.<value>.label` appended. If choices were
|
|
333
|
+
declared as a value-to-label map, the declared label is used as the English
|
|
334
|
+
fallback. If choices were declared as an array, untranslated self-description
|
|
335
|
+
keeps the array form; a locale that supplies labels is returned as the existing
|
|
336
|
+
HaveAPI `{value: label}` map form.
|
|
337
|
+
|
|
338
|
+
```yaml
|
|
339
|
+
cs:
|
|
340
|
+
my_api:
|
|
341
|
+
resources:
|
|
342
|
+
vps:
|
|
343
|
+
attributes:
|
|
344
|
+
state:
|
|
345
|
+
choices:
|
|
346
|
+
running:
|
|
347
|
+
label: "bezi"
|
|
348
|
+
stopped:
|
|
349
|
+
label: "vypnuto"
|
|
350
|
+
```
|
|
351
|
+
|
|
331
352
|
Metadata parameters fall back through resource and global metadata keys:
|
|
332
353
|
|
|
333
354
|
```yaml
|
data/haveapi.gemspec
CHANGED
|
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
|
|
|
15
15
|
s.required_ruby_version = ">= #{File.read('../../.ruby-version').strip}"
|
|
16
16
|
|
|
17
17
|
s.add_dependency 'activesupport', '>= 7.1'
|
|
18
|
-
s.add_dependency 'haveapi-client', '~> 0.29.
|
|
18
|
+
s.add_dependency 'haveapi-client', '~> 0.29.3'
|
|
19
19
|
s.add_dependency 'i18n', '>= 1.6', '< 2'
|
|
20
20
|
s.add_dependency 'json'
|
|
21
21
|
s.add_dependency 'mail'
|
|
@@ -38,8 +38,7 @@ module HaveAPI::Authentication
|
|
|
38
38
|
|
|
39
39
|
def describe
|
|
40
40
|
{
|
|
41
|
-
description: '
|
|
42
|
-
'via HTTP header. Its use is forbidden from web browsers.'
|
|
41
|
+
description: HaveAPI.message('haveapi.authentication.basic.description')
|
|
43
42
|
}
|
|
44
43
|
end
|
|
45
44
|
|
|
@@ -54,7 +54,7 @@ module HaveAPI::Authentication
|
|
|
54
54
|
return ret unless @instances[context.version]
|
|
55
55
|
|
|
56
56
|
@instances[context.version].each do |provider|
|
|
57
|
-
ret[provider.name] = provider.describe
|
|
57
|
+
ret[provider.name] = HaveAPI.localize(provider.describe)
|
|
58
58
|
|
|
59
59
|
next unless provider.resource_module
|
|
60
60
|
|
|
@@ -150,24 +150,8 @@ module HaveAPI::Authentication
|
|
|
150
150
|
end
|
|
151
151
|
|
|
152
152
|
def describe
|
|
153
|
-
desc = <<-END
|
|
154
|
-
OAuth2 authorization provider. While OAuth2 support in HaveAPI clients
|
|
155
|
-
is limited, it is possible to use your API as an authentication source
|
|
156
|
-
and to use OAuth2 tokens to access the API.
|
|
157
|
-
|
|
158
|
-
HaveAPI partially implements RFC 6749: authorization response type "code"
|
|
159
|
-
and token grant types "authorization_code" and "refresh_token". Other
|
|
160
|
-
response and grant types are not supported at this time.
|
|
161
|
-
|
|
162
|
-
The access token can be passed as bearer token according to RFC 6750,
|
|
163
|
-
or using a custom HTTP header when the Authorization header is not
|
|
164
|
-
practical.
|
|
165
|
-
|
|
166
|
-
The access and refresh tokens can be revoked as per RFC 7009.
|
|
167
|
-
END
|
|
168
|
-
|
|
169
153
|
{
|
|
170
|
-
description:
|
|
154
|
+
description: HaveAPI.message('haveapi.authentication.oauth2.description'),
|
|
171
155
|
http_header: config.http_header,
|
|
172
156
|
authorize_url: @authorize_url,
|
|
173
157
|
authorize_path: @authorize_path,
|
|
@@ -185,7 +185,7 @@ module HaveAPI::Authentication
|
|
|
185
185
|
{
|
|
186
186
|
http_header: config.class.http_header,
|
|
187
187
|
query_parameter: config.class.query_parameter,
|
|
188
|
-
description: '
|
|
188
|
+
description: HaveAPI.message('haveapi.authentication.token.description')
|
|
189
189
|
}
|
|
190
190
|
end
|
|
191
191
|
|
|
@@ -203,12 +203,16 @@ module HaveAPI::Authentication
|
|
|
203
203
|
provider = self
|
|
204
204
|
|
|
205
205
|
HaveAPI::Resource.define_resource(:Token) do
|
|
206
|
+
desc HaveAPI.message('haveapi.authentication.token.resource.description')
|
|
207
|
+
|
|
206
208
|
define_singleton_method(:token_instance) { provider }
|
|
207
209
|
|
|
208
210
|
auth false
|
|
209
211
|
version :all
|
|
210
212
|
|
|
211
213
|
define_action(:Request) do
|
|
214
|
+
desc HaveAPI.message('haveapi.authentication.token.actions.request.description')
|
|
215
|
+
|
|
212
216
|
route ''
|
|
213
217
|
http_method :post
|
|
214
218
|
|
|
@@ -275,6 +279,8 @@ module HaveAPI::Authentication
|
|
|
275
279
|
end
|
|
276
280
|
|
|
277
281
|
define_action(:Revoke) do
|
|
282
|
+
desc HaveAPI.message('haveapi.authentication.token.actions.revoke.description')
|
|
283
|
+
|
|
278
284
|
http_method :post
|
|
279
285
|
auth true
|
|
280
286
|
|
|
@@ -318,6 +324,8 @@ module HaveAPI::Authentication
|
|
|
318
324
|
end
|
|
319
325
|
|
|
320
326
|
define_action(:Renew) do
|
|
327
|
+
desc HaveAPI.message('haveapi.authentication.token.actions.renew.description')
|
|
328
|
+
|
|
321
329
|
http_method :post
|
|
322
330
|
auth true
|
|
323
331
|
|
data/lib/haveapi/locales/cs.yml
CHANGED
|
@@ -5,33 +5,57 @@
|
|
|
5
5
|
cs:
|
|
6
6
|
haveapi:
|
|
7
7
|
action_state:
|
|
8
|
-
cancellation_failed:
|
|
9
|
-
not_found:
|
|
10
|
-
timeout_max:
|
|
8
|
+
cancellation_failed: Zrušení akce se nezdařilo
|
|
9
|
+
not_found: Stav akce nebyl nalezen
|
|
10
|
+
timeout_max: Časový limit může být nejvýše %{max}
|
|
11
11
|
authentication:
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
basic:
|
|
13
|
+
description: |-
|
|
14
|
+
Autentizace pomocí HTTP Basic. Uživatelské jméno a heslo se předávají v HTTP hlavičce.
|
|
15
|
+
Tato metoda se nesmí používat z webových prohlížečů.
|
|
16
|
+
failed: Přihlášení se nezdařilo
|
|
17
|
+
invalid_credentials: Neplatné přihlašovací údaje
|
|
18
|
+
multiple_oauth2_tokens: Bylo zadáno více OAuth2 tokenů
|
|
19
|
+
multiple_tokens: Bylo zadáno více autentizačních tokenů
|
|
20
|
+
oauth2:
|
|
21
|
+
description: |-
|
|
22
|
+
OAuth2 autorizační provider.
|
|
23
|
+
Podpora OAuth2 v klientech HaveAPI je omezená, ale API lze použít jako zdroj autentizace a k přístupu k API lze používat OAuth2 tokeny. HaveAPI částečně implementuje RFC 6749: autorizační response type "code" a token grant types "authorization_code" a "refresh_token". Ostatní response a grant types momentálně nejsou podporovány. Přístupový token lze předat jako bearer token podle RFC 6750 nebo vlastní HTTP hlavičkou, pokud není praktické použít hlavičku Authorization.
|
|
24
|
+
Přístupové a refresh tokeny lze zneplatnit podle RFC 7009.
|
|
25
|
+
renew_failed: Obnovení tokenu se nezdařilo
|
|
26
|
+
required: Tato akce vyžaduje přihlášení
|
|
27
|
+
revoke_failed: Zneplatnění tokenu se nezdařilo
|
|
28
|
+
token:
|
|
29
|
+
actions:
|
|
30
|
+
renew:
|
|
31
|
+
description: Obnovit aktuální autentizační token
|
|
32
|
+
request:
|
|
33
|
+
description: Vyžádat autentizační token
|
|
34
|
+
revoke:
|
|
35
|
+
description: Zneplatnit aktuální autentizační token
|
|
36
|
+
description: Klient se autentizuje přihlašovacími údaji, obvykle uživatelským
|
|
37
|
+
jménem a heslem, a získá token. Od té chvíle už přihlašovací údaje nepotřebuje
|
|
38
|
+
a používá místo nich token. Tokeny mohou mít různou dobu platnosti a lze
|
|
39
|
+
je obnovovat nebo zneplatňovat. Token se předává buď v HTTP hlavičce, nebo
|
|
40
|
+
jako parametr dotazu.
|
|
41
|
+
resource:
|
|
42
|
+
description: Spravovat autentizační tokeny
|
|
43
|
+
token_required: Tato akce vyžaduje autentizaci tokenem
|
|
20
44
|
authorization:
|
|
21
45
|
insufficient_permissions: Přístup odepřen. Nedostatečná oprávnění.
|
|
22
46
|
errors:
|
|
23
47
|
action_not_found: Akce nebyla nalezena
|
|
24
|
-
bad_accept_header:
|
|
25
|
-
bad_json_syntax:
|
|
26
|
-
json_body_object: Tělo JSON musí být objekt
|
|
48
|
+
bad_accept_header: Neplatná hlavička Accept
|
|
49
|
+
bad_json_syntax: Neplatná syntaxe JSON
|
|
50
|
+
json_body_object: Tělo JSON požadavku musí být objekt
|
|
27
51
|
server_error: Došlo k chybě serveru
|
|
28
|
-
unsupported_content_type:
|
|
52
|
+
unsupported_content_type: Nepodporovaná hlavička Content-Type
|
|
29
53
|
pagination:
|
|
30
|
-
limit_max:
|
|
54
|
+
limit_max: Limit může být nejvýše %{max}
|
|
31
55
|
parameters:
|
|
32
56
|
action_state:
|
|
33
57
|
can_cancel:
|
|
34
|
-
description: Je-li true,
|
|
58
|
+
description: Je-li hodnota true, lze běh této akce zrušit
|
|
35
59
|
label: Lze zrušit
|
|
36
60
|
created_at:
|
|
37
61
|
label: Vytvořeno
|
|
@@ -43,98 +67,111 @@ cs:
|
|
|
43
67
|
label: Popisek
|
|
44
68
|
poll:
|
|
45
69
|
current:
|
|
46
|
-
description: průběh
|
|
70
|
+
description: Aktuální průběh pro porovnání, je-li nastaveno update_in
|
|
47
71
|
status:
|
|
48
|
-
description:
|
|
72
|
+
description: Stav pro porovnání, je-li nastaveno update_in
|
|
49
73
|
timeout:
|
|
50
|
-
description: v sekundách
|
|
74
|
+
description: Časový limit v sekundách
|
|
51
75
|
label: Časový limit
|
|
52
76
|
total:
|
|
53
|
-
description: průběh
|
|
77
|
+
description: Celkový průběh pro porovnání, je-li nastaveno update_in
|
|
54
78
|
update_in:
|
|
55
|
-
description:
|
|
56
|
-
|
|
79
|
+
description: Vrátit stav dříve, pokud se změní status, current nebo total;
|
|
80
|
+
hodnota se předává implementacím pollingu v API
|
|
81
|
+
label: Čekat na změnu
|
|
57
82
|
status:
|
|
58
|
-
description: Určuje, zda akce probíhá nebo
|
|
83
|
+
description: Určuje, zda akce probíhá úspěšně nebo selhala
|
|
59
84
|
label: Stav
|
|
60
85
|
total:
|
|
61
|
-
description: Akce je dokončena, když
|
|
86
|
+
description: Akce je dokončena, když aktuální průběh dosáhne celkového
|
|
62
87
|
label: Celkem
|
|
63
88
|
unit:
|
|
64
|
-
description: Jednotka
|
|
89
|
+
description: Jednotka hodnot current a total
|
|
65
90
|
label: Jednotka
|
|
66
91
|
updated_at:
|
|
67
|
-
description:
|
|
92
|
+
description: Čas poslední aktualizace průběhu
|
|
68
93
|
label: Aktualizováno
|
|
69
94
|
action_state_id:
|
|
70
|
-
description:
|
|
71
|
-
|
|
95
|
+
description: |-
|
|
96
|
+
ID objektu ActionState pro dotazování na stav.
|
|
97
|
+
Pokud je hodnota null, akce v aktuálním volání neblokuje.
|
|
72
98
|
label: ID stavu akce
|
|
73
99
|
active_record:
|
|
74
100
|
includes:
|
|
75
|
-
description:
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
Pro přeložení dalších asociací uzlu použijte např. 'user,node__location',
|
|
80
|
-
pro ještě hlubší úroveň např. 'user,node__location__environment'.
|
|
101
|
+
description: Seznam názvů asociovaných zdrojů oddělených čárkou. Vnořené
|
|
102
|
+
asociace se zapisují pomocí '__' mezi názvy zdrojů. Například 'user,node'
|
|
103
|
+
načte tyto dvě asociace. Pro načtení dalších asociací zdroje node použijte
|
|
104
|
+
např. 'user,node__location'; pro ještě hlubší úroveň např. 'user,node__location__environment'.
|
|
81
105
|
label: Zahrnuté asociace
|
|
82
106
|
path_params:
|
|
83
|
-
description: Pole parametrů potřebných k
|
|
107
|
+
description: Pole parametrů potřebných k sestavení URL k tomuto objektu
|
|
84
108
|
label: Parametry URL
|
|
85
109
|
resolved:
|
|
86
|
-
description: True, pokud je asociace
|
|
87
|
-
label:
|
|
110
|
+
description: True, pokud je asociace načtena
|
|
111
|
+
label: Načteno
|
|
88
112
|
authentication:
|
|
89
113
|
token:
|
|
90
114
|
interval:
|
|
91
|
-
description:
|
|
115
|
+
description: Doba platnosti požadovaného tokenu v sekundách.
|
|
92
116
|
label: Interval
|
|
93
117
|
lifetime:
|
|
94
118
|
description: |-
|
|
95
119
|
fixed - token má pevnou dobu platnosti a nelze ho obnovit
|
|
96
|
-
renewable_manual -
|
|
97
|
-
renewable_auto -
|
|
98
|
-
permanent - token
|
|
120
|
+
renewable_manual - platnost tokenu lze prodloužit, ale pouze ručně akcí renew
|
|
121
|
+
renewable_auto - platnost tokenu se při každém použití automaticky prodlouží na now + interval
|
|
122
|
+
permanent - token je platný trvale, dokud není smazán
|
|
99
123
|
label: Životnost
|
|
100
124
|
password:
|
|
101
125
|
label: Heslo
|
|
102
126
|
scope:
|
|
103
|
-
label:
|
|
127
|
+
label: Scope
|
|
104
128
|
user:
|
|
105
129
|
label: Uživatel
|
|
106
130
|
default:
|
|
107
131
|
count:
|
|
108
|
-
label: Vrátit počet
|
|
132
|
+
label: Vrátit celkový počet položek
|
|
109
133
|
total_count:
|
|
110
|
-
label: Celkový počet
|
|
134
|
+
label: Celkový počet položek
|
|
111
135
|
metadata:
|
|
112
136
|
'no':
|
|
113
|
-
label:
|
|
137
|
+
label: Vypnout metadata
|
|
114
138
|
paginable:
|
|
115
139
|
from_id:
|
|
116
|
-
description: Vypsat objekty s větším/menším
|
|
140
|
+
description: Vypsat objekty s ID větším/menším než zadaná hodnota
|
|
117
141
|
label: Od ID
|
|
118
142
|
limit:
|
|
119
143
|
description: Počet objektů k načtení
|
|
120
144
|
label: Limit
|
|
145
|
+
resources:
|
|
146
|
+
action_state:
|
|
147
|
+
actions:
|
|
148
|
+
cancel:
|
|
149
|
+
description: Zrušit čekající akci
|
|
150
|
+
index:
|
|
151
|
+
description: Vypsat stavy čekajících akcí
|
|
152
|
+
poll:
|
|
153
|
+
description: Vrátit stav po dokončení akce, změně průběhu nebo vypršení
|
|
154
|
+
časového limitu
|
|
155
|
+
show:
|
|
156
|
+
description: Zobrazit stav čekající akce
|
|
157
|
+
description: Procházet stavy blokujících akcí
|
|
121
158
|
types:
|
|
122
|
-
invalid_boolean:
|
|
123
|
-
invalid_datetime: není ve formátu ISO 8601 '%{value}'
|
|
124
|
-
invalid_float:
|
|
125
|
-
invalid_integer:
|
|
126
|
-
invalid_string:
|
|
159
|
+
invalid_boolean: 'není platná pravdivostní hodnota: %{value}'
|
|
160
|
+
invalid_datetime: 'není ve formátu ISO 8601: ''%{value}'''
|
|
161
|
+
invalid_float: 'není platné desetinné číslo: %{value}'
|
|
162
|
+
invalid_integer: 'není platné celé číslo: %{value}'
|
|
163
|
+
invalid_string: 'není platný řetězec: %{value}'
|
|
127
164
|
validation:
|
|
128
165
|
cannot_be_null: nesmí být null
|
|
129
166
|
includes_only_strings: includes musí obsahovat jen řetězce
|
|
130
167
|
includes_string_or_array: includes musí být řetězec nebo pole
|
|
131
|
-
input_parameters_not_valid: vstupní parametry
|
|
132
|
-
invalid_id:
|
|
168
|
+
input_parameters_not_valid: vstupní parametry jsou neplatné
|
|
169
|
+
invalid_id: 'není platné ID: %{value}'
|
|
133
170
|
invalid_input_layout: neplatná struktura vstupu
|
|
134
171
|
invalid_path_parameter_encoding: neplatné kódování parametru cesty
|
|
135
172
|
invalid_string_encoding: neplatné kódování řetězce
|
|
136
|
-
required_parameter_missing: povinný parametr
|
|
137
|
-
resource_not_found:
|
|
173
|
+
required_parameter_missing: chybí povinný parametr
|
|
174
|
+
resource_not_found: zdroj nebyl nalezen
|
|
138
175
|
validators:
|
|
139
176
|
acceptance:
|
|
140
177
|
accepted: musí být %{value}
|
|
@@ -149,19 +186,19 @@ cs:
|
|
|
149
186
|
included: "%{value} nelze použít"
|
|
150
187
|
length:
|
|
151
188
|
equals: délka musí být %{equals}
|
|
152
|
-
max: délka
|
|
189
|
+
max: délka musí být nejvýše %{max}
|
|
153
190
|
min: délka musí být alespoň %{min}
|
|
154
|
-
range: délka musí být v rozsahu
|
|
191
|
+
range: délka musí být v rozsahu %{min}–%{max}
|
|
155
192
|
numericality:
|
|
156
193
|
composite: "%{requirements}"
|
|
157
|
-
even: sudé číslo
|
|
194
|
+
even: musí být sudé číslo
|
|
158
195
|
max: musí být nejvýše %{max}
|
|
159
196
|
min: musí být alespoň %{min}
|
|
160
197
|
mod: zbytek po dělení %{mod} musí být nula
|
|
161
198
|
number: musí být číslo
|
|
162
|
-
odd: liché číslo
|
|
163
|
-
range: musí být v rozsahu
|
|
164
|
-
step: v krocích po %{step}
|
|
199
|
+
odd: musí být liché číslo
|
|
200
|
+
range: musí být v rozsahu %{min}–%{max}
|
|
201
|
+
step: musí být v krocích po %{step}
|
|
165
202
|
presence:
|
|
166
|
-
non_empty: musí být vyplněno a
|
|
203
|
+
non_empty: musí být vyplněno a nesmí být prázdné
|
|
167
204
|
present: musí být vyplněno
|