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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 991d9ac5afd57c72c1a850a0cfd1be12f60d1377
4
- data.tar.gz: 3e35451ef4229e6392e0321186138f52052ba043
3
+ metadata.gz: 0a2561065ed9bd8e8a053e8efa3debcc9629ce6d
4
+ data.tar.gz: eaf9113c05194d96329c23a40953bee900757110
5
5
  SHA512:
6
- metadata.gz: 440fc05dda89aafbc3185605a9529de1ee1e2f641aa9465d6816baac3060d7588a7da8a757f38c4ff3cdde709b0ae432fd1361744ecdd51eefe5ca359c14e1e7
7
- data.tar.gz: 4a201223cf2a37a61de53c90d296599857e3855de802c16bfcff3b9c417522a81ee9717ddc21ecd39cb0a78336cdb6e64d41e6006ee54dc3a743e8cd7d35fd88
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
- namespace: {}
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
- parameters: {},
285
- layout: {},
286
- namespace: {}
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 = '2016-11-25'
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.7.1'
27
+ s.add_runtime_dependency 'haveapi-client', '~> 0.8.0'
28
28
  s.add_runtime_dependency 'mail'
29
29
  end
@@ -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, ->(klass){ klass.respond_to?(:id) ? klass.id : nil }
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
- string :password, label: 'Password', required: true
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
@@ -61,7 +61,7 @@ module HaveAPI
61
61
  end
62
62
 
63
63
  def call_url_params(action, obj)
64
- ret = params && action.resolve.call(obj)
64
+ ret = params && action.resolve_url_params(obj)
65
65
 
66
66
  return [ret] if ret && !ret.is_a?(Array)
67
67
  ret
@@ -165,7 +165,16 @@ END
165
165
  end
166
166
 
167
167
  def meta
168
- params = @context.action.resolve.call(@object)
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.resolve.call(val)
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
 
@@ -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
@@ -88,7 +88,14 @@ module HaveAPI
88
88
  end
89
89
 
90
90
  def base_url
91
- "#{request.env['rack.url_scheme']}://#{request.env['HTTP_HOST']}"
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
- opts(:versions, v)
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
- opts(:mount, path)
54
+ opt(:mount, path)
55
55
  end
56
56
 
57
57
  # Login using HTTP basic.
@@ -1,4 +1,4 @@
1
1
  module HaveAPI
2
- PROTOCOL_VERSION = '1.1'
3
- VERSION = '0.7.1'
2
+ PROTOCOL_VERSION = '1.2'
3
+ VERSION = '0.8.0'
4
4
  end
@@ -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.first.label).to eq('Better param 1')
138
- expect(p.params.second.desc).to eq('Better description')
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.7.1
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: 2016-11-25 00:00:00.000000000 Z
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.7.1
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.7.1
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: []