haveapi 0.7.1 → 0.8.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.
- checksums.yaml +4 -4
- data/CHANGELOG +9 -0
- data/README.md +5 -2
- data/doc/json-schema.erb +66 -6
- data/doc/protocol.md +2 -1
- data/haveapi.gemspec +2 -2
- data/lib/haveapi/action.rb +10 -1
- data/lib/haveapi/authentication/token/resources.rb +1 -1
- data/lib/haveapi/context.rb +1 -1
- data/lib/haveapi/model_adapters/active_record.rb +15 -6
- data/lib/haveapi/parameters/typed.rb +3 -2
- data/lib/haveapi/params.rb +10 -6
- data/lib/haveapi/server.rb +8 -1
- data/lib/haveapi/spec/api_builder.rb +2 -2
- data/lib/haveapi/version.rb +2 -2
- data/spec/parameters/typed_spec.rb +17 -4
- data/spec/params_spec.rb +5 -5
- metadata +30 -30
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0a2561065ed9bd8e8a053e8efa3debcc9629ce6d
|
4
|
+
data.tar.gz: eaf9113c05194d96329c23a40953bee900757110
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d04c0295dd93b9b7c4f7f094106c087a83a5e734c425e50c33f8d1bb03e4e9dce4eb8d9995760e6755b8177f62a63af3a96be362e7ab80f6db67c4606249815
|
7
|
+
data.tar.gz: da12b6b30fb5978e2e0627c0ffbc2ce7d53395a665d7d23008f20459a5d1342db5643f0342857a21c56c4e9f2e561a89c990313d1261ad7ca9d0894aa3e02a7a
|
data/CHANGELOG
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
* Fri Feb 10 2017 - version 0.8.0
|
2
|
+
- Protocol version 1.2
|
3
|
+
- Server.base_url: support for proxied https
|
4
|
+
- Fix typos and scoping in Spec::ApiBuilder
|
5
|
+
- Typed parameters can be set as protected, i.e. their values are to be
|
6
|
+
visually hidden (like passwords)
|
7
|
+
- ActiveRecord adapter: resolve URL parameters for objects returned by the Index
|
8
|
+
action using the Show action as a fallback
|
9
|
+
|
1
10
|
* Fri Nov 25 2016 - version 0.7.1
|
2
11
|
- Require haveapi-client 0.7.0
|
3
12
|
|
data/README.md
CHANGED
@@ -30,8 +30,6 @@ At the moment, the following clients are available:
|
|
30
30
|
- PHP client: https://github.com/vpsfreecz/haveapi-client-php
|
31
31
|
- JavaScript client: https://github.com/vpsfreecz/haveapi-client-js
|
32
32
|
|
33
|
-
If there isn't a client in the language you need, you can [create it](doc/create-client.md).
|
34
|
-
|
35
33
|
Complex applications can be built on top of these basic clients, e.g.:
|
36
34
|
|
37
35
|
- [haveapi-webui](https://github.com/vpsfreecz/haveapi-webui), a generic web administration
|
@@ -39,6 +37,9 @@ Complex applications can be built on top of these basic clients, e.g.:
|
|
39
37
|
- [haveapi-fs](https://github.com/vpsfreecz/haveapi-fs), a FUSE based filesystem that can
|
40
38
|
mount any HaveAPI-based API
|
41
39
|
|
40
|
+
If there isn't a client in the language you need, you can [create it](doc/create-client.md)
|
41
|
+
and then use it for all HaveAPI-based APIs.
|
42
|
+
|
42
43
|
## Protocol features
|
43
44
|
- Creates RESTful APIs usable even with simple HTTP client, should it be needed
|
44
45
|
- A change in the API is immediately reflected in all clients when they re-download the
|
@@ -300,6 +301,8 @@ or cancel their execution.
|
|
300
301
|
## Read more
|
301
302
|
- [Protocol definition](doc/protocol.md)
|
302
303
|
- [How to create a client](doc/create-client.md)
|
304
|
+
- [Project templates](https://github.com/vpsfreecz/haveapi-server-project-templates)
|
305
|
+
- [API examples](https://github.com/vpsfreecz/haveapi-server-examples)
|
303
306
|
|
304
307
|
## Contributing
|
305
308
|
|
data/doc/json-schema.erb
CHANGED
@@ -137,7 +137,8 @@ DEFINITIONS = {
|
|
137
137
|
enum: %w(String Text Integer Float Datetime Boolean)
|
138
138
|
},
|
139
139
|
validators: { '$ref' => '#/definitions/input_validators' },
|
140
|
-
default: {}
|
140
|
+
default: {},
|
141
|
+
protected: { type: :boolean },
|
141
142
|
}
|
142
143
|
},
|
143
144
|
{
|
@@ -176,8 +177,11 @@ DEFINITIONS = {
|
|
176
177
|
}
|
177
178
|
}
|
178
179
|
},
|
179
|
-
layout: {
|
180
|
-
|
180
|
+
layout: {
|
181
|
+
type: :string,
|
182
|
+
enum: %w(hash hash_list object object_list),
|
183
|
+
},
|
184
|
+
namespace: { type: :string }
|
181
185
|
}
|
182
186
|
},
|
183
187
|
|
@@ -281,9 +285,65 @@ DEFINITIONS = {
|
|
281
285
|
output_parameters: {
|
282
286
|
type: :object,
|
283
287
|
properties: {
|
284
|
-
|
285
|
-
|
286
|
-
|
288
|
+
parameters: {
|
289
|
+
type: :object,
|
290
|
+
patternProperties: {
|
291
|
+
'^[a-z_]+$' => {
|
292
|
+
type: :object,
|
293
|
+
oneOf: [
|
294
|
+
{
|
295
|
+
title: 'Data type',
|
296
|
+
type: :object,
|
297
|
+
properties: {
|
298
|
+
label: { type: :string },
|
299
|
+
description: { type: :string },
|
300
|
+
type: {
|
301
|
+
type: :string,
|
302
|
+
enum: %w(String Text Integer Float Datetime Boolean)
|
303
|
+
},
|
304
|
+
protected: { type: :boolean },
|
305
|
+
}
|
306
|
+
},
|
307
|
+
{
|
308
|
+
title: 'Resource',
|
309
|
+
type: :object,
|
310
|
+
properties: {
|
311
|
+
label: { type: :string },
|
312
|
+
description: { type: :string },
|
313
|
+
type: {
|
314
|
+
type: :string,
|
315
|
+
enum: %w(Resource)
|
316
|
+
},
|
317
|
+
resource: { type: :array },
|
318
|
+
value_id: { type: :string },
|
319
|
+
value_label: { type: :string },
|
320
|
+
value: {
|
321
|
+
type: :object,
|
322
|
+
properties: {
|
323
|
+
url: { type: :string },
|
324
|
+
method: { type: :string },
|
325
|
+
help: { type: :string },
|
326
|
+
}
|
327
|
+
},
|
328
|
+
choices: {
|
329
|
+
type: :object,
|
330
|
+
properties: {
|
331
|
+
url: { type: :string },
|
332
|
+
method: { type: :string },
|
333
|
+
help: { type: :string },
|
334
|
+
}
|
335
|
+
}
|
336
|
+
}
|
337
|
+
}
|
338
|
+
]
|
339
|
+
}
|
340
|
+
}
|
341
|
+
},
|
342
|
+
layout: {
|
343
|
+
type: :string,
|
344
|
+
enum: %w(hash hash_list object object_list),
|
345
|
+
},
|
346
|
+
namespace: { type: :string },
|
287
347
|
}
|
288
348
|
},
|
289
349
|
|
data/doc/protocol.md
CHANGED
@@ -227,7 +227,8 @@ The type can be one of:
|
|
227
227
|
"description": "Describe it's meaning",
|
228
228
|
"type": "<one of the data types>",
|
229
229
|
"validators": ... validators ...,
|
230
|
-
"default": "default value that is used if the parameter is omitted"
|
230
|
+
"default": "default value that is used if the parameter is omitted",
|
231
|
+
"protected": true/false
|
231
232
|
}
|
232
233
|
|
233
234
|
|
data/haveapi.gemspec
CHANGED
@@ -5,7 +5,7 @@ require 'haveapi/version'
|
|
5
5
|
Gem::Specification.new do |s|
|
6
6
|
s.name = 'haveapi'
|
7
7
|
s.version = HaveAPI::VERSION
|
8
|
-
s.date = '
|
8
|
+
s.date = '2017-02-10'
|
9
9
|
s.summary =
|
10
10
|
s.description = 'Framework for creating self-describing APIs'
|
11
11
|
s.authors = 'Jakub Skokan'
|
@@ -24,6 +24,6 @@ Gem::Specification.new do |s|
|
|
24
24
|
s.add_runtime_dependency 'rake'
|
25
25
|
s.add_runtime_dependency 'github-markdown', '~> 0.6.9'
|
26
26
|
s.add_runtime_dependency 'nesty', '~> 1.0.2'
|
27
|
-
s.add_runtime_dependency 'haveapi-client', '~> 0.
|
27
|
+
s.add_runtime_dependency 'haveapi-client', '~> 0.8.0'
|
28
28
|
s.add_runtime_dependency 'mail'
|
29
29
|
end
|
data/lib/haveapi/action.rb
CHANGED
@@ -4,7 +4,7 @@ module HaveAPI
|
|
4
4
|
has_attr :version
|
5
5
|
has_attr :desc
|
6
6
|
has_attr :route
|
7
|
-
has_attr :resolve
|
7
|
+
has_attr :resolve
|
8
8
|
has_attr :http_method, :get
|
9
9
|
has_attr :auth, true
|
10
10
|
has_attr :aliases, []
|
@@ -240,6 +240,15 @@ module HaveAPI
|
|
240
240
|
|
241
241
|
ret
|
242
242
|
end
|
243
|
+
|
244
|
+
def resolve_url_params(object)
|
245
|
+
if self.resolve
|
246
|
+
self.resolve.call(object)
|
247
|
+
|
248
|
+
else
|
249
|
+
object.respond_to?(:id) ? object.id : nil
|
250
|
+
end
|
251
|
+
end
|
243
252
|
end
|
244
253
|
|
245
254
|
def initialize(request, version, params, body, context)
|
@@ -14,7 +14,7 @@ module HaveAPI::Authentication::Token
|
|
14
14
|
|
15
15
|
input(:hash) do
|
16
16
|
string :login, label: 'Login', required: true
|
17
|
-
|
17
|
+
password :password, label: 'Password', required: true
|
18
18
|
string :lifetime, label: 'Lifetime', required: true,
|
19
19
|
choices: %i(fixed renewable_manual renewable_auto permanent),
|
20
20
|
desc: <<END
|
data/lib/haveapi/context.rb
CHANGED
@@ -165,7 +165,16 @@ END
|
|
165
165
|
end
|
166
166
|
|
167
167
|
def meta
|
168
|
-
|
168
|
+
res = @context.action.resource
|
169
|
+
|
170
|
+
if @context.action.name.demodulize == 'Index' \
|
171
|
+
&& !@context.action.resolve \
|
172
|
+
&& res.const_defined?(:Show)
|
173
|
+
params = res::Show.resolve_url_params(@object)
|
174
|
+
|
175
|
+
else
|
176
|
+
params = @context.action.resolve_url_params(@object)
|
177
|
+
end
|
169
178
|
|
170
179
|
{
|
171
180
|
url_params: params.is_a?(Array) ? params : [params],
|
@@ -184,7 +193,7 @@ END
|
|
184
193
|
res_show = param.show_action
|
185
194
|
res_output = res_show.output
|
186
195
|
|
187
|
-
args = res_show.
|
196
|
+
args = res_show.resolve_url_params(val)
|
188
197
|
|
189
198
|
if includes_include?(param.name)
|
190
199
|
push_cls = @context.action
|
@@ -307,7 +316,7 @@ END
|
|
307
316
|
# handle ::ActiveRecord::Validations::PresenceValidator do |v|
|
308
317
|
# opts = { empty: false }
|
309
318
|
# opts[:message] = v.options[:message] if v.options[:message]
|
310
|
-
#
|
319
|
+
#
|
311
320
|
# validator(HaveAPI::Validators::Presence, :present, opts)
|
312
321
|
# end
|
313
322
|
|
@@ -350,15 +359,15 @@ END
|
|
350
359
|
|
351
360
|
handle ::ActiveModel::Validations::NumericalityValidator do |v|
|
352
361
|
opts = {}
|
353
|
-
|
362
|
+
|
354
363
|
opts[:min] = v.options[:greater_than] + 1 if v.options[:greater_than]
|
355
364
|
opts[:min] = v.options[:greater_than_or_equal_to] if v.options[:greater_than_or_equal_to]
|
356
|
-
|
365
|
+
|
357
366
|
if v.options[:equal_to]
|
358
367
|
validator(accept: v.options[:equal_to])
|
359
368
|
next
|
360
369
|
end
|
361
|
-
|
370
|
+
|
362
371
|
opts[:max] = v.options[:less_than] - 1 if v.options[:less_than]
|
363
372
|
opts[:max] = v.options[:less_than_or_equal_to] if v.options[:less_than_or_equal_to]
|
364
373
|
|
@@ -2,7 +2,7 @@ require 'date'
|
|
2
2
|
|
3
3
|
module HaveAPI::Parameters
|
4
4
|
class Typed
|
5
|
-
ATTRIBUTES = %i(label desc type db_name default fill clean)
|
5
|
+
ATTRIBUTES = %i(label desc type db_name default fill clean protected)
|
6
6
|
|
7
7
|
attr_reader :name, :label, :desc, :type, :default
|
8
8
|
|
@@ -47,7 +47,8 @@ module HaveAPI::Parameters
|
|
47
47
|
description: @desc,
|
48
48
|
type: @type ? @type.to_s : String.to_s,
|
49
49
|
validators: @validators ? @validators.describe : {},
|
50
|
-
default: @default
|
50
|
+
default: @default,
|
51
|
+
protected: @protected || false,
|
51
52
|
}
|
52
53
|
end
|
53
54
|
|
data/lib/haveapi/params.rb
CHANGED
@@ -94,6 +94,10 @@ module HaveAPI
|
|
94
94
|
add_param(*apply(args, type: Text))
|
95
95
|
end
|
96
96
|
|
97
|
+
def password(*args)
|
98
|
+
add_param(*apply(args, type: String, protected: true))
|
99
|
+
end
|
100
|
+
|
97
101
|
def id(*args)
|
98
102
|
integer(*args)
|
99
103
|
end
|
@@ -218,7 +222,7 @@ module HaveAPI
|
|
218
222
|
# convert params to correct data types, set default values if necessary.
|
219
223
|
def validate(params)
|
220
224
|
errors = {}
|
221
|
-
|
225
|
+
|
222
226
|
layout_aware(params) do |input|
|
223
227
|
# First run - coerce values to correct types
|
224
228
|
@params.each do |p|
|
@@ -226,7 +230,7 @@ module HaveAPI
|
|
226
230
|
errors[p.name] = ['required parameter missing']
|
227
231
|
next
|
228
232
|
end
|
229
|
-
|
233
|
+
|
230
234
|
unless input.has_key?(p.name)
|
231
235
|
input[p.name] = p.default if p.respond_to?(:fill?) && p.fill?
|
232
236
|
next
|
@@ -240,24 +244,24 @@ module HaveAPI
|
|
240
244
|
errors[p.name] << e.message
|
241
245
|
next
|
242
246
|
end
|
243
|
-
|
247
|
+
|
244
248
|
input[p.name] = cleaned if cleaned != :_nil
|
245
249
|
end
|
246
|
-
|
250
|
+
|
247
251
|
# Second run - validate parameters
|
248
252
|
@params.each do |p|
|
249
253
|
next if errors.has_key?(p.name)
|
250
254
|
next if input[p.name].nil?
|
251
255
|
|
252
256
|
res = p.validate(input[p.name], input)
|
253
|
-
|
257
|
+
|
254
258
|
unless res === true
|
255
259
|
errors[p.name] ||= []
|
256
260
|
errors[p.name].concat(res)
|
257
261
|
end
|
258
262
|
end
|
259
263
|
end
|
260
|
-
|
264
|
+
|
261
265
|
unless errors.empty?
|
262
266
|
raise ValidationError.new('input parameters not valid', errors)
|
263
267
|
end
|
data/lib/haveapi/server.rb
CHANGED
@@ -88,7 +88,14 @@ module HaveAPI
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def base_url
|
91
|
-
|
91
|
+
if request.env['HTTP_X_FORWARDED_SSL'] == 'on'
|
92
|
+
scheme = 'https'
|
93
|
+
|
94
|
+
else
|
95
|
+
scheme = request.env['rack.url_scheme']
|
96
|
+
end
|
97
|
+
|
98
|
+
"#{scheme}://#{request.env['HTTP_HOST']}"
|
92
99
|
end
|
93
100
|
|
94
101
|
def host
|
@@ -40,7 +40,7 @@ module HaveAPI::Spec
|
|
40
40
|
# Select API versions to be used.
|
41
41
|
def use_version(v)
|
42
42
|
before(:each) do
|
43
|
-
|
43
|
+
self.class.opt(:versions, v)
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -51,7 +51,7 @@ module HaveAPI::Spec
|
|
51
51
|
|
52
52
|
# Set a custom mount path.
|
53
53
|
def mount_to(path)
|
54
|
-
|
54
|
+
opt(:mount, path)
|
55
55
|
end
|
56
56
|
|
57
57
|
# Login using HTTP basic.
|
data/lib/haveapi/version.rb
CHANGED
@@ -43,10 +43,10 @@ describe 'Parameters::Typed' do
|
|
43
43
|
it 'can be optional' do
|
44
44
|
p = p_arg
|
45
45
|
expect(p.optional?).to be true
|
46
|
-
|
46
|
+
|
47
47
|
p = p_arg(required: false)
|
48
48
|
expect(p.optional?).to be true
|
49
|
-
|
49
|
+
|
50
50
|
p = p_arg(required: nil)
|
51
51
|
expect(p.optional?).to be true
|
52
52
|
end
|
@@ -55,7 +55,7 @@ describe 'Parameters::Typed' do
|
|
55
55
|
# Integer
|
56
56
|
p = p_type(Integer)
|
57
57
|
expect(p.clean('42')).to eq(42)
|
58
|
-
|
58
|
+
|
59
59
|
# Float
|
60
60
|
p = p_type(Float)
|
61
61
|
expect(p.clean('3.1456')).to eq(3.1456)
|
@@ -66,7 +66,7 @@ describe 'Parameters::Typed' do
|
|
66
66
|
%w(true t yes y 1).each do |v|
|
67
67
|
expect(p.clean(v)).to be true
|
68
68
|
end
|
69
|
-
|
69
|
+
|
70
70
|
%w(false f no n 0).each do |v|
|
71
71
|
expect(p.clean(v)).to be false
|
72
72
|
end
|
@@ -90,4 +90,17 @@ describe 'Parameters::Typed' do
|
|
90
90
|
p.patch(default: 'bazinga')
|
91
91
|
expect(p.clean(nil)).to eq('bazinga')
|
92
92
|
end
|
93
|
+
|
94
|
+
it 'can be protected' do
|
95
|
+
p = p_arg(protected: true)
|
96
|
+
expect(p.describe(nil)[:protected]).to be true
|
97
|
+
|
98
|
+
p = p_arg(protected: false)
|
99
|
+
expect(p.describe(nil)[:protected]).to be false
|
100
|
+
end
|
101
|
+
|
102
|
+
it 'is unprotected by default' do
|
103
|
+
p = p_arg
|
104
|
+
expect(p.describe(nil)[:protected]).to be false
|
105
|
+
end
|
93
106
|
end
|
data/spec/params_spec.rb
CHANGED
@@ -8,7 +8,7 @@ describe HaveAPI::Params do
|
|
8
8
|
class Index < HaveAPI::Actions::Default::Index
|
9
9
|
|
10
10
|
end
|
11
|
-
|
11
|
+
|
12
12
|
class Show < HaveAPI::Actions::Default::Show
|
13
13
|
output do
|
14
14
|
string :not_label
|
@@ -19,7 +19,7 @@ describe HaveAPI::Params do
|
|
19
19
|
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
22
|
+
|
23
23
|
it 'executes all blocks' do
|
24
24
|
p = HaveAPI::Params.new(:input, MyResource::Index)
|
25
25
|
p.add_block Proc.new { string :param1 }
|
@@ -134,8 +134,8 @@ describe HaveAPI::Params do
|
|
134
134
|
p.exec
|
135
135
|
p.patch(:param1, label: 'Better param 1')
|
136
136
|
p.patch(:param2, desc: 'Better description')
|
137
|
-
expect(p.params.
|
138
|
-
expect(p.params.
|
137
|
+
expect(p.params[0].label).to eq('Better param 1')
|
138
|
+
expect(p.params[1].desc).to eq('Better description')
|
139
139
|
end
|
140
140
|
|
141
141
|
it 'validates upon build' do
|
@@ -183,7 +183,7 @@ describe HaveAPI::Params do
|
|
183
183
|
string :param2
|
184
184
|
end)
|
185
185
|
p.exec
|
186
|
-
|
186
|
+
|
187
187
|
expect(p[:param1]).to eq(p.params[0])
|
188
188
|
expect(p[:param2]).to eq(p.params[1])
|
189
189
|
end
|
metadata
CHANGED
@@ -1,167 +1,167 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: haveapi
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakub Skokan
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2017-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: require_all
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: '0'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: json
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: '0'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: activesupport
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- - ~>
|
45
|
+
- - "~>"
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 4.1.14
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- - ~>
|
52
|
+
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 4.1.14
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: sinatra
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
|
-
- - ~>
|
59
|
+
- - "~>"
|
60
60
|
- !ruby/object:Gem::Version
|
61
61
|
version: 1.4.6
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
|
-
- - ~>
|
66
|
+
- - "~>"
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: 1.4.6
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: tilt
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
|
-
- - ~>
|
73
|
+
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
75
|
version: 1.4.1
|
76
76
|
type: :runtime
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
|
-
- - ~>
|
80
|
+
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
82
|
version: 1.4.1
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
84
|
name: redcarpet
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
|
-
- - ~>
|
87
|
+
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
89
|
version: 3.3.4
|
90
90
|
type: :runtime
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
|
-
- - ~>
|
94
|
+
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
96
|
version: 3.3.4
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
|
-
- -
|
101
|
+
- - ">="
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
version: '0'
|
104
104
|
type: :runtime
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
|
-
- -
|
108
|
+
- - ">="
|
109
109
|
- !ruby/object:Gem::Version
|
110
110
|
version: '0'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
112
|
name: github-markdown
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
|
-
- - ~>
|
115
|
+
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
117
|
version: 0.6.9
|
118
118
|
type: :runtime
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
|
-
- - ~>
|
122
|
+
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
124
|
version: 0.6.9
|
125
125
|
- !ruby/object:Gem::Dependency
|
126
126
|
name: nesty
|
127
127
|
requirement: !ruby/object:Gem::Requirement
|
128
128
|
requirements:
|
129
|
-
- - ~>
|
129
|
+
- - "~>"
|
130
130
|
- !ruby/object:Gem::Version
|
131
131
|
version: 1.0.2
|
132
132
|
type: :runtime
|
133
133
|
prerelease: false
|
134
134
|
version_requirements: !ruby/object:Gem::Requirement
|
135
135
|
requirements:
|
136
|
-
- - ~>
|
136
|
+
- - "~>"
|
137
137
|
- !ruby/object:Gem::Version
|
138
138
|
version: 1.0.2
|
139
139
|
- !ruby/object:Gem::Dependency
|
140
140
|
name: haveapi-client
|
141
141
|
requirement: !ruby/object:Gem::Requirement
|
142
142
|
requirements:
|
143
|
-
- - ~>
|
143
|
+
- - "~>"
|
144
144
|
- !ruby/object:Gem::Version
|
145
|
-
version: 0.
|
145
|
+
version: 0.8.0
|
146
146
|
type: :runtime
|
147
147
|
prerelease: false
|
148
148
|
version_requirements: !ruby/object:Gem::Requirement
|
149
149
|
requirements:
|
150
|
-
- - ~>
|
150
|
+
- - "~>"
|
151
151
|
- !ruby/object:Gem::Version
|
152
|
-
version: 0.
|
152
|
+
version: 0.8.0
|
153
153
|
- !ruby/object:Gem::Dependency
|
154
154
|
name: mail
|
155
155
|
requirement: !ruby/object:Gem::Requirement
|
156
156
|
requirements:
|
157
|
-
- -
|
157
|
+
- - ">="
|
158
158
|
- !ruby/object:Gem::Version
|
159
159
|
version: '0'
|
160
160
|
type: :runtime
|
161
161
|
prerelease: false
|
162
162
|
version_requirements: !ruby/object:Gem::Requirement
|
163
163
|
requirements:
|
164
|
-
- -
|
164
|
+
- - ">="
|
165
165
|
- !ruby/object:Gem::Version
|
166
166
|
version: '0'
|
167
167
|
description: Framework for creating self-describing APIs
|
@@ -170,8 +170,8 @@ executables: []
|
|
170
170
|
extensions: []
|
171
171
|
extra_rdoc_files: []
|
172
172
|
files:
|
173
|
-
- .editorconfig
|
174
|
-
- .gitignore
|
173
|
+
- ".editorconfig"
|
174
|
+
- ".gitignore"
|
175
175
|
- CHANGELOG
|
176
176
|
- Gemfile
|
177
177
|
- LICENSE.txt
|
@@ -293,12 +293,12 @@ require_paths:
|
|
293
293
|
- lib
|
294
294
|
required_ruby_version: !ruby/object:Gem::Requirement
|
295
295
|
requirements:
|
296
|
-
- -
|
296
|
+
- - ">="
|
297
297
|
- !ruby/object:Gem::Version
|
298
298
|
version: 2.0.0
|
299
299
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
300
300
|
requirements:
|
301
|
-
- -
|
301
|
+
- - ">="
|
302
302
|
- !ruby/object:Gem::Version
|
303
303
|
version: '0'
|
304
304
|
requirements: []
|