haveapi 0.7.1 → 0.8.0

Sign up to get free protection for your applications and to get access to all the features.
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: []