rapis 0.1.2 → 0.2.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: 7bfe276fcc78b153847606180a18cbfd4731b8cb
4
- data.tar.gz: 54dfe4b9be39e7a1622f38d6455e544a899c3adf
3
+ metadata.gz: 453b9823828f6ea422721fcd30b6c5d4079b0e3c
4
+ data.tar.gz: 303c6211e22df3a2339fc9839d090434ead227d9
5
5
  SHA512:
6
- metadata.gz: cb8e8141386c47650ffaff1e316729567a0e820ea53179a52adbe6e6e5c1aba85af223e82c2e329764ba3a54a2688219f01975220753b68245f6089c7ed55a07
7
- data.tar.gz: fa300290d3d070fef9f0dfb32e7af774fa8e21211a50473a9f3a1bb524a205b686d38db110bc81ad991cfed8b46cf665a15aabe702d3d1bcc74855dca5f9d2b8
6
+ metadata.gz: 9d62c8f3227b79f63e328d8523d6c57f115fc6528e5c57ee6f373c07d5a6e75469787d4c819822d3022034662db401b030a35273d75166b6152c0d63c4fa46f9
7
+ data.tar.gz: 40c68ce182a28a4373aceee129f78baccf6b193304c55eb814404ee270b3df3407bc607149f5745d0f787accef758891eb6030be437d5f3784fcb4bc3e78697b
@@ -4,6 +4,7 @@ AllCops:
4
4
  - 'exe/**'
5
5
  - Rakefile
6
6
  - rapis.gemspec
7
+ - 'spec/rapis/_files/**'
7
8
 
8
9
  LineLength:
9
10
  Max: 120
data/Apifile CHANGED
@@ -8,19 +8,18 @@ rest_api do
8
8
  basePath "/test"
9
9
  schemes ["https"]
10
10
  paths do
11
- path "/" do
11
+ item "/" do
12
12
  get do
13
13
  consumes ["application/json"]
14
14
  produces ["text/html"]
15
15
  responses do
16
- code 200 do
16
+ code "200" do
17
17
  description "200 response"
18
18
  headers(
19
19
  {"Content-Type"=>{"type"=>"string"}})
20
20
  end
21
21
  end
22
22
  amazon_apigateway_integration do
23
- type "mock"
24
23
  responses do
25
24
  default do
26
25
  statusCode 200
@@ -34,12 +33,13 @@ rest_api do
34
33
  requestTemplates(
35
34
  {"application/json"=>"{\"statusCode\": 200}"})
36
35
  passthroughBehavior "when_no_match"
36
+ type "mock"
37
37
  end
38
38
  end
39
39
  post do
40
40
  produces ["application/json"]
41
41
  responses do
42
- code 200 do
42
+ code "200" do
43
43
  description "200 response"
44
44
  schema do
45
45
  ref "#/definitions/Empty"
@@ -49,7 +49,6 @@ rest_api do
49
49
  end
50
50
  end
51
51
  amazon_apigateway_integration do
52
- type "http"
53
52
  responses do
54
53
  default do
55
54
  statusCode 200
@@ -60,13 +59,14 @@ rest_api do
60
59
  uri "http://petstore-demo-endpoint.execute-api.com/petstore/pets"
61
60
  passthroughBehavior "when_no_match"
62
61
  httpMethod "POST"
62
+ type "http"
63
63
  end
64
64
  end
65
65
  options do
66
66
  consumes ["application/json"]
67
67
  produces ["application/json"]
68
68
  responses do
69
- code 200 do
69
+ code "200" do
70
70
  description "200 response"
71
71
  schema do
72
72
  ref "#/definitions/Empty"
@@ -78,7 +78,6 @@ rest_api do
78
78
  end
79
79
  end
80
80
  amazon_apigateway_integration do
81
- type "mock"
82
81
  responses do
83
82
  default do
84
83
  statusCode 200
@@ -92,18 +91,25 @@ rest_api do
92
91
  requestTemplates(
93
92
  {"application/json"=>"{\"statusCode\": 200}"})
94
93
  passthroughBehavior "when_no_match"
94
+ type "mock"
95
95
  end
96
96
  end
97
97
  end
98
- path "/pets" do
98
+ item "/pets" do
99
99
  get do
100
100
  produces ["application/json"]
101
- parameters [
102
- {"name"=>"type", "in"=>"query", "required"=>false, "type"=>"string"},
103
- {"name"=>"page", "in"=>"query", "required"=>false, "type"=>"string"}
104
- ]
101
+ parameters do
102
+ query "type" do
103
+ required false
104
+ type "string"
105
+ end
106
+ query "page" do
107
+ required false
108
+ type "string"
109
+ end
110
+ end
105
111
  responses do
106
- code 200 do
112
+ code "200" do
107
113
  description "200 response"
108
114
  schema do
109
115
  ref "#/definitions/Empty"
@@ -113,7 +119,6 @@ rest_api do
113
119
  end
114
120
  end
115
121
  amazon_apigateway_integration do
116
- type "http"
117
122
  responses do
118
123
  default do
119
124
  statusCode 200
@@ -127,12 +132,13 @@ rest_api do
127
132
  requestParameters(
128
133
  {"integration.request.querystring.page"=>"method.request.querystring.page",
129
134
  "integration.request.querystring.type"=>"method.request.querystring.type"})
135
+ type "http"
130
136
  end
131
137
  end
132
138
  post do
133
139
  produces ["application/json"]
134
140
  responses do
135
- code 200 do
141
+ code "200" do
136
142
  description "200 response"
137
143
  schema do
138
144
  ref "#/definitions/Empty"
@@ -142,7 +148,6 @@ rest_api do
142
148
  end
143
149
  end
144
150
  amazon_apigateway_integration do
145
- type "http"
146
151
  responses do
147
152
  default do
148
153
  statusCode 200
@@ -153,13 +158,14 @@ rest_api do
153
158
  uri "http://petstore-demo-endpoint.execute-api.com/petstore/pets"
154
159
  passthroughBehavior "when_no_match"
155
160
  httpMethod "POST"
161
+ type "http"
156
162
  end
157
163
  end
158
164
  options do
159
165
  consumes ["application/json"]
160
166
  produces ["application/json"]
161
167
  responses do
162
- code 200 do
168
+ code "200" do
163
169
  description "200 response"
164
170
  schema do
165
171
  ref "#/definitions/Empty"
@@ -171,7 +177,6 @@ rest_api do
171
177
  end
172
178
  end
173
179
  amazon_apigateway_integration do
174
- type "mock"
175
180
  responses do
176
181
  default do
177
182
  statusCode 200
@@ -185,17 +190,21 @@ rest_api do
185
190
  requestTemplates(
186
191
  {"application/json"=>"{\"statusCode\": 200}"})
187
192
  passthroughBehavior "when_no_match"
193
+ type "mock"
188
194
  end
189
195
  end
190
196
  end
191
- path "/pets/{petId}" do
197
+ item "/pets/{petId}" do
192
198
  get do
193
199
  produces ["application/json"]
194
- parameters [
195
- {"name"=>"petId", "in"=>"path", "required"=>true, "type"=>"string"}
196
- ]
200
+ parameters do
201
+ path "petId" do
202
+ required true
203
+ type "string"
204
+ end
205
+ end
197
206
  responses do
198
- code 200 do
207
+ code "200" do
199
208
  description "200 response"
200
209
  schema do
201
210
  ref "#/definitions/Empty"
@@ -205,7 +214,6 @@ rest_api do
205
214
  end
206
215
  end
207
216
  amazon_apigateway_integration do
208
- type "http"
209
217
  responses do
210
218
  default do
211
219
  statusCode 200
@@ -218,13 +226,14 @@ rest_api do
218
226
  httpMethod "GET"
219
227
  requestParameters(
220
228
  {"integration.request.path.petId"=>"method.request.path.petId"})
229
+ type "http"
221
230
  end
222
231
  end
223
232
  options do
224
233
  consumes ["application/json"]
225
234
  produces ["application/json"]
226
235
  responses do
227
- code 200 do
236
+ code "200" do
228
237
  description "200 response"
229
238
  schema do
230
239
  ref "#/definitions/Empty"
@@ -236,7 +245,6 @@ rest_api do
236
245
  end
237
246
  end
238
247
  amazon_apigateway_integration do
239
- type "mock"
240
248
  responses do
241
249
  default do
242
250
  statusCode 200
@@ -250,6 +258,7 @@ rest_api do
250
258
  requestTemplates(
251
259
  {"application/json"=>"{\"statusCode\": 200}"})
252
260
  passthroughBehavior "when_no_match"
261
+ type "mock"
253
262
  end
254
263
  end
255
264
  end
@@ -1,5 +1,11 @@
1
1
  ## 0.1.2
2
2
 
3
+ - Add `_include` method to DSL
4
+ - Change `path` method to `item` method for DSL
5
+ - Refactoring
6
+
7
+ ## 0.1.2
8
+
3
9
  - Adjust some command options
4
10
  - Refactoring
5
11
 
data/README.md CHANGED
@@ -3,6 +3,7 @@
3
3
  [![Gem Version](https://badge.fury.io/rb/rapis.svg)](https://badge.fury.io/rb/rapis)
4
4
  [![Build Status](https://travis-ci.org/marcy-terui/rapis.svg?branch=master)](https://travis-ci.org/marcy-terui/rapis)
5
5
  [![Coverage Status](https://coveralls.io/repos/github/marcy-terui/rapis/badge.svg?branch=master)](https://coveralls.io/github/marcy-terui/rapis?branch=master)
6
+ [![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/marcy-terui/rapis/badges/quality-score.png?b=master)](https://scrutinizer-ci.com/g/marcy-terui/rapis/?branch=master)
6
7
 
7
8
 
8
9
  Swagger as Ruby DSL and its deployment tool for Amazon API Gateway
@@ -146,9 +147,113 @@ Options:
146
147
  # Default: Apifile
147
148
  ```
148
149
 
149
- ## Sample
150
+ ## Example
150
151
 
151
- ### JSON
152
+ ### Ruby DSL
153
+
154
+ - Apifile
155
+
156
+ ```ruby
157
+ rest_api do
158
+ swagger "2.0"
159
+ info do
160
+ version "2016-05-27T17:07:04Z"
161
+ title "PetStore"
162
+ end
163
+ host "p0dvujrb13.execute-api.ap-northeast-1.amazonaws.com"
164
+ basePath "/test"
165
+ schemes ["https"]
166
+ _include 'paths.rb'
167
+ _include 'definitions.rb'
168
+ end
169
+ ```
170
+
171
+ - paths.rb
172
+
173
+ ```ruby
174
+ paths do
175
+ item "/pets/{petId}" do
176
+ get do
177
+ produces ["application/json"]
178
+ parameters do
179
+ path "petId" do
180
+ required true
181
+ type "string"
182
+ end
183
+ end
184
+ responses do
185
+ code "200" do
186
+ description "200 response"
187
+ schema do
188
+ ref "#/definitions/Empty"
189
+ end
190
+ headers(
191
+ {"Access-Control-Allow-Origin"=>{"type"=>"string"}})
192
+ end
193
+ end
194
+ amazon_apigateway_integration do
195
+ responses do
196
+ default do
197
+ statusCode 200
198
+ responseParameters(
199
+ {"method.response.header.Access-Control-Allow-Origin"=>"'*'"})
200
+ end
201
+ end
202
+ uri "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{petId}"
203
+ passthroughBehavior "when_no_match"
204
+ httpMethod "GET"
205
+ requestParameters(
206
+ {"integration.request.path.petId"=>"method.request.path.petId"})
207
+ type "http"
208
+ end
209
+ end
210
+ options do
211
+ consumes ["application/json"]
212
+ produces ["application/json"]
213
+ responses do
214
+ code "200" do
215
+ description "200 response"
216
+ schema do
217
+ ref "#/definitions/Empty"
218
+ end
219
+ headers(
220
+ {"Access-Control-Allow-Origin"=>{"type"=>"string"},
221
+ "Access-Control-Allow-Methods"=>{"type"=>"string"},
222
+ "Access-Control-Allow-Headers"=>{"type"=>"string"}})
223
+ end
224
+ end
225
+ amazon_apigateway_integration do
226
+ responses do
227
+ default do
228
+ statusCode 200
229
+ responseParameters(
230
+ {"method.response.header.Access-Control-Allow-Methods"=>"'GET,OPTIONS'",
231
+ "method.response.header.Access-Control-Allow-Headers"=>
232
+ "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'",
233
+ "method.response.header.Access-Control-Allow-Origin"=>"'*'"})
234
+ end
235
+ end
236
+ requestTemplates(
237
+ {"application/json"=>"{\"statusCode\": 200}"})
238
+ passthroughBehavior "when_no_match"
239
+ type "mock"
240
+ end
241
+ end
242
+ end
243
+ end
244
+ ```
245
+
246
+ - definitions.rb
247
+
248
+ ```ruby
249
+ definitions do
250
+ Empty do
251
+ type "object"
252
+ end
253
+ end
254
+ ```
255
+
256
+ ### JSON result
152
257
 
153
258
  ```json
154
259
  {
@@ -163,46 +268,18 @@ Options:
163
268
  "https"
164
269
  ],
165
270
  "paths": {
166
- "/": {
271
+ "/pets/{petId}": {
167
272
  "get": {
168
- "consumes": [
169
- "application/json"
170
- ],
171
273
  "produces": [
172
- "text/html"
274
+ "application/json"
173
275
  ],
174
- "responses": {
175
- "200": {
176
- "description": "200 response",
177
- "headers": {
178
- "Content-Type": {
179
- "type": "string"
180
- }
181
- }
276
+ "parameters": [
277
+ {
278
+ "name": "petId",
279
+ "in": "path",
280
+ "required": true,
281
+ "type": "string"
182
282
  }
183
- },
184
- "x-amazon-apigateway-integration": {
185
- "responses": {
186
- "default": {
187
- "statusCode": "200",
188
- "responseParameters": {
189
- "method.response.header.Content-Type": "'text/html'"
190
- },
191
- "responseTemplates": {
192
- "text/html": "<html>\n <head>\n <style>\n body {\n color: #333;\n font-family: Sans-serif;\n max-width: 800px;\n margin: auto;\n }\n </style>\n </head>\n <body>\n <h1>Welcome to your Pet Store API</h1>\n <p>\n You have succesfully deployed your first API. You are seeing this HTML page because the <code>GET</code> method to the root resource of your API returns this content as a Mock integration.\n </p>\n <p>\n The Pet Store API contains the <code>/pets</code> and <code>/pets/{petId}</code> resources. By making a <a href=\"/$context.stage/pets/\" target=\"_blank\"><code>GET</code> request</a> to <code>/pets</code> you can retrieve a list of Pets in your API. If you are looking for a specific pet, for example the pet with ID 1, you can make a <a href=\"/$context.stage/pets/1\" target=\"_blank\"><code>GET</code> request</a> to <code>/pets/1</code>.\n </p>\n <p>\n You can use a REST client such as <a href=\"https://www.getpostman.com/\" target=\"_blank\">Postman</a> to test the <code>POST</code> methods in your API to create a new pet. Use the sample body below to send the <code>POST</code> request:\n </p>\n <pre>\n{\n \"type\" : \"cat\",\n \"price\" : 123.11\n}\n </pre>\n </body>\n</html>"
193
- }
194
- }
195
- },
196
- "requestTemplates": {
197
- "application/json": "{\"statusCode\": 200}"
198
- },
199
- "passthroughBehavior": "when_no_match",
200
- "type": "mock"
201
- }
202
- },
203
- "post": {
204
- "produces": [
205
- "application/json"
206
283
  ],
207
284
  "responses": {
208
285
  "200": {
@@ -226,9 +303,12 @@ Options:
226
303
  }
227
304
  }
228
305
  },
229
- "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets",
306
+ "uri": "http://petstore-demo-endpoint.execute-api.com/petstore/pets/{petId}",
230
307
  "passthroughBehavior": "when_no_match",
231
- "httpMethod": "POST",
308
+ "httpMethod": "GET",
309
+ "requestParameters": {
310
+ "integration.request.path.petId": "method.request.path.petId"
311
+ },
232
312
  "type": "http"
233
313
  }
234
314
  },
@@ -263,7 +343,7 @@ Options:
263
343
  "default": {
264
344
  "statusCode": "200",
265
345
  "responseParameters": {
266
- "method.response.header.Access-Control-Allow-Methods": "'POST,OPTIONS'",
346
+ "method.response.header.Access-Control-Allow-Methods": "'GET,OPTIONS'",
267
347
  "method.response.header.Access-Control-Allow-Headers": "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'",
268
348
  "method.response.header.Access-Control-Allow-Origin": "'*'"
269
349
  }
@@ -286,118 +366,6 @@ Options:
286
366
  }
287
367
  ```
288
368
 
289
- ### Ruby DSL
290
-
291
- ```ruby
292
- rest_api do
293
- swagger "2.0"
294
- info do
295
- version "2016-05-27T17:07:04Z"
296
- title "PetStore"
297
- end
298
- host "p0dvujrb13.execute-api.ap-northeast-1.amazonaws.com"
299
- basePath "/test"
300
- schemes ["https"]
301
- paths do
302
- path "/" do
303
- get do
304
- consumes ["application/json"]
305
- produces ["text/html"]
306
- responses do
307
- code 200 do
308
- description "200 response"
309
- headers(
310
- {"Content-Type"=>{"type"=>"string"}})
311
- end
312
- end
313
- amazon_apigateway_integration do
314
- responses do
315
- default do
316
- statusCode 200
317
- responseParameters(
318
- {"method.response.header.Content-Type"=>"'text/html'"})
319
- responseTemplates(
320
- {"text/html"=>
321
- "<html>\n <head>\n <style>\n body {\n color: #333;\n font-family: Sans-serif;\n max-width: 800px;\n margin: auto;\n }\n </style>\n </head>\n <body>\n <h1>Welcome to your Pet Store API</h1>\n <p>\n You have succesfully deployed your first API. You are seeing this HTML page because the <code>GET</code> method to the root resource of your API returns this content as a Mock integration.\n </p>\n <p>\n The Pet Store API contains the <code>/pets</code> and <code>/pets/{petId}</code> resources. By making a <a href=\"/$context.stage/pets/\" target=\"_blank\"><code>GET</code> request</a> to <code>/pets</code> you can retrieve a list of Pets in your API. If you are looking for a specific pet, for example the pet with ID 1, you can make a <a href=\"/$context.stage/pets/1\" target=\"_blank\"><code>GET</code> request</a> to <code>/pets/1</code>.\n </p>\n <p>\n You can use a REST client such as <a href=\"https://www.getpostman.com/\" target=\"_blank\">Postman</a> to test the <code>POST</code> methods in your API to create a new pet. Use the sample body below to send the <code>POST</code> request:\n </p>\n <pre>\n{\n \"type\" : \"cat\",\n \"price\" : 123.11\n}\n </pre>\n </body>\n</html>"})
322
- end
323
- end
324
- requestTemplates(
325
- {"application/json"=>"{\"statusCode\": 200}"})
326
- passthroughBehavior "when_no_match"
327
- type "mock"
328
- end
329
- end
330
- post do
331
- produces ["application/json"]
332
- responses do
333
- code 200 do
334
- description "200 response"
335
- schema do
336
- ref "#/definitions/Empty"
337
- end
338
- headers(
339
- {"Access-Control-Allow-Origin"=>{"type"=>"string"}})
340
- end
341
- end
342
- amazon_apigateway_integration do
343
- responses do
344
- default do
345
- statusCode 200
346
- responseParameters(
347
- {"method.response.header.Access-Control-Allow-Origin"=>"'*'"})
348
- end
349
- end
350
- uri "http://petstore-demo-endpoint.execute-api.com/petstore/pets"
351
- passthroughBehavior "when_no_match"
352
- httpMethod "POST"
353
- type "http"
354
- end
355
- end
356
- options do
357
- consumes ["application/json"]
358
- produces ["application/json"]
359
- responses do
360
- code 200 do
361
- description "200 response"
362
- schema do
363
- ref "#/definitions/Empty"
364
- end
365
- headers(
366
- {"Access-Control-Allow-Origin"=>{"type"=>"string"},
367
- "Access-Control-Allow-Methods"=>{"type"=>"string"},
368
- "Access-Control-Allow-Headers"=>{"type"=>"string"}})
369
- end
370
- end
371
- amazon_apigateway_integration do
372
- responses do
373
- default do
374
- statusCode 200
375
- responseParameters(
376
- {"method.response.header.Access-Control-Allow-Methods"=>"'POST,OPTIONS'",
377
- "method.response.header.Access-Control-Allow-Headers"=>
378
- "'Content-Type,X-Amz-Date,Authorization,X-Api-Key'",
379
- "method.response.header.Access-Control-Allow-Origin"=>"'*'"})
380
- end
381
- end
382
- requestTemplates(
383
- {"application/json"=>"{\"statusCode\": 200}"})
384
- passthroughBehavior "when_no_match"
385
- type "mock"
386
- end
387
- end
388
- end
389
- end
390
- definitions do
391
- Empty do
392
- type "object"
393
- end
394
- end
395
- end
396
- ```
397
-
398
-
399
-
400
-
401
369
  ## Development
402
370
 
403
371
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -14,6 +14,7 @@ require 'rapis/version'
14
14
  require 'rapis/actions'
15
15
  require 'rapis/cli'
16
16
  require 'rapis/client'
17
+ require 'rapis/template_functions'
17
18
  require 'rapis/converter'
18
19
  require 'rapis/exceptions'
19
20
  require 'rapis/logger'
@@ -1,5 +1,7 @@
1
1
  module Rapis
2
2
  class Converter
3
+ include Rapis::TemplateFunctions
4
+
3
5
  CHANGE_SETS = {
4
6
  'x-amazon-apigateway-integration' => 'amazon_apigateway_integration',
5
7
  '$ref' => 'ref'
@@ -50,22 +52,13 @@ EOS
50
52
  def to_dsl_key_conv
51
53
  proc do |k|
52
54
  k = k.to_s
53
- if k =~ %r{^\/}
54
- proc do |v, nested|
55
- if nested
56
- "path #{k.inspect} #{v}"
57
- else
58
- "path #{k.inspect}, #{v}"
59
- end
60
- end
61
- elsif k =~ /^\d{3}$/
62
- proc do |v, nested|
63
- if nested
64
- "code #{k} #{v}"
65
- else
66
- "code #{k}, #{v}"
67
- end
68
- end
55
+ case k
56
+ when %r{^\/}
57
+ item_key_proc k
58
+ when /^\d{3}$/
59
+ code_key_proc k
60
+ when 'parameters', 'api_key'
61
+ parameters_key_proc k
69
62
  else
70
63
  CHANGE_SETS.each { |f, t| k = k.gsub(f, t) }
71
64
  k
@@ -73,6 +66,56 @@ EOS
73
66
  end
74
67
  end
75
68
 
69
+ def item_key_proc(k)
70
+ proc do |v, nested|
71
+ if nested
72
+ "item #{k.inspect} #{v}"
73
+ else
74
+ "item #{k.inspect}, #{v}"
75
+ end
76
+ end
77
+ end
78
+
79
+ def code_key_proc(k)
80
+ proc do |v, nested|
81
+ if nested
82
+ "code #{k.to_s.inspect} #{v}"
83
+ else
84
+ "code #{k.to_s.inspect}, #{v}"
85
+ end
86
+ end
87
+ end
88
+
89
+ def parameters_key_proc(k)
90
+ proc do |v, _|
91
+ if v =~ /\n(\s+)/
92
+ indent = Regexp.last_match(1)
93
+ v = instance_eval(v)
94
+ dsl = "#{k} do\n"
95
+ if v.is_a?(Array)
96
+ v.each do |param|
97
+ dsl << param_to_dsl(param, indent)
98
+ end
99
+ else
100
+ dsl << param_to_dsl(v, indent)
101
+ end
102
+ dsl << indent[2..-1] + "end\n"
103
+ else
104
+ "#{k} #{v}"
105
+ end
106
+ end
107
+ end
108
+
109
+ def param_to_dsl(param, indent)
110
+ dsl = indent + "#{param['in']} #{param['name'].inspect} do\n"
111
+ param.each do |pk, pv|
112
+ next if %w(in name).include?(pk)
113
+ dsl << indent
114
+ dsl += pv.is_a?(String) ? " #{pk} #{pv.inspect}\n" : " #{pk} #{pv}\n"
115
+ end
116
+ dsl << indent + "end\n"
117
+ end
118
+
76
119
  def to_dsl_value_conv
77
120
  proc do |v|
78
121
  if v.is_a?(String) && v =~ /\A(?:0|[1-9]\d*)\Z/
@@ -100,7 +143,7 @@ EOS
100
143
  def to_h_value_conv
101
144
  proc do |v|
102
145
  case v
103
- when Hash, Array
146
+ when Hash, Array, TrueClass, FalseClass
104
147
  v
105
148
  else
106
149
  v.to_s
@@ -121,18 +164,11 @@ EOS
121
164
 
122
165
  def define_template_func(scope)
123
166
  scope.instance_eval(<<-EOS)
124
- def path(key, value = nil, &block)
125
- if block
126
- value = Dslh::ScopeBlock.nest(binding, 'block', key)
127
- end
128
- @__hash__[key] = value
129
- end
130
- def code(key, value = nil, &block)
131
- if block
132
- value = Dslh::ScopeBlock.nest(binding, 'block', key)
133
- end
134
- @__hash__[key] = value
135
- end
167
+ #{template_code_func}
168
+ #{template_item_func}
169
+ #{template_api_key_func}
170
+ #{template_params_func}
171
+ #{template_include_func}
136
172
  EOS
137
173
  end
138
174
  end
@@ -0,0 +1,103 @@
1
+ module Rapis
2
+ module TemplateFunctions
3
+ def template_params
4
+ %w(query header path formData body)
5
+ end
6
+
7
+ def template_include_func
8
+ <<-EOS
9
+ def _include(path, args = {})
10
+ instance_eval(File.read(path))
11
+ end
12
+ EOS
13
+ end
14
+
15
+ def template_params_func
16
+ funcs = <<-EOS
17
+ def _param(name, i, block)
18
+ @__hash__['parameters'] << {
19
+ 'name' => name,
20
+ 'in' => i
21
+ }.merge(Dslh::ScopeBlock.nest(binding, 'block', name))
22
+ end
23
+ EOS
24
+ template_params.each do |i|
25
+ funcs << <<-EOS
26
+ def #{i}(name, value = nil, &block)
27
+ _param(name, #{i.inspect}, block)
28
+ end
29
+ EOS
30
+ end
31
+ <<-EOS
32
+ def parameters(value = nil, &block)
33
+ if value.nil?
34
+ @__hash__['parameters'] = []
35
+
36
+ #{funcs}
37
+
38
+ if block
39
+ value = instance_eval(&block)
40
+ end
41
+ else
42
+ @__hash__['parameters'] = value
43
+ end
44
+ end
45
+ EOS
46
+ end
47
+
48
+ def template_api_key_func
49
+ funcs = <<-EOS
50
+ def _api_key(name, i, block)
51
+ @__hash__['api_key'] = Dslh::ScopeBlock.nest(binding, 'block', name).merge({
52
+ 'name' => name,
53
+ 'in' => i
54
+ })
55
+ end
56
+ EOS
57
+ template_params.each do |i|
58
+ funcs << <<-EOS
59
+ def #{i}(name, value = nil, &block)
60
+ _api_key(name, #{i.inspect}, block)
61
+ end
62
+ EOS
63
+ end
64
+ <<-EOS
65
+ def api_key(value = nil, &block)
66
+ if value.nil?
67
+ @__hash__['api_key'] = []
68
+
69
+ #{funcs}
70
+
71
+ if block
72
+ value = instance_eval(&block)
73
+ end
74
+ else
75
+ @__hash__['api_key'] = value
76
+ end
77
+ end
78
+ EOS
79
+ end
80
+
81
+ def template_item_func
82
+ <<-EOS
83
+ def item(key, value = nil, &block)
84
+ if block
85
+ value = Dslh::ScopeBlock.nest(binding, 'block', key)
86
+ end
87
+ @__hash__[key] = value
88
+ end
89
+ EOS
90
+ end
91
+
92
+ def template_code_func
93
+ <<-EOS
94
+ def code(key, value = nil, &block)
95
+ if block
96
+ value = Dslh::ScopeBlock.nest(binding, 'block', key)
97
+ end
98
+ @__hash__[key] = value
99
+ end
100
+ EOS
101
+ end
102
+ end
103
+ end
@@ -1,3 +1,3 @@
1
1
  module Rapis
2
- VERSION = '0.1.2'
2
+ VERSION = '0.2.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rapis
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Masashi Terui
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-06-01 00:00:00.000000000 Z
11
+ date: 2016-06-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: aws-sdk
@@ -178,6 +178,7 @@ files:
178
178
  - lib/rapis/converter.rb
179
179
  - lib/rapis/exceptions.rb
180
180
  - lib/rapis/logger.rb
181
+ - lib/rapis/template_functions.rb
181
182
  - lib/rapis/utils.rb
182
183
  - lib/rapis/version.rb
183
184
  - rapis.gemspec