praxis 0.21 → 0.22.pre.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.travis.yml +20 -12
- data/CHANGELOG.md +24 -0
- data/CONTRIBUTING.md +4 -4
- data/README.md +11 -9
- data/lib/api_browser/app/js/directives/attribute_table.js +2 -1
- data/lib/api_browser/app/js/directives/conditional_requirements.js +13 -0
- data/lib/api_browser/app/js/directives/type_placeholder.js +10 -1
- data/lib/api_browser/app/js/factories/normalize_attributes.js +4 -2
- data/lib/api_browser/app/js/factories/template_for.js +5 -2
- data/lib/api_browser/app/js/filters/has_requirement.js +14 -0
- data/lib/api_browser/app/js/filters/tag_requirement.js +13 -0
- data/lib/api_browser/app/sass/praxis.scss +11 -0
- data/lib/api_browser/app/views/action.html +2 -2
- data/lib/api_browser/app/views/directives/attribute_description/member_options.html +2 -2
- data/lib/api_browser/app/views/directives/attribute_table.html +1 -1
- data/lib/api_browser/app/views/type.html +1 -1
- data/lib/api_browser/app/views/type/details.html +2 -2
- data/lib/api_browser/app/views/types/embedded/array.html +2 -0
- data/lib/api_browser/app/views/types/embedded/default.html +3 -1
- data/lib/api_browser/app/views/types/embedded/requirements.html +6 -0
- data/lib/api_browser/app/views/types/embedded/single_req.html +9 -0
- data/lib/api_browser/app/views/types/embedded/struct.html +14 -2
- data/lib/api_browser/app/views/types/standalone/array.html +1 -1
- data/lib/api_browser/app/views/types/standalone/struct.html +2 -1
- data/lib/api_browser/package.json +1 -1
- data/lib/praxis.rb +8 -6
- data/lib/praxis/action_definition.rb +9 -7
- data/lib/praxis/api_definition.rb +44 -27
- data/lib/praxis/api_general_info.rb +3 -2
- data/lib/praxis/application.rb +139 -20
- data/lib/praxis/bootloader.rb +2 -4
- data/lib/praxis/bootloader_stages/environment.rb +0 -13
- data/lib/praxis/controller.rb +2 -0
- data/lib/praxis/dispatcher.rb +16 -10
- data/lib/praxis/docs/generator.rb +20 -9
- data/lib/praxis/docs/link_builder.rb +1 -1
- data/lib/praxis/error_handler.rb +5 -5
- data/lib/praxis/extensions/attribute_filtering.rb +28 -0
- data/lib/praxis/extensions/attribute_filtering/active_record_filter_query_builder.rb +180 -0
- data/lib/praxis/extensions/attribute_filtering/filtering_params.rb +273 -0
- data/lib/praxis/extensions/attribute_filtering/query_builder.rb +39 -0
- data/lib/praxis/extensions/field_selection.rb +3 -0
- data/lib/praxis/extensions/field_selection/active_record_query_selector.rb +57 -0
- data/lib/praxis/extensions/field_selection/sequel_query_selector.rb +65 -0
- data/lib/praxis/extensions/rails_compat.rb +2 -0
- data/lib/praxis/extensions/rails_compat/request_methods.rb +19 -0
- data/lib/praxis/extensions/rendering.rb +1 -1
- data/lib/praxis/file_group.rb +1 -1
- data/lib/praxis/middleware_app.rb +26 -6
- data/lib/praxis/multipart/parser.rb +14 -2
- data/lib/praxis/multipart/part.rb +5 -3
- data/lib/praxis/plugins/praxis_mapper_plugin.rb +2 -2
- data/lib/praxis/plugins/rails_plugin.rb +104 -0
- data/lib/praxis/request.rb +8 -9
- data/lib/praxis/request_stages/response.rb +3 -2
- data/lib/praxis/request_superclassing.rb +11 -0
- data/lib/praxis/resource_definition.rb +14 -10
- data/lib/praxis/response.rb +6 -7
- data/lib/praxis/response_definition.rb +7 -5
- data/lib/praxis/response_template.rb +4 -3
- data/lib/praxis/responses/http.rb +0 -36
- data/lib/praxis/responses/internal_server_error.rb +3 -12
- data/lib/praxis/responses/multipart_ok.rb +4 -11
- data/lib/praxis/responses/validation_error.rb +1 -10
- data/lib/praxis/router.rb +3 -3
- data/lib/praxis/tasks/api_docs.rb +10 -2
- data/lib/praxis/tasks/routes.rb +1 -0
- data/lib/praxis/version.rb +1 -1
- data/praxis.gemspec +4 -5
- data/spec/functional_spec.rb +4 -6
- data/spec/praxis/action_definition_spec.rb +26 -15
- data/spec/praxis/api_definition_spec.rb +13 -8
- data/spec/praxis/api_general_info_spec.rb +3 -8
- data/spec/praxis/application_spec.rb +13 -7
- data/spec/praxis/middleware_app_spec.rb +24 -10
- data/spec/praxis/request_spec.rb +17 -7
- data/spec/praxis/request_stages/validate_spec.rb +1 -1
- data/spec/praxis/resource_definition_spec.rb +12 -10
- data/spec/praxis/response_definition_spec.rb +22 -5
- data/spec/praxis/response_spec.rb +12 -5
- data/spec/praxis/responses/internal_server_error_spec.rb +4 -7
- data/spec/praxis/responses/validation_error_spec.rb +2 -2
- data/spec/praxis/router_spec.rb +8 -4
- data/spec/spec_app/config.ru +1 -6
- data/spec/spec_helper.rb +3 -3
- data/tasks/thor/templates/generator/empty_app/Gemfile +3 -3
- metadata +36 -32
- data/.ruby-version +0 -1
- data/lib/praxis/stats.rb +0 -113
- data/spec/praxis/stats_spec.rb +0 -9
data/praxis.gemspec
CHANGED
@@ -11,7 +11,7 @@ Gem::Specification.new do |spec|
|
|
11
11
|
|
12
12
|
spec.email = ["blanquer@gmail.com","dane.jensen@gmail.com"]
|
13
13
|
|
14
|
-
spec.homepage = "https://github.com/
|
14
|
+
spec.homepage = "https://github.com/praxis/praxis"
|
15
15
|
spec.license = "MIT"
|
16
16
|
spec.required_ruby_version = ">=2.1"
|
17
17
|
|
@@ -20,8 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.bindir = 'bin'
|
21
21
|
spec.executables << 'praxis'
|
22
22
|
|
23
|
-
spec.add_dependency 'rack', '
|
24
|
-
spec.add_dependency 'mustermann', '
|
23
|
+
spec.add_dependency 'rack', '>= 1'
|
24
|
+
spec.add_dependency 'mustermann', '>=0', '<=1'
|
25
25
|
spec.add_dependency 'activesupport', '>= 3'
|
26
26
|
spec.add_dependency 'mime', '~> 0'
|
27
27
|
spec.add_dependency 'praxis-mapper', '~> 4.3'
|
@@ -29,9 +29,8 @@ Gem::Specification.new do |spec|
|
|
29
29
|
spec.add_dependency 'attributor', '~> 5.1'
|
30
30
|
spec.add_dependency 'thor', '~> 0.18'
|
31
31
|
spec.add_dependency 'terminal-table', '~> 1.4'
|
32
|
-
spec.add_dependency 'harness', '~> 2'
|
33
32
|
|
34
|
-
spec.add_development_dependency 'bundler'
|
33
|
+
spec.add_development_dependency 'bundler'
|
35
34
|
spec.add_development_dependency 'rake', '~> 0.9'
|
36
35
|
spec.add_development_dependency 'rake-notes', '~> 0'
|
37
36
|
if RUBY_PLATFORM !~ /java/
|
data/spec/functional_spec.rb
CHANGED
@@ -333,11 +333,11 @@ describe 'Functional specs' do
|
|
333
333
|
|
334
334
|
context 'wildcard verb routing' do
|
335
335
|
it 'can terminate instances with POST' do
|
336
|
-
post '/api/clouds/23/instances/1/terminate?api_version=1.0',
|
336
|
+
post '/api/clouds/23/instances/1/terminate?api_version=1.0', '', 'global_session' => session
|
337
337
|
expect(last_response.status).to eq(200)
|
338
338
|
end
|
339
339
|
it 'can terminate instances with DELETE' do
|
340
|
-
post '/api/clouds/23/instances/1/terminate?api_version=1.0',
|
340
|
+
post '/api/clouds/23/instances/1/terminate?api_version=1.0', '', 'global_session' => session
|
341
341
|
expect(last_response.status).to eq(200)
|
342
342
|
end
|
343
343
|
|
@@ -352,18 +352,16 @@ describe 'Functional specs' do
|
|
352
352
|
get '/api/clouds/23/otherinstances/_action/exceptional?api_version=1.0', nil, 'global_session' => session
|
353
353
|
expect(last_response.status).to eq(404)
|
354
354
|
end
|
355
|
-
|
356
|
-
|
357
355
|
end
|
358
356
|
|
359
357
|
context 'auth_plugin' do
|
360
358
|
it 'can terminate' do
|
361
|
-
post '/api/clouds/23/instances/1/terminate?api_version=1.0',
|
359
|
+
post '/api/clouds/23/instances/1/terminate?api_version=1.0', '', 'global_session' => session
|
362
360
|
expect(last_response.status).to eq(200)
|
363
361
|
end
|
364
362
|
|
365
363
|
it 'can not stop' do
|
366
|
-
post '/api/clouds/23/instances/1/stop?api_version=1.0',
|
364
|
+
post '/api/clouds/23/instances/1/stop?api_version=1.0', '', 'global_session' => session
|
367
365
|
expect(last_response.status).to eq(403)
|
368
366
|
end
|
369
367
|
end
|
@@ -1,6 +1,15 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Praxis::ActionDefinition do
|
4
|
+
|
5
|
+
before(:context) do
|
6
|
+
Thread.current[:praxis_instance] = Praxis::Application.new(name: 'action_definition_spec', skip_registration: true)
|
7
|
+
end
|
8
|
+
|
9
|
+
let(:praxis_instance) do
|
10
|
+
Thread.current[:praxis_instance]
|
11
|
+
end
|
12
|
+
|
4
13
|
class SpecMediaType < Praxis::MediaType
|
5
14
|
identifier 'application/json'
|
6
15
|
|
@@ -31,10 +40,8 @@ describe Praxis::ActionDefinition do
|
|
31
40
|
end
|
32
41
|
end
|
33
42
|
end
|
34
|
-
|
35
43
|
subject(:action) do
|
36
|
-
|
37
|
-
Praxis::ApiDefinition.define do |api|
|
44
|
+
praxis_instance.api_definition.define do |api|
|
38
45
|
api.response_template :ok do |media_type: , location: nil, headers: nil, description: nil |
|
39
46
|
status 200
|
40
47
|
|
@@ -42,6 +49,10 @@ describe Praxis::ActionDefinition do
|
|
42
49
|
location location
|
43
50
|
headers headers if headers
|
44
51
|
end
|
52
|
+
|
53
|
+
api.info do # applies to all API infos
|
54
|
+
base_path "/pref"
|
55
|
+
end
|
45
56
|
end
|
46
57
|
Praxis::ActionDefinition.new(:foo, resource_definition) do
|
47
58
|
routing { get '/:one' }
|
@@ -111,11 +122,11 @@ describe Praxis::ActionDefinition do
|
|
111
122
|
let(:traits) { {test: trait} }
|
112
123
|
|
113
124
|
before do
|
114
|
-
allow(
|
125
|
+
allow(praxis_instance.api_definition).to receive(:traits).and_return(traits)
|
115
126
|
end
|
116
127
|
|
117
128
|
its('params.attributes.keys') { should eq [:inherited, :app_name, :name, :one]}
|
118
|
-
its('routes.first.path.to_s') { should eq '/
|
129
|
+
its('routes.first.path.to_s') { should eq '/pref/foobars/hello_world/test_trait/:app_name/:one' }
|
119
130
|
its(:traits) { should eq [:test] }
|
120
131
|
|
121
132
|
it 'is reflected in the describe output' do
|
@@ -315,11 +326,9 @@ describe Praxis::ActionDefinition do
|
|
315
326
|
end
|
316
327
|
|
317
328
|
context 'with a base_path and base_params on ApiDefinition' do
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
api_def=Praxis::ApiDefinition.__send__(:new)
|
322
|
-
api_def.instance_eval do |api|
|
329
|
+
subject(:action) do
|
330
|
+
api_def=Praxis::ApiDefinition.new(praxis_instance)
|
331
|
+
api_def.define do |api|
|
323
332
|
|
324
333
|
api.info do
|
325
334
|
base_path '/apps/:app_name'
|
@@ -332,11 +341,13 @@ describe Praxis::ActionDefinition do
|
|
332
341
|
end
|
333
342
|
|
334
343
|
end
|
335
|
-
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
|
344
|
+
# No setter...and its fine to do it here as it would not be used in a runtime situation
|
345
|
+
praxis_instance.instance_variable_set(:@api_definition, api_def)
|
346
|
+
# Define the action after the api_definition is set (as it uses is config to setup the routes)
|
347
|
+
Praxis::ActionDefinition.new(:bar, resource_definition) do
|
348
|
+
routing { get '/:one' }
|
349
|
+
params { attribute :one, String }
|
350
|
+
end
|
340
351
|
end
|
341
352
|
|
342
353
|
its('routes.first.path.to_s') { should eq '/apps/:app_name/foobars/hello_world/:one' }
|
@@ -2,12 +2,18 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Praxis::ApiDefinition do
|
4
4
|
|
5
|
-
|
5
|
+
# TODO: perhaps grab the spec app instance from some global var...(instead of relying on the singleton compat method)
|
6
|
+
subject(:api){ Praxis::ApiDefinition.instance }
|
6
7
|
|
7
8
|
# Without getting a fresh new ApiDefinition it is very difficult to test stuff using the Singleton
|
8
9
|
# So for some tests we're gonna create a new instance and work with it to avoid the singleton issues
|
10
|
+
let(:app_instance){ double("AppInstance") }
|
11
|
+
before do
|
12
|
+
allow(app_instance).to receive(:versioning_scheme=).with([:header, :params])
|
13
|
+
end
|
14
|
+
|
9
15
|
let(:non_singleton_api) do
|
10
|
-
api_def=Praxis::ApiDefinition.
|
16
|
+
api_def=Praxis::ApiDefinition.new(app_instance)
|
11
17
|
api_def.instance_eval do |api|
|
12
18
|
api.response_template :template1, &Proc.new {}
|
13
19
|
api.trait :trait1, &Proc.new {}
|
@@ -32,12 +38,7 @@ describe Praxis::ApiDefinition do
|
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
35
|
-
context '
|
36
|
-
it 'should be a Singleton' do
|
37
|
-
expect(Praxis::ApiDefinition.ancestors).to include( Singleton )
|
38
|
-
expect(subject).to eq(Praxis::ApiDefinition.instance )
|
39
|
-
end
|
40
|
-
|
41
|
+
context 'initial definition' do
|
41
42
|
it 'has the :ok and :created response templates registered' do
|
42
43
|
expect(api.responses.keys).to include(:ok)
|
43
44
|
expect(api.responses.keys).to include(:created)
|
@@ -58,6 +59,10 @@ describe Praxis::ApiDefinition do
|
|
58
59
|
expect(api.responses.keys).to include(:foobar)
|
59
60
|
expect(api.response(:foobar)).to be_kind_of(Praxis::ResponseTemplate)
|
60
61
|
end
|
62
|
+
it 'stores the app instance' do
|
63
|
+
template = api.response(:template1)
|
64
|
+
expect(template.application).to be(app_instance)
|
65
|
+
end
|
61
66
|
end
|
62
67
|
|
63
68
|
context '.response' do
|
@@ -2,12 +2,7 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Praxis::ApiGeneralInfo do
|
4
4
|
|
5
|
-
subject(:info){ Praxis::ApiGeneralInfo.new }
|
6
|
-
|
7
|
-
before do
|
8
|
-
allow(Praxis::Application.instance).to receive(:versioning_scheme=).with([:header, :params])
|
9
|
-
end
|
10
|
-
|
5
|
+
subject(:info){ Praxis::ApiGeneralInfo.new(application: APP) }
|
11
6
|
|
12
7
|
let(:info_block) do
|
13
8
|
Proc.new do
|
@@ -64,8 +59,8 @@ describe Praxis::ApiGeneralInfo do
|
|
64
59
|
end
|
65
60
|
|
66
61
|
context 'base_path with versioning' do
|
67
|
-
let(:global_info){ Praxis::ApiGeneralInfo.new }
|
68
|
-
subject(:info){ Praxis::ApiGeneralInfo.new(global_info, version: '1.0') }
|
62
|
+
let(:global_info){ Praxis::ApiGeneralInfo.new(application: APP) }
|
63
|
+
subject(:info){ Praxis::ApiGeneralInfo.new(global_info, application: APP, version: '1.0') }
|
69
64
|
|
70
65
|
before do
|
71
66
|
global_info
|
@@ -3,7 +3,7 @@ require 'spec_helper'
|
|
3
3
|
describe Praxis::Application do
|
4
4
|
context 'configuration' do
|
5
5
|
subject(:app) do
|
6
|
-
app = Class.new(Praxis::Application).
|
6
|
+
app = Class.new(Praxis::Application).new(skip_registration: true)
|
7
7
|
|
8
8
|
config = Object.new
|
9
9
|
def config.define(key=nil, type=Attributor::Struct, **opts, &block)
|
@@ -45,7 +45,7 @@ describe Praxis::Application do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
context 'media type handlers' do
|
48
|
-
subject { Class.new(Praxis::Application).
|
48
|
+
subject { Class.new(Praxis::Application).new(skip_registration: true) }
|
49
49
|
|
50
50
|
before do
|
51
51
|
# don't actually bootload; we're merely running specs
|
@@ -94,12 +94,14 @@ describe Praxis::Application do
|
|
94
94
|
end
|
95
95
|
|
96
96
|
describe '#setup' do
|
97
|
-
subject {
|
98
|
-
|
97
|
+
subject { Praxis::Application.new(skip_registration: true) }
|
98
|
+
let(:boot_loader) { double("BL", setup!: true) }
|
99
|
+
let(:builder) { double("Builder", to_app: double('Rack app'), run: true) }
|
100
|
+
|
99
101
|
before do
|
100
|
-
# don't actually bootload; we're merely running specs
|
101
|
-
allow(subject
|
102
|
-
allow(subject
|
102
|
+
# don't actually bootload; we're merely running specs
|
103
|
+
allow(subject).to receive(:bootloader).and_return(boot_loader)
|
104
|
+
allow(subject).to receive(:builder).and_return(builder)
|
103
105
|
end
|
104
106
|
|
105
107
|
it 'is idempotent' do
|
@@ -112,5 +114,9 @@ describe Praxis::Application do
|
|
112
114
|
expect(subject.setup).to eq(subject)
|
113
115
|
expect(subject.setup).to eq(subject)
|
114
116
|
end
|
117
|
+
|
118
|
+
it 'creates an ApiDefinition that has a back-reference' do
|
119
|
+
expect(subject.api_definition.application).to eq(subject)
|
120
|
+
end
|
115
121
|
end
|
116
122
|
end
|
@@ -2,35 +2,49 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe Praxis::MiddlewareApp do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
let(:init_args){ { root: 'here', name: 'middleware_app_spec', skip_registration: true} }
|
6
|
+
let(:middleware) { Praxis::MiddlewareApp.for( init_args ) }
|
7
|
+
let(:instance){ middleware.new(target)}
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
context '.for' do
|
10
|
+
it 'does not initialize the Application instance yet' do
|
11
|
+
expect( Praxis::Application.instance ).to_not receive(:setup)
|
12
|
+
middleware
|
12
13
|
end
|
13
14
|
it 'returns its class' do
|
14
|
-
expect(
|
15
|
+
expect( middleware ).to be < Praxis::MiddlewareApp
|
15
16
|
end
|
16
17
|
end
|
17
18
|
|
18
19
|
context 'instantiated' do
|
20
|
+
subject{ instance }
|
19
21
|
let(:target_response){ [201,{}] }
|
20
22
|
let(:target){ double("target app", call: target_response) }
|
21
|
-
subject(:instance){ Praxis::MiddlewareApp.new(target)}
|
22
23
|
it 'saves the target app' do
|
23
24
|
expect(subject.target).to be(target)
|
24
25
|
end
|
26
|
+
it 'does not initialize the Application instance yet' do
|
27
|
+
expect( Praxis::Application.instance ).to_not receive(:setup)
|
28
|
+
subject
|
29
|
+
end
|
30
|
+
|
25
31
|
context '.call' do
|
32
|
+
let(:the_instance) { double("The instance", setup: nil) }
|
26
33
|
let(:env){ {} }
|
27
34
|
let(:praxis_response){ [200,{}] }
|
28
|
-
subject(:response){
|
35
|
+
subject(:response){ instance.call(env) }
|
29
36
|
before do
|
30
37
|
# always invokes the praxis app
|
31
|
-
expect( Praxis::Application
|
38
|
+
expect( Praxis::Application ).to receive(:new).once.and_return(the_instance)
|
39
|
+
expect( the_instance ).to receive(:call).with( env ).once.and_return(praxis_response)
|
40
|
+
allow( the_instance ).to receive(:setup).and_return(the_instance)
|
32
41
|
end
|
33
42
|
|
43
|
+
it 'does not explicitly call setup in the initialization (the app needs to do it at the right time)' do
|
44
|
+
expect( the_instance ).to_not receive(:setup)
|
45
|
+
subject
|
46
|
+
end
|
47
|
+
|
34
48
|
context 'properly handled (non-404 and 405) responses from praxis' do
|
35
49
|
it 'are returned straight through' do
|
36
50
|
expect( response ).to be(praxis_response)
|
data/spec/praxis/request_spec.rb
CHANGED
@@ -12,7 +12,17 @@ describe Praxis::Request do
|
|
12
12
|
env['HTTP_AUTHORIZATION'] = 'Secret'
|
13
13
|
env
|
14
14
|
end
|
15
|
-
|
15
|
+
let(:application) do
|
16
|
+
app = Praxis::Application.new(skip_registration: true)
|
17
|
+
app.versioning_scheme = [:header, :params]
|
18
|
+
app.handler 'json' , Praxis::Handlers::JSON
|
19
|
+
app.handler 'x-www-form-urlencoded', Praxis::Handlers::WWWForm
|
20
|
+
app.api_definition.info do # applies to all API infos
|
21
|
+
base_path "/api"
|
22
|
+
end
|
23
|
+
app
|
24
|
+
end
|
25
|
+
|
16
26
|
let(:action) { Instances.definition.actions[:show] }
|
17
27
|
|
18
28
|
let(:context) do
|
@@ -24,7 +34,7 @@ describe Praxis::Request do
|
|
24
34
|
end
|
25
35
|
|
26
36
|
subject(:request) do
|
27
|
-
request = Praxis::Request.new(env)
|
37
|
+
request = Praxis::Request.new(env, application: application)
|
28
38
|
request.action = action
|
29
39
|
request
|
30
40
|
end
|
@@ -37,10 +47,10 @@ describe Praxis::Request do
|
|
37
47
|
context 'path versioning' do
|
38
48
|
before do
|
39
49
|
allow(
|
40
|
-
|
50
|
+
application
|
41
51
|
).to receive(:versioning_scheme).and_return(:path)
|
42
52
|
allow(
|
43
|
-
|
53
|
+
application.api_definition.info
|
44
54
|
).to receive(:base_path).and_return('/api/v:api_version')
|
45
55
|
|
46
56
|
end
|
@@ -64,7 +74,7 @@ describe Praxis::Request do
|
|
64
74
|
let(:versioning_scheme){ Praxis::Request::VERSION_USING_DEFAULTS }
|
65
75
|
before do
|
66
76
|
allow(
|
67
|
-
|
77
|
+
application
|
68
78
|
).to receive(:versioning_scheme).and_return(versioning_scheme)
|
69
79
|
end
|
70
80
|
|
@@ -84,7 +94,7 @@ describe Praxis::Request do
|
|
84
94
|
|
85
95
|
before do
|
86
96
|
allow(
|
87
|
-
|
97
|
+
application.api_definition.info
|
88
98
|
).to receive(:base_path).and_return('/v:api_version')
|
89
99
|
end
|
90
100
|
it { should eq('5.0') }
|
@@ -209,7 +219,7 @@ describe Praxis::Request do
|
|
209
219
|
let(:parsed_result){ double("parsed") }
|
210
220
|
|
211
221
|
before do
|
212
|
-
|
222
|
+
application.handler 'xml', Praxis::Handlers::XML
|
213
223
|
end
|
214
224
|
|
215
225
|
after do
|
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
3
|
describe Praxis::RequestStages::Validate do
|
4
|
-
let(:dispatcher) { Praxis::Dispatcher.new }
|
4
|
+
let(:dispatcher) { Praxis::Dispatcher.new(application: APP) }
|
5
5
|
|
6
6
|
# Instances controller is defined in the 'app' folder and is already in scope. Using this
|
7
7
|
# controller for the specs instead of creating a simple controller.
|
@@ -101,12 +101,13 @@ describe Praxis::ResourceDefinition do
|
|
101
101
|
|
102
102
|
end
|
103
103
|
end
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
104
|
+
let(:praxis_application) do
|
105
|
+
app = Praxis::Application.new(skip_registration: true)
|
106
|
+
app.versioning_scheme = [:header, :params]
|
107
|
+
app.handler 'json' , Praxis::Handlers::JSON
|
108
|
+
app.handler 'x-www-form-urlencoded', Praxis::Handlers::WWWForm
|
109
|
+
app.api_definition.instance_eval do |api_def|
|
110
|
+
api_def.info do
|
110
111
|
base_path '/api/:base_param'
|
111
112
|
base_params do
|
112
113
|
attribute :base_param, String
|
@@ -116,22 +117,23 @@ describe Praxis::ResourceDefinition do
|
|
116
117
|
end
|
117
118
|
end
|
118
119
|
|
119
|
-
|
120
|
+
api_def.info '1.0' do
|
120
121
|
base_params do
|
121
122
|
attribute :app_name, String
|
122
123
|
end
|
123
124
|
end
|
124
|
-
|
125
|
+
api_def.info '2.0' do
|
125
126
|
base_params do
|
126
127
|
attribute :v2_param, String
|
127
128
|
end
|
128
129
|
end
|
130
|
+
|
129
131
|
end
|
130
|
-
|
132
|
+
app
|
131
133
|
end
|
132
134
|
|
133
135
|
before do
|
134
|
-
allow(Praxis::
|
136
|
+
allow(Praxis::Application).to receive(:instance).and_return(praxis_application)
|
135
137
|
end
|
136
138
|
|
137
139
|
it 'are applied to actions' do
|