praxis 0.13.0 → 0.14.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/.ruby-version +1 -1
- data/.travis.yml +15 -2
- data/CHANGELOG.md +54 -1
- data/bin/praxis +49 -2
- data/lib/api_browser/Gruntfile.js +247 -90
- data/lib/api_browser/app/bower_components/angular-mocks/.bower.json +19 -0
- data/lib/api_browser/app/bower_components/angular-mocks/README.md +57 -0
- data/lib/api_browser/app/bower_components/angular-mocks/angular-mocks.js +2193 -0
- data/lib/api_browser/app/bower_components/angular-mocks/bower.json +9 -0
- data/lib/api_browser/app/bower_components/angular-mocks/package.json +27 -0
- data/lib/api_browser/app/bower_components/angular/.bower.json +6 -5
- data/lib/api_browser/app/bower_components/angular/README.md +23 -4
- data/lib/api_browser/app/bower_components/angular/angular-csp.css +6 -0
- data/lib/api_browser/app/bower_components/angular/angular.js +2287 -1597
- data/lib/api_browser/app/bower_components/angular/angular.min.js +212 -205
- data/lib/api_browser/app/bower_components/angular/angular.min.js.gzip +0 -0
- data/lib/api_browser/app/bower_components/angular/angular.min.js.map +3 -3
- data/lib/api_browser/app/bower_components/angular/bower.json +2 -1
- data/lib/api_browser/app/bower_components/angular/package.json +25 -0
- data/lib/api_browser/app/bower_components/showdown/.bower.json +39 -0
- data/lib/api_browser/app/bower_components/showdown/.jshintignore +2 -0
- data/lib/api_browser/app/bower_components/showdown/.travis.yml +8 -0
- data/lib/api_browser/app/bower_components/showdown/Gruntfile.js +100 -0
- data/lib/api_browser/app/bower_components/showdown/README.md +317 -0
- data/lib/api_browser/app/bower_components/showdown/bower.json +26 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.js +1606 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/Showdown.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/github.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/github.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/prettify.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/prettify.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/table.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/table.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/twitter.min.js +2 -0
- data/lib/api_browser/app/bower_components/showdown/compressed/extensions/twitter.min.js.map +1 -0
- data/lib/api_browser/app/bower_components/showdown/license.txt +34 -0
- data/lib/api_browser/app/bower_components/showdown/package.json +47 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/github.js +25 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/prettify.js +29 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/table.js +106 -0
- data/lib/api_browser/app/bower_components/showdown/src/extensions/twitter.js +42 -0
- data/lib/api_browser/app/bower_components/showdown/src/ng-showdown.js +150 -0
- data/lib/api_browser/app/bower_components/showdown/src/showdown.js +1454 -0
- data/lib/api_browser/app/index.html +6 -4
- data/lib/api_browser/app/js/app.js +1 -2
- data/lib/api_browser/app/js/controllers/action.js +4 -4
- data/lib/api_browser/app/js/controllers/controller.js +1 -1
- data/lib/api_browser/app/js/controllers/menu.js +5 -3
- data/lib/api_browser/app/js/controllers/type.js +5 -5
- data/lib/api_browser/app/js/directives/attribute_description.js +5 -5
- data/lib/api_browser/app/js/directives/attribute_table.js +1 -1
- data/lib/api_browser/app/js/directives/attribute_table_row.js +2 -2
- data/lib/api_browser/app/js/directives/no_container.js +1 -1
- data/lib/api_browser/app/js/directives/request_body.js +5 -5
- data/lib/api_browser/app/js/directives/request_headers.js +3 -6
- data/lib/api_browser/app/js/directives/request_parameters.js +3 -6
- data/lib/api_browser/app/js/directives/type_label.js +4 -5
- data/lib/api_browser/app/js/factories/Documentation.js +4 -4
- data/lib/api_browser/app/js/factories/PayloadTemplates.js +2 -2
- data/lib/api_browser/app/js/factories/TypeTemplates.js +3 -3
- data/lib/api_browser/app/js/filters/markdown.js +6 -0
- data/lib/api_browser/app/js/filters/resource_name.js +2 -2
- data/lib/api_browser/app/sass/modules/_header.scss +2 -7
- data/lib/api_browser/app/sass/{main.scss → praxis.scss} +0 -0
- data/lib/api_browser/app/sass/variables/_bootstrap-variables.scss +370 -367
- data/lib/api_browser/app/views/action.html +2 -2
- data/lib/api_browser/app/views/controller.html +2 -2
- data/lib/api_browser/app/views/directives/attribute_description.html +1 -1
- data/lib/api_browser/app/views/layout.html +2 -11
- data/lib/api_browser/app/views/navbar.html +9 -0
- data/lib/api_browser/app/views/resource/_actions.html +1 -1
- data/lib/api_browser/app/views/type.html +2 -2
- data/lib/api_browser/app/views/type/_details.html +2 -1
- data/lib/api_browser/bower.json +5 -0
- data/lib/api_browser/package.json +18 -7
- data/lib/praxis.rb +8 -3
- data/lib/praxis/action_definition.rb +28 -6
- data/lib/praxis/api_definition.rb +30 -2
- data/lib/praxis/api_general_info.rb +36 -0
- data/lib/praxis/bootloader.rb +1 -0
- data/lib/praxis/collection.rb +34 -0
- data/lib/praxis/controller.rb +7 -0
- data/lib/praxis/dispatcher.rb +3 -0
- data/lib/praxis/links.rb +2 -8
- data/lib/praxis/media_type.rb +6 -24
- data/lib/praxis/media_type_collection.rb +6 -2
- data/lib/praxis/plugin_concern.rb +2 -1
- data/lib/praxis/request.rb +24 -15
- data/lib/praxis/request_stages/request_stage.rb +19 -4
- data/lib/praxis/request_stages/validate_params_and_headers.rb +1 -1
- data/lib/praxis/request_stages/validate_payload.rb +1 -1
- data/lib/praxis/resource_definition.rb +45 -10
- data/lib/praxis/response_definition.rb +46 -27
- data/lib/praxis/restful_doc_generator.rb +94 -7
- data/lib/praxis/simple_media_type.rb +2 -9
- data/lib/praxis/stage.rb +1 -4
- data/lib/praxis/tasks/api_docs.rb +51 -19
- data/lib/praxis/tasks/routes.rb +19 -15
- data/lib/praxis/types/media_type_common.rb +31 -0
- data/lib/praxis/types/multipart.rb +4 -4
- data/lib/praxis/version.rb +1 -1
- data/praxis.gemspec +2 -2
- data/spec/api_browser/factories/documentation_spec.js +50 -0
- data/spec/api_browser/filters/attribute_name_spec.js +23 -0
- data/spec/functional_spec.rb +62 -10
- data/spec/praxis/action_definition_spec.rb +12 -4
- data/spec/praxis/api_definition_spec.rb +159 -0
- data/spec/praxis/api_general_info_spec.rb +36 -0
- data/spec/praxis/bootloader_spec.rb +10 -1
- data/spec/praxis/media_type_collection_spec.rb +46 -53
- data/spec/praxis/media_type_spec.rb +6 -6
- data/spec/praxis/request_stage_spec.rb +7 -2
- data/spec/praxis/request_stages_validate_spec.rb +12 -7
- data/spec/praxis/resource_definition_spec.rb +62 -0
- data/spec/praxis/response_definition_spec.rb +26 -16
- data/spec/praxis/stage_spec.rb +4 -8
- data/spec/praxis/types/collection_spec.rb +144 -0
- data/spec/spec_app/app/controllers/instances.rb +8 -2
- data/spec/spec_app/design/api.rb +11 -0
- data/spec/spec_app/design/media_types/instance.rb +12 -0
- data/spec/spec_app/design/media_types/volume.rb +9 -2
- data/spec/spec_app/design/media_types/volume_snapshot.rb +9 -6
- data/spec/spec_app/design/resources/instances.rb +25 -10
- data/spec/support/spec_media_types.rb +1 -1
- data/spec/support/spec_resource_definitions.rb +2 -0
- data/tasks/thor/app.rb +15 -10
- data/tasks/thor/example.rb +115 -115
- data/tasks/thor/templates/generator/empty_app/.gitignore +2 -0
- data/tasks/thor/templates/generator/empty_app/docs/app.js +1 -0
- data/tasks/thor/templates/generator/empty_app/docs/styles.scss +3 -0
- metadata +50 -9
- data/lib/api_browser/app/css/main.css +0 -4511
- data/lib/praxis/types/collection.rb +0 -17
data/spec/spec_app/design/api.rb
CHANGED
@@ -24,4 +24,15 @@ Praxis::ApiDefinition.define do
|
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
|
+
info do # applies to all API infos
|
28
|
+
name "Spec App"
|
29
|
+
title "A simple App to do some simple integration testing"
|
30
|
+
description "This example API should really be replaced by a set of more full-fledged example apps in the future"
|
31
|
+
end
|
32
|
+
|
33
|
+
info("1.0") do # Applies to 1.0 version (and inherits everything else form the global one)
|
34
|
+
description "A simple 1.0 App"
|
35
|
+
base_path "/"
|
36
|
+
end
|
37
|
+
|
27
38
|
end
|
@@ -10,6 +10,8 @@ class Instance < Praxis::MediaType
|
|
10
10
|
|
11
11
|
attribute :root_volume, Volume
|
12
12
|
|
13
|
+
attribute :volumes, Volume::Collection
|
14
|
+
|
13
15
|
links do
|
14
16
|
link :root_volume
|
15
17
|
link :other_volume, Volume, using: :data_volume
|
@@ -32,4 +34,14 @@ class Instance < Praxis::MediaType
|
|
32
34
|
attribute :name
|
33
35
|
end
|
34
36
|
|
37
|
+
view :extended, include_nil: true do
|
38
|
+
attribute :id
|
39
|
+
attribute :name
|
40
|
+
attribute :root_volume
|
41
|
+
attribute :links do
|
42
|
+
attribute :root_volume
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
|
35
47
|
end
|
@@ -7,12 +7,12 @@ class Volume < Praxis::MediaType
|
|
7
7
|
|
8
8
|
attribute :source, VolumeSnapshot
|
9
9
|
|
10
|
-
# returns VolumeSnapshot::Collection if exists
|
11
10
|
attribute :snapshots, Praxis::Collection.of(VolumeSnapshot)
|
11
|
+
attribute :snapshots_summary, VolumeSnapshot::CollectionSummary
|
12
12
|
|
13
13
|
links do
|
14
14
|
link :source
|
15
|
-
link :snapshots
|
15
|
+
link :snapshots, VolumeSnapshot::CollectionSummary, using: :snapshots_summary
|
16
16
|
end
|
17
17
|
|
18
18
|
end
|
@@ -22,6 +22,7 @@ class Volume < Praxis::MediaType
|
|
22
22
|
attribute :name
|
23
23
|
attribute :source
|
24
24
|
attribute :snapshots
|
25
|
+
|
25
26
|
attribute :links
|
26
27
|
end
|
27
28
|
|
@@ -29,6 +30,12 @@ class Volume < Praxis::MediaType
|
|
29
30
|
attribute :id
|
30
31
|
end
|
31
32
|
|
33
|
+
class Collection < Praxis::Collection
|
34
|
+
member_type Volume
|
35
|
+
|
36
|
+
identifier 'application/vnd.acme.volumes'
|
37
|
+
end
|
38
|
+
|
32
39
|
end
|
33
40
|
|
34
41
|
|
@@ -16,24 +16,27 @@ class VolumeSnapshot < Praxis::MediaType
|
|
16
16
|
end
|
17
17
|
|
18
18
|
|
19
|
-
class
|
20
|
-
identifier 'application/json
|
21
|
-
|
22
|
-
member_type VolumeSnapshot
|
19
|
+
class CollectionSummary < Praxis::MediaType
|
20
|
+
identifier 'application/json'
|
23
21
|
|
24
22
|
attributes do
|
25
23
|
attribute :name, String, regexp: /snapshots-(\w+)/
|
26
|
-
attribute :size, Integer
|
24
|
+
attribute :size, Integer
|
27
25
|
attribute :href, String
|
28
26
|
end
|
29
27
|
|
28
|
+
view :default do
|
29
|
+
attribute :name
|
30
|
+
attribute :size
|
31
|
+
attribute :href
|
32
|
+
end
|
33
|
+
|
30
34
|
view :link do
|
31
35
|
attribute :name
|
32
36
|
attribute :size
|
33
37
|
attribute :href
|
34
38
|
end
|
35
39
|
|
36
|
-
member_view :default, using: :default
|
37
40
|
end
|
38
41
|
|
39
42
|
end
|
@@ -4,13 +4,11 @@ module ApiResources
|
|
4
4
|
|
5
5
|
media_type Instance
|
6
6
|
version '1.0'
|
7
|
-
|
8
|
-
#responses :instance_limit_reached
|
9
|
-
#responses :pay_us_money
|
10
|
-
#response :create, location: /instances/
|
11
|
-
|
12
7
|
|
13
|
-
|
8
|
+
# :show action is the canonical path for this resource.
|
9
|
+
# Note that the following is redundant, since :show is the default canonical path if none is defined.
|
10
|
+
canonical_path :show
|
11
|
+
|
14
12
|
routing do
|
15
13
|
prefix '/clouds/:cloud_id/instances'
|
16
14
|
end
|
@@ -30,17 +28,17 @@ module ApiResources
|
|
30
28
|
get ''
|
31
29
|
end
|
32
30
|
|
33
|
-
response_content_type = self.resource_definition.media_type.identifier + ";type=collection"
|
34
31
|
params do
|
35
|
-
attribute :response_content_type, String, default:
|
32
|
+
attribute :response_content_type, String, default: 'application/vnd.acme.instance;type=collection'
|
36
33
|
end
|
34
|
+
|
37
35
|
headers do
|
38
36
|
# BOTH ARE EQUIVALENT
|
39
37
|
#key "FOO", String, required: true
|
40
38
|
header "FOO", /bar/
|
41
39
|
end
|
42
40
|
|
43
|
-
response :ok, media_type:
|
41
|
+
response :ok, media_type: Praxis::Collection.of(Instance)
|
44
42
|
end
|
45
43
|
|
46
44
|
action :show do
|
@@ -53,7 +51,7 @@ module ApiResources
|
|
53
51
|
response :unauthorized
|
54
52
|
|
55
53
|
params do
|
56
|
-
attribute :id
|
54
|
+
attribute :id, required: true
|
57
55
|
attribute :junk, String, default: ''
|
58
56
|
attribute :some_date, DateTime, default: DateTime.parse('2012-12-21')
|
59
57
|
attribute :fail_filter, Attributor::Boolean, default: false
|
@@ -160,6 +158,23 @@ module ApiResources
|
|
160
158
|
response :ok, media_type: 'application/json'
|
161
159
|
end
|
162
160
|
|
161
|
+
action :update do
|
162
|
+
routing do
|
163
|
+
patch '/:id'
|
164
|
+
end
|
165
|
+
|
166
|
+
params do
|
167
|
+
attribute :id, required: true
|
168
|
+
end
|
169
|
+
|
170
|
+
payload do
|
171
|
+
attribute :name
|
172
|
+
attribute :root_volume
|
173
|
+
end
|
174
|
+
|
175
|
+
response :ok
|
176
|
+
end
|
177
|
+
|
163
178
|
# OTHER USAGES:
|
164
179
|
# note: these are all hypothetical, pending, brainstorming usages.
|
165
180
|
|
@@ -3,7 +3,7 @@ class Person < Praxis::MediaType
|
|
3
3
|
attribute :id, Integer
|
4
4
|
attribute :name, String, example: /[:name:]/
|
5
5
|
attribute :href, String, example: proc { |person| "/people/#{person.id}" }
|
6
|
-
attribute :links, Praxis::Collection.of(String)
|
6
|
+
attribute :links, silence_warnings { Praxis::Collection.of(String) }
|
7
7
|
end
|
8
8
|
|
9
9
|
view :default do
|
data/tasks/thor/app.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
module PraxisGen
|
2
2
|
class App < Thor
|
3
3
|
include Thor::Actions
|
4
|
-
|
4
|
+
|
5
5
|
namespace "praxis:app"
|
6
6
|
def self.source_root
|
7
7
|
File.dirname(__FILE__) + "/templates/generator/empty_app"
|
8
8
|
end
|
9
|
-
|
9
|
+
|
10
10
|
argument :app_name, required: true
|
11
11
|
desc "new", "Generates a blank new app under <app_name> (with a full skeleton ready to start coding)"
|
12
|
-
|
12
|
+
|
13
13
|
# Generator for a blank new app (with a full skeleton ready to get you going)
|
14
14
|
def new
|
15
15
|
puts "Creating new blank Praxis app under #{app_name}"
|
@@ -18,31 +18,36 @@ module PraxisGen
|
|
18
18
|
create_app
|
19
19
|
create_design
|
20
20
|
create_spec
|
21
|
+
create_docs
|
21
22
|
end
|
22
|
-
|
23
|
-
private
|
23
|
+
|
24
|
+
private
|
24
25
|
def create_root_files
|
25
26
|
['config.ru','Gemfile','Guardfile','Rakefile','README.md'].each do |file|
|
26
27
|
copy_file file, "#{app_name}/#{file}"
|
27
28
|
end
|
28
29
|
end
|
29
|
-
|
30
|
+
|
30
31
|
def create_config
|
31
32
|
copy_file "config/environment.rb", "#{app_name}/config/environment.rb"
|
32
33
|
copy_file "config/rainbows.rb", "#{app_name}/config/rainbows.rb"
|
33
34
|
end
|
34
|
-
|
35
|
+
|
35
36
|
def create_app
|
36
37
|
directory "app", "#{app_name}/app", :recursive => true
|
37
38
|
end
|
38
|
-
|
39
|
+
|
39
40
|
def create_design
|
40
41
|
directory "design", "#{app_name}/design", :recursive => true
|
41
42
|
end
|
42
|
-
|
43
|
+
|
43
44
|
def create_spec
|
44
45
|
directory "spec", "#{app_name}/spec", :recursive => true
|
45
46
|
end
|
46
|
-
|
47
|
+
|
48
|
+
def create_docs
|
49
|
+
directory "docs", "#{app_name}/docs", :recursive => true
|
50
|
+
end
|
51
|
+
|
47
52
|
end
|
48
53
|
end
|
data/tasks/thor/example.rb
CHANGED
@@ -9,7 +9,7 @@ module PraxisGen
|
|
9
9
|
desc "new", "Generates a new 'hello world' example application under an <app_name> directory"
|
10
10
|
|
11
11
|
def new
|
12
|
-
puts "GENERATION
|
12
|
+
puts "GENERATION COMMENCED!! (for #{app_name})"
|
13
13
|
# Fix weird symbols in the app name (if they are)
|
14
14
|
@app_name = app_name.downcase.gsub(/[^a-z0-9_\/.]/, '')
|
15
15
|
# Generate a new app
|
@@ -30,7 +30,7 @@ module PraxisGen
|
|
30
30
|
puts " # terminal 1:"
|
31
31
|
puts " cd #{app_name}"
|
32
32
|
puts " bundle"
|
33
|
-
puts "
|
33
|
+
puts " bundle exec rackup"
|
34
34
|
puts
|
35
35
|
puts " # terminal 2:"
|
36
36
|
puts " curl -i http://localhost:8888/api/hello -H 'X-Api-Version: 1.0' -X GET # Index"
|
@@ -74,29 +74,29 @@ private
|
|
74
74
|
def generate_config_environment_rb
|
75
75
|
create_file path('config/environment.rb') do
|
76
76
|
<<-RUBY
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
end
|
93
|
-
map :app, 'app/' do
|
94
|
-
map :models, 'models/**/*'
|
95
|
-
map :controllers, '**/controllers/**/*'
|
96
|
-
map :responses, '**/responses/**/*'
|
97
|
-
end
|
77
|
+
# Main entry point - DO NOT MODIFY THIS FILE
|
78
|
+
ENV['RACK_ENV'] ||= 'development'
|
79
|
+
|
80
|
+
Bundler.require(:default, ENV['RACK_ENV'])
|
81
|
+
|
82
|
+
# Default application layout.
|
83
|
+
# NOTE: This layout need NOT be specified explicitly.
|
84
|
+
# It is provided just for illustration.
|
85
|
+
Praxis::Application.instance.layout do
|
86
|
+
map :initializers, 'config/initializers/**/*'
|
87
|
+
map :lib, 'lib/**/*'
|
88
|
+
map :design, 'design/' do
|
89
|
+
map :api, 'api.rb'
|
90
|
+
map :media_types, '**/media_types/**/*'
|
91
|
+
map :resources, '**/resources/**/*'
|
98
92
|
end
|
99
|
-
|
93
|
+
map :app, 'app/' do
|
94
|
+
map :models, 'models/**/*'
|
95
|
+
map :controllers, '**/controllers/**/*'
|
96
|
+
map :responses, '**/responses/**/*'
|
97
|
+
end
|
98
|
+
end
|
99
|
+
RUBY
|
100
100
|
end
|
101
101
|
nil
|
102
102
|
end
|
@@ -109,16 +109,16 @@ private
|
|
109
109
|
def generate_gemfile
|
110
110
|
create_file path('Gemfile') do
|
111
111
|
<<-RUBY
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
112
|
+
source 'https://rubygems.org'
|
113
|
+
|
114
|
+
gem 'praxis'
|
115
|
+
gem 'rack', '~> 1.0'
|
116
|
+
gem 'rake'
|
117
|
+
|
118
|
+
group :development, :test do
|
119
|
+
gem 'rspec'
|
120
|
+
end
|
121
|
+
RUBY
|
122
122
|
end
|
123
123
|
nil
|
124
124
|
end
|
@@ -131,9 +131,9 @@ private
|
|
131
131
|
def generate_rakefile
|
132
132
|
create_file path('Rakefile') do
|
133
133
|
<<-RUBY
|
134
|
-
|
135
|
-
|
136
|
-
|
134
|
+
require 'praxis'
|
135
|
+
require 'praxis/tasks'
|
136
|
+
RUBY
|
137
137
|
end
|
138
138
|
nil
|
139
139
|
end
|
@@ -146,17 +146,17 @@ private
|
|
146
146
|
def generate_config_ru
|
147
147
|
create_file path('config.ru') do
|
148
148
|
<<-RUBY
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
149
|
+
#\\ -p 8888
|
150
|
+
|
151
|
+
require 'bundler/setup'
|
152
|
+
require 'praxis'
|
153
|
+
|
154
|
+
application = Praxis::Application.instance
|
155
|
+
application.logger = Logger.new(STDOUT)
|
156
|
+
application.setup
|
157
|
+
|
158
|
+
run application
|
159
|
+
RUBY
|
160
160
|
end
|
161
161
|
nil
|
162
162
|
end
|
@@ -165,62 +165,62 @@ private
|
|
165
165
|
def generate_app_definitions_hello_world
|
166
166
|
create_file path('design/api.rb') do
|
167
167
|
<<-RUBY
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
end
|
168
|
+
# Use this file to define your response templates and traits.
|
169
|
+
#
|
170
|
+
# For example, to define a response template:
|
171
|
+
# response_template :custom do |media_type:|
|
172
|
+
# status 200
|
173
|
+
# media_type media_type
|
174
|
+
# end
|
175
|
+
Praxis::ApiDefinition.define do
|
176
|
+
trait :versionable do
|
177
|
+
headers do
|
178
|
+
key "X-Api-Version", String, values: ['1.0'], required: true
|
180
179
|
end
|
181
180
|
end
|
182
|
-
|
181
|
+
end
|
182
|
+
RUBY
|
183
183
|
end
|
184
184
|
|
185
185
|
create_file path('design/resources/hello.rb') do
|
186
186
|
<<-RUBY
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
187
|
+
module V1
|
188
|
+
module ApiResources
|
189
|
+
class Hello
|
190
|
+
include Praxis::ResourceDefinition
|
191
|
+
|
192
|
+
media_type V1::MediaTypes::Hello
|
193
|
+
version '1.0'
|
194
|
+
|
195
|
+
routing do
|
196
|
+
prefix '/api/hello'
|
197
|
+
end
|
198
|
+
|
199
|
+
action :index do
|
200
|
+
use :versionable
|
201
|
+
|
195
202
|
routing do
|
196
|
-
|
203
|
+
get ''
|
197
204
|
end
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
205
|
+
response :ok
|
206
|
+
end
|
207
|
+
|
208
|
+
action :show do
|
209
|
+
use :versionable
|
210
|
+
|
211
|
+
routing do
|
212
|
+
get '/:id'
|
206
213
|
end
|
207
|
-
|
208
|
-
|
209
|
-
use :versionable
|
210
|
-
|
211
|
-
routing do
|
212
|
-
get '/:id'
|
213
|
-
end
|
214
|
-
params do
|
215
|
-
attribute :id, Integer, required: true, min: 0
|
216
|
-
end
|
217
|
-
response :ok
|
218
|
-
response :not_found
|
214
|
+
params do
|
215
|
+
attribute :id, Integer, required: true, min: 0
|
219
216
|
end
|
217
|
+
response :ok
|
218
|
+
response :not_found
|
220
219
|
end
|
221
220
|
end
|
222
221
|
end
|
223
|
-
|
222
|
+
end
|
223
|
+
RUBY
|
224
224
|
end
|
225
225
|
|
226
226
|
create_file path('design/media_types/hello.rb') do
|
@@ -249,33 +249,33 @@ private
|
|
249
249
|
def generate_app_controllers_hello_world
|
250
250
|
create_file path('app/controllers/hello.rb') do
|
251
251
|
<<-RUBY
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
end
|
273
|
-
response.headers['Content-Type'] = 'application/json'
|
274
|
-
response
|
252
|
+
module V1
|
253
|
+
class Hello
|
254
|
+
include Praxis::Controller
|
255
|
+
|
256
|
+
implements V1::ApiResources::Hello
|
257
|
+
|
258
|
+
HELLO_WORLD = [ 'Hello world!', 'Привет мир!', 'Hola mundo!', '你好世界!', 'こんにちは世界!' ]
|
259
|
+
|
260
|
+
def index(**params)
|
261
|
+
response.headers['Content-Type'] = 'application/json'
|
262
|
+
response.body = HELLO_WORLD.to_json
|
263
|
+
response
|
264
|
+
end
|
265
|
+
|
266
|
+
def show(id:, **other_params)
|
267
|
+
hello = HELLO_WORLD[id]
|
268
|
+
if hello
|
269
|
+
response.body = { id: id, data: hello }
|
270
|
+
else
|
271
|
+
self.response = Praxis::Responses::NotFound.new
|
275
272
|
end
|
273
|
+
response.headers['Content-Type'] = 'application/json'
|
274
|
+
response
|
276
275
|
end
|
277
276
|
end
|
278
|
-
|
277
|
+
end
|
278
|
+
RUBY
|
279
279
|
end
|
280
280
|
end
|
281
281
|
|