api_sketch 0.1.1 → 0.1.2

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.
Files changed (47) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -0
  3. data/CHANGELOG.md +7 -2
  4. data/README.md +63 -9
  5. data/api_sketch.gemspec +0 -1
  6. data/examples/api_project/config/initializers/shared_blocks.rb +15 -0
  7. data/examples/api_project/resources/places.rb +138 -0
  8. data/examples/api_project/resources/users/points/stats.rb +30 -0
  9. data/examples/api_project/resources/users/points.rb +32 -0
  10. data/examples/api_project/resources/users.rb +341 -0
  11. data/lib/api_sketch/config.rb +1 -1
  12. data/lib/api_sketch/dsl/attribute_parser.rb +19 -0
  13. data/lib/api_sketch/dsl/attributes.rb +45 -0
  14. data/lib/api_sketch/dsl/base.rb +8 -0
  15. data/lib/api_sketch/dsl/complex_attribute_parser.rb +11 -0
  16. data/lib/api_sketch/dsl/headers.rb +17 -0
  17. data/lib/api_sketch/dsl/parameters.rb +31 -0
  18. data/lib/api_sketch/dsl/responses.rb +22 -0
  19. data/lib/api_sketch/dsl.rb +27 -165
  20. data/lib/api_sketch/examples_server.rb +1 -1
  21. data/lib/api_sketch/generators/base.rb +42 -0
  22. data/lib/api_sketch/{generators.rb → generators/bootstrap.rb} +2 -46
  23. data/lib/api_sketch/model/attribute.rb +42 -0
  24. data/lib/api_sketch/model/base.rb +17 -0
  25. data/lib/api_sketch/model/header.rb +7 -0
  26. data/lib/api_sketch/model/parameters.rb +50 -0
  27. data/lib/api_sketch/model/resource.rb +99 -0
  28. data/lib/api_sketch/model/response.rb +12 -0
  29. data/lib/api_sketch/model/shared_block.rb +17 -0
  30. data/lib/api_sketch/model.rb +0 -242
  31. data/lib/api_sketch/{renderers.rb → response_renderer.rb} +0 -0
  32. data/lib/api_sketch/version.rb +1 -1
  33. data/lib/api_sketch.rb +20 -3
  34. data/spec/lib/api_sketch/dsl/attribute_parser_spec.rb +14 -0
  35. data/spec/lib/api_sketch/dsl/attributes_spec.rb +14 -0
  36. data/spec/lib/api_sketch/dsl/complex_attribute_parser_spec.rb +14 -0
  37. data/spec/lib/api_sketch/dsl/headers_spec.rb +14 -0
  38. data/spec/lib/api_sketch/dsl/parameters_spec.rb +14 -0
  39. data/spec/lib/api_sketch/dsl/responses_spec.rb +14 -0
  40. data/spec/lib/api_sketch/dsl_spec.rb +5 -3
  41. data/spec/lib/api_sketch/model/parameters_spec.rb +28 -0
  42. data/spec/lib/api_sketch/{renderers_spec.rb → response_renderer_spec.rb} +51 -1
  43. data/spec/spec_helper.rb +3 -1
  44. data/spec/support/shared_examples.rb +9 -0
  45. metadata +43 -9
  46. data/.ruby-gemset +0 -1
  47. data/.ruby-version +0 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c2b16335a821956300f19937d9c5b64d4b2685d
4
- data.tar.gz: 152e15df7c7030de612807127bc4ff3d3dcfa654
3
+ metadata.gz: 90161a84fafcc80e8b44bf641e4c40a865a22eed
4
+ data.tar.gz: 0642fda7b9fb81ab9802f2671d830871497a7e97
5
5
  SHA512:
6
- metadata.gz: c2a10207ada23e6e82545cf29fa8483b179b29b12960ccf1baf41c5a358476fc2a2e185769ddfb48313aaf19fc624f11138d233cd8b146794ecda998e1b776ae
7
- data.tar.gz: 4fa27b22d8c7dbf51ef822378bbba4fc5ed868cb5e3474c341c4a74797e7a64caf120b75951dab3305fdc36714f3bf9c22579833a9a6c1094e0480b30f6c7881
6
+ metadata.gz: 829d920527e420846256e6bf8ff95426da47b7c9c5ba2679a9bec20dc6a85cdf2a91ff30e77220a44bcf9ea40e44d4cf214b70db9e8a09d0cf3643fbb63bc646
7
+ data.tar.gz: 04df4fc5c7fd28268223ea6a6f28f457d9d3d4f62b33ac6509f21ad0c137826d8ce2198ccd4d52088fc2067a177d963072ce16c2f7f490421a9962c125adb031
data/.gitignore CHANGED
@@ -7,6 +7,8 @@
7
7
  /pkg/
8
8
  /spec/reports/
9
9
  /tmp/
10
+ .ruby-gemset
11
+ .ruby-version
10
12
  *.bundle
11
13
  *.so
12
14
  *.o
data/CHANGELOG.md CHANGED
@@ -1,4 +1,9 @@
1
- # 0.1.0 / 2015-05-03
1
+ # 0.1.2 / 2015-05-31
2
+
3
+ - Add `shared_block "shared block name"` (definition keyword) search keyword by it's to blocks. Keyword `use_shared_block "shared block name"` is used to find and use previously definded block. Shared blocks are be placed into special directory 'config/shared' at input folder to be loaded before all examples.
4
+ - Reorganize internal gem structure.
5
+
6
+ # 0.1.1 / 2015-05-03
2
7
 
3
8
  - Bootstrap template: put all generated pages data into `{output_folder}/docs` directory. Left `assets` directory outside since it may clash with generated files/folders names.
4
9
  - Add endpoint search by conjuction of request `path` & `http_method` for API examples server (Works like normal api server now).
@@ -12,4 +17,4 @@
12
17
 
13
18
  # 0.0.1 / 2015-01-24
14
19
 
15
- Initial release
20
+ Initial release
data/README.md CHANGED
@@ -107,12 +107,19 @@ Definitions
107
107
 
108
108
  API definitions files should be placed into directory with structure similar to `definitions` folder in this example. Directory may have only one file or many files and folders with files. Resurce's `namespace` is derived from this hierachical structure.
109
109
 
110
+ `config` folder is loaded before `resources` folder. Some initial data as shared definition blocks may be placed at config folder.
111
+
110
112
  ```
111
113
  definitions
112
- ├── places.rb
113
- ├── users
114
-    └── points.rb
115
- └── users.rb
114
+ ├── config
115
+ │ └── initializers
116
+ └── shared_blocks.rb
117
+
118
+ └── resources
119
+ ├── places.rb
120
+ ├── users
121
+ │   └── points.rb
122
+ └── users.rb
116
123
  ```
117
124
  ##### DSL
118
125
 
@@ -172,9 +179,7 @@ resource "Update user profile" do # Resource name
172
179
  integer "repeat_times" do
173
180
  description "times to repeat hello message"
174
181
  end
175
- end
176
182
 
177
- query :document do
178
183
  integer "page" do
179
184
  description "page number"
180
185
  required false
@@ -369,7 +374,57 @@ resource "Update user profile" do # Resource name
369
374
  end
370
375
  ```
371
376
 
372
- For more detailed DSL features examples check DSL test files at spec folder.
377
+ For more detailed DSL features examples check DSL test files at `spec` and `examples` folders.
378
+
379
+ #####DSL: Shared exmples
380
+
381
+ This feature is designed to reduce definition duplications.
382
+ Here is shared block definition example. It's defintion should be placed into `config` directory.
383
+
384
+ ```ruby
385
+ shared_block "place fields" do
386
+ integer "id" do
387
+ description "Place database ID"
388
+ end
389
+
390
+ string "name" do
391
+ description "Place name"
392
+ example { ["Cafe", "Market", "Restaurant", "Parking", "Park", "Palace", "Stadium"].sample }
393
+ end
394
+
395
+ float "area" do
396
+ description "Place area in square meters"
397
+ example { rand(100) + rand.round(2) }
398
+ end
399
+ end
400
+ ```
401
+
402
+ Shared block usage example. Keyword `use_shared_block` is available at `headers`, `parameters`, `attributes` and `responses` definitions.
403
+
404
+ ```ruby
405
+ resource "Get places list" do
406
+ action "index"
407
+ path "/api/places.json"
408
+ http_method "GET"
409
+ format "json"
410
+
411
+ responses do
412
+ context "Success" do
413
+ http_status :ok
414
+
415
+ parameters do
416
+ body :array do
417
+ document do
418
+ content do
419
+ use_shared_block "place fields"
420
+ end
421
+ end
422
+ end
423
+ end
424
+ end
425
+ end
426
+ end
427
+ ```
373
428
 
374
429
  TODO
375
430
  ----
@@ -384,7 +439,6 @@ TODO
384
439
  - Add realtime viewable page with log for this api examples server application to let client side developers see what data they have sent and how server received it
385
440
  - Add more validations to models.
386
441
  - Add more specs and tests.
387
- - Add `shared_block "shared block name"` (definition keyword) search keyword by it's to blocks. Maybe `uses_shared_block "shared block name"`. Maybe shared blocks should be placed into special directory at definitions to be loaded before all examples
388
442
  - Add more complex example values autogeneration for API examples server. Derive values from key names. For example string "email" should have some email value as response example.
389
443
  - rDoc documentation for code.
390
444
 
@@ -408,4 +462,4 @@ Inspirations
408
462
  License
409
463
  -------
410
464
 
411
- ApiSketch is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
465
+ ApiSketch is free software, and may be redistributed under the terms specified in the MIT-LICENSE file.
data/api_sketch.gemspec CHANGED
@@ -12,7 +12,6 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = "https://github.com/suhovius/api_sketch"
13
13
 
14
14
  spec.license = "MIT"
15
- spec.post_install_message = "Thanks for installing!"
16
15
 
17
16
  spec.files = `git ls-files -z`.split("\x0")
18
17
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
@@ -0,0 +1,15 @@
1
+ shared_block "place fields" do
2
+ integer "id" do
3
+ description "Place database ID"
4
+ end
5
+
6
+ string "name" do
7
+ description "Place name"
8
+ example { ["Cafe", "Market", "Restaurant", "Parking", "Park", "Palace", "Stadium"].sample }
9
+ end
10
+
11
+ float "area" do
12
+ description "Place area in square meters"
13
+ example { rand(100) + rand.round(2) }
14
+ end
15
+ end
@@ -0,0 +1,138 @@
1
+ resource "Get place details" do
2
+ action "show"
3
+ description "Place details"
4
+ path "/api/places/:place_id.json"
5
+ http_method "GET"
6
+ format "json"
7
+
8
+ parameters do
9
+ query :array do
10
+ string do
11
+ description "place name"
12
+ end
13
+
14
+ integer do
15
+ description "search radius"
16
+ end
17
+ end
18
+ end
19
+
20
+ responses do
21
+ context "Success" do
22
+ http_status :ok # 200
23
+
24
+ parameters do
25
+ body :document do
26
+ use_shared_block "place fields"
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ end
33
+
34
+ resource "Create place" do
35
+ action "create"
36
+ path "/api/places.json"
37
+ http_method "POST"
38
+ format "json"
39
+
40
+ parameters do
41
+ body :document do
42
+ string "name" do
43
+ description "Place name"
44
+ example { ["Cafe", "Market", "Restaurant", "Parking", "Park", "Palace", "Stadium"].sample }
45
+ end
46
+
47
+ float "area" do
48
+ description "Place area in square meters"
49
+ example { rand(100) + rand.round(2) }
50
+ end
51
+ end
52
+ end
53
+
54
+ responses do
55
+ context "Success" do
56
+ http_status :ok # 200
57
+
58
+ parameters do
59
+ body :document do
60
+ use_shared_block "place fields"
61
+ end
62
+ end
63
+ end
64
+ end
65
+
66
+ end
67
+
68
+
69
+ resource "Update place" do
70
+ action "update"
71
+ path "/api/places/:place_id.json"
72
+ http_method "PUT"
73
+ format "json"
74
+
75
+ parameters do
76
+ body :document do
77
+ string "name" do
78
+ description "Place name"
79
+ example { ["Cafe", "Market", "Restaurant", "Parking", "Park", "Palace", "Stadium"].sample }
80
+ end
81
+
82
+ float "area" do
83
+ description "Place area in square meters"
84
+ example { rand(100) + rand.round(2) }
85
+ end
86
+ end
87
+ end
88
+
89
+ responses do
90
+ context "Success" do
91
+ http_status :ok # 200
92
+
93
+ parameters do
94
+ body :document do
95
+ use_shared_block "place fields"
96
+ end
97
+ end
98
+ end
99
+ end
100
+
101
+ end
102
+
103
+ resource "Get places list" do
104
+ action "index"
105
+ path "/api/places.json"
106
+ http_method "GET"
107
+ format "json"
108
+
109
+ parameters do
110
+ query :document do
111
+ integer "page" do
112
+ description "Pagination page"
113
+ default 1
114
+ end
115
+
116
+ integer "per_page" do
117
+ description "Pagination place per page"
118
+ default 25
119
+ end
120
+ end
121
+ end
122
+
123
+ responses do
124
+ context "Success" do
125
+ http_status :ok # 200
126
+
127
+ parameters do
128
+ body :array do
129
+ document do
130
+ content do
131
+ use_shared_block "place fields"
132
+ end
133
+ end
134
+ end
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,30 @@
1
+ resource "Get user points stats" do
2
+ action "index"
3
+ description "User points stats"
4
+ path "/api/users/username/points/stats.json"
5
+ http_method "GET"
6
+ format "json"
7
+
8
+ responses do
9
+ context "Success" do
10
+ http_status :ok # 200
11
+
12
+ parameters do
13
+ body :document do
14
+ document "stats" do
15
+ content do
16
+ string "total" do
17
+ description "total amount"
18
+ example { rand(100) }
19
+ end
20
+ string "rank" do
21
+ description "user's rank"
22
+ example { ["Junior", "Middle", "Senior"].sample }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,32 @@
1
+ resource "Get user points" do
2
+ action "index"
3
+ description "User points"
4
+ path "/api/users/username/points.json"
5
+ http_method "GET"
6
+ format "json"
7
+
8
+ responses do
9
+ context "Success" do
10
+ http_status :ok # 200
11
+
12
+ parameters do
13
+ body :array do
14
+ document do
15
+ content do
16
+ integer "items" do
17
+ description "user's items"
18
+ example { rand(1000) }
19
+ end
20
+
21
+ integer "rank" do
22
+ description "user's rank"
23
+ example { ["Test User", "Real User"].sample }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+
32
+ end