praxis 0.22.pre.2 → 2.0.pre.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +323 -324
  3. data/lib/praxis/action_definition.rb +7 -9
  4. data/lib/praxis/api_definition.rb +27 -44
  5. data/lib/praxis/api_general_info.rb +2 -3
  6. data/lib/praxis/application.rb +14 -141
  7. data/lib/praxis/bootloader.rb +1 -2
  8. data/lib/praxis/bootloader_stages/environment.rb +13 -0
  9. data/lib/praxis/controller.rb +0 -2
  10. data/lib/praxis/dispatcher.rb +4 -6
  11. data/lib/praxis/docs/generator.rb +8 -18
  12. data/lib/praxis/docs/link_builder.rb +1 -1
  13. data/lib/praxis/error_handler.rb +5 -5
  14. data/lib/praxis/extensions/attribute_filtering/active_record_filter_query_builder.rb +1 -1
  15. data/lib/praxis/extensions/attribute_filtering/sequel_filter_query_builder.rb +125 -0
  16. data/lib/praxis/extensions/field_selection/active_record_query_selector.rb +16 -18
  17. data/lib/praxis/extensions/field_selection/sequel_query_selector.rb +5 -5
  18. data/lib/praxis/extensions/field_selection.rb +1 -12
  19. data/lib/praxis/extensions/rendering.rb +1 -1
  20. data/lib/praxis/file_group.rb +1 -1
  21. data/lib/praxis/handlers/xml.rb +1 -1
  22. data/lib/praxis/mapper/active_model_compat.rb +63 -0
  23. data/lib/praxis/mapper/resource.rb +242 -0
  24. data/lib/praxis/mapper/selector_generator.rb +126 -0
  25. data/lib/praxis/mapper/sequel_compat.rb +37 -0
  26. data/lib/praxis/middleware_app.rb +13 -15
  27. data/lib/praxis/multipart/part.rb +3 -5
  28. data/lib/praxis/plugins/mapper_plugin.rb +50 -0
  29. data/lib/praxis/request.rb +14 -7
  30. data/lib/praxis/request_stages/response.rb +2 -3
  31. data/lib/praxis/resource_definition.rb +10 -14
  32. data/lib/praxis/response.rb +6 -5
  33. data/lib/praxis/response_definition.rb +5 -7
  34. data/lib/praxis/response_template.rb +3 -4
  35. data/lib/praxis/responses/http.rb +36 -0
  36. data/lib/praxis/responses/internal_server_error.rb +12 -3
  37. data/lib/praxis/responses/multipart_ok.rb +11 -4
  38. data/lib/praxis/responses/validation_error.rb +10 -1
  39. data/lib/praxis/router.rb +3 -3
  40. data/lib/praxis/tasks/api_docs.rb +2 -10
  41. data/lib/praxis/tasks/routes.rb +0 -1
  42. data/lib/praxis/version.rb +1 -1
  43. data/lib/praxis.rb +13 -9
  44. data/praxis.gemspec +2 -3
  45. data/spec/functional_spec.rb +0 -1
  46. data/spec/praxis/action_definition_spec.rb +15 -26
  47. data/spec/praxis/api_definition_spec.rb +8 -13
  48. data/spec/praxis/api_general_info_spec.rb +8 -3
  49. data/spec/praxis/application_spec.rb +7 -13
  50. data/spec/praxis/handlers/xml_spec.rb +2 -2
  51. data/spec/praxis/mapper/resource_spec.rb +169 -0
  52. data/spec/praxis/mapper/selector_generator_spec.rb +301 -0
  53. data/spec/praxis/middleware_app_spec.rb +15 -9
  54. data/spec/praxis/request_spec.rb +7 -17
  55. data/spec/praxis/request_stages/validate_spec.rb +1 -1
  56. data/spec/praxis/resource_definition_spec.rb +10 -12
  57. data/spec/praxis/response_definition_spec.rb +5 -22
  58. data/spec/praxis/response_spec.rb +5 -12
  59. data/spec/praxis/responses/internal_server_error_spec.rb +5 -2
  60. data/spec/praxis/router_spec.rb +4 -8
  61. data/spec/spec_app/app/models/person.rb +3 -3
  62. data/spec/spec_app/config/environment.rb +3 -21
  63. data/spec/spec_app/config.ru +6 -1
  64. data/spec/spec_helper.rb +2 -17
  65. data/spec/support/spec_resources.rb +131 -0
  66. metadata +19 -31
  67. data/lib/praxis/extensions/attribute_filtering/query_builder.rb +0 -39
  68. data/lib/praxis/extensions/attribute_filtering.rb +0 -28
  69. data/lib/praxis/extensions/mapper_selectors.rb +0 -16
  70. data/lib/praxis/media_type_collection.rb +0 -127
  71. data/lib/praxis/plugins/praxis_mapper_plugin.rb +0 -246
  72. data/spec/praxis/media_type_collection_spec.rb +0 -157
  73. data/spec/praxis/plugins/praxis_mapper_plugin_spec.rb +0 -142
@@ -12,7 +12,6 @@ module Praxis
12
12
 
13
13
  attr_reader :name
14
14
  attr_reader :resource_definition
15
- attr_reader :api_definition
16
15
  attr_reader :routes
17
16
  attr_reader :primary_route
18
17
  attr_reader :named_routes
@@ -40,7 +39,6 @@ module Praxis
40
39
  @metadata = Hash.new
41
40
  @routes = []
42
41
  @traits = []
43
- @api_definition = resource_definition.application.api_definition
44
42
 
45
43
  if (media_type = resource_definition.media_type)
46
44
  if media_type.kind_of?(Class) && media_type < Praxis::Types::MediaTypeCommon
@@ -49,7 +47,7 @@ module Praxis
49
47
  end
50
48
 
51
49
  version = resource_definition.version
52
- api_info = api_definition.info(resource_definition.version)
50
+ api_info = ApiDefinition.instance.info(resource_definition.version)
53
51
 
54
52
  route_base = "#{api_info.base_path}#{resource_definition.version_prefix}"
55
53
  prefix = Array(resource_definition.routing_prefix)
@@ -66,11 +64,11 @@ module Praxis
66
64
  end
67
65
 
68
66
  def trait(trait_name)
69
- unless api_definition.traits.has_key? trait_name
67
+ unless ApiDefinition.instance.traits.has_key? trait_name
70
68
  raise Exceptions::InvalidTrait.new("Trait #{trait_name} not found in the system")
71
69
  end
72
70
 
73
- trait = api_definition.traits.fetch(trait_name)
71
+ trait = ApiDefinition.instance.traits.fetch(trait_name)
74
72
  trait.apply!(self)
75
73
  traits << trait_name
76
74
  end
@@ -92,7 +90,7 @@ module Praxis
92
90
  args[:media_type] = type
93
91
  end
94
92
 
95
- template = api_definition.response(name)
93
+ template = ApiDefinition.instance.response(name)
96
94
  @responses[name] = template.compile(self, **args)
97
95
  end
98
96
 
@@ -305,7 +303,7 @@ module Praxis
305
303
 
306
304
  # and return that one if it already corresponds to a registered handler
307
305
  # otherwise, add the encoding
308
- if resource_definition.application.handlers.include?(pick.handler_name)
306
+ if Praxis::Application.instance.handlers.include?(pick.handler_name)
309
307
  return pick
310
308
  else
311
309
  return pick + handler_name
@@ -322,13 +320,13 @@ module Praxis
322
320
 
323
321
  hash[:examples] = {}
324
322
 
325
- default_handlers = api_definition.info.consumes
323
+ default_handlers = ApiDefinition.instance.info.consumes
326
324
 
327
325
  default_handlers.each do |default_handler|
328
326
  dumped_payload = payload.dump(example, default_format: default_handler)
329
327
 
330
328
  content_type = derive_content_type(example, default_handler)
331
- handler = resource_definition.application.handlers[content_type.handler_name]
329
+ handler = Praxis::Application.instance.handlers[content_type.handler_name]
332
330
 
333
331
  # in case handler is nil, use dumped_payload as-is.
334
332
  generated_payload = if handler.nil?
@@ -1,57 +1,41 @@
1
+ require 'singleton'
1
2
  require 'forwardable'
2
3
 
3
4
  module Praxis
4
5
 
5
6
  class ApiDefinition
7
+ include Singleton
6
8
  extend Forwardable
7
9
 
8
10
  attr_reader :traits
9
11
  attr_reader :responses
10
12
  attr_reader :infos
11
13
  attr_reader :global_info
12
- attr_reader :application
13
14
 
14
15
  attr_accessor :versioning_scheme
15
16
 
16
- def self.instance
17
- i = Thread.current[:praxis_instance] || $praxis_initializing_instance
18
- raise "Trying to use Praxis::ApiDefinition outside the context of a Praxis::Application" unless i
19
- i.api_definition
20
- end
21
-
22
17
  def self.define(&block)
23
-
24
- definition = Praxis::Application.current_instance.api_definition
25
- if block.arity == 0
26
- definition.instance_eval(&block)
27
- else
28
- yield(definition)
29
- end
30
- end
31
-
32
- def define(&block)
33
18
  if block.arity == 0
34
- self.instance_eval(&block)
19
+ self.instance.instance_eval(&block)
35
20
  else
36
- yield(self)
21
+ yield(self.instance)
37
22
  end
38
23
  end
39
24
 
40
- def initialize(application)
41
- @application = application
25
+ def initialize
42
26
  @responses = Hash.new
43
27
  @traits = Hash.new
44
28
  @base_path = ''
45
29
 
46
- @global_info = ApiGeneralInfo.new(application: application)
30
+ @global_info = ApiGeneralInfo.new
47
31
 
48
32
  @infos = Hash.new do |hash, version|
49
- hash[version] = ApiGeneralInfo.new(@global_info, application: application, version: version)
33
+ hash[version] = ApiGeneralInfo.new(@global_info, version: version)
50
34
  end
51
35
  end
52
36
 
53
37
  def response_template(name, &block)
54
- @responses[name] = Praxis::ResponseTemplate.new(name, application, &block)
38
+ @responses[name] = Praxis::ResponseTemplate.new(name, &block)
55
39
  end
56
40
 
57
41
  def response(name)
@@ -107,26 +91,25 @@ module Praxis
107
91
  data
108
92
  end
109
93
 
110
- # CANNOT DEFINE IT AT FILE LOADING TIME: THE INSTANCE FOR THE API_DEFINITION IS NOT READY YET.
111
- # define do |api|
112
- # api.response_template :ok do |media_type: , location: nil, headers: nil, description: nil |
113
- # status 200
114
- # description( description || 'Standard response for successful HTTP requests.' )
115
- #
116
- # media_type media_type
117
- # location location
118
- # headers headers if headers
119
- # end
120
- #
121
- # api.response_template :created do |media_type: nil, location: nil, headers: nil, description: nil|
122
- # status 201
123
- # description( description || 'The request has been fulfilled and resulted in a new resource being created.' )
124
- #
125
- # media_type media_type if media_type
126
- # location location
127
- # headers headers if headers
128
- # end
129
- # end
94
+ define do |api|
95
+ api.response_template :ok do |media_type: , location: nil, headers: nil, description: nil |
96
+ status 200
97
+ description( description || 'Standard response for successful HTTP requests.' )
98
+
99
+ media_type media_type
100
+ location location
101
+ headers headers if headers
102
+ end
103
+
104
+ api.response_template :created do |media_type: nil, location: nil, headers: nil, description: nil|
105
+ status 201
106
+ description( description || 'The request has been fulfilled and resulted in a new resource being created.' )
107
+
108
+ media_type media_type if media_type
109
+ location location
110
+ headers headers if headers
111
+ end
112
+ end
130
113
 
131
114
  end
132
115
 
@@ -3,11 +3,10 @@ module Praxis
3
3
 
4
4
  attr_reader :version
5
5
 
6
- def initialize(global_info=nil, application:, version: nil)
6
+ def initialize(global_info=nil, version: nil)
7
7
  @data = Hash.new
8
8
  @global_info = global_info
9
9
  @version = version
10
- @application = application
11
10
 
12
11
  if @global_info.nil? # this *is* the global info
13
12
  version_with [:header, :params]
@@ -55,7 +54,7 @@ module Praxis
55
54
  get(:version_with)
56
55
  else
57
56
  if @global_info.nil? # this *is* the global info
58
- @application.versioning_scheme = val
57
+ Application.instance.versioning_scheme = val
59
58
  set(:version_with, val)
60
59
  else
61
60
  raise "Use of version_with is only allowed in the global part of " \
@@ -1,15 +1,16 @@
1
+ require 'singleton'
1
2
  require 'mustermann'
2
3
  require 'logger'
3
4
 
4
5
  module Praxis
5
6
  class Application
7
+ include Singleton
6
8
 
7
9
  attr_reader :router
8
10
  attr_reader :controllers
9
11
  attr_reader :resource_definitions
10
12
  attr_reader :app
11
13
  attr_reader :builder
12
- attr_reader :api_definition
13
14
 
14
15
  attr_accessor :bootloader
15
16
  attr_accessor :file_layout
@@ -24,30 +25,12 @@ module Praxis
24
25
 
25
26
  attr_accessor :versioning_scheme
26
27
 
27
- @@registered_apps = {}
28
28
 
29
- def self.registered_apps
30
- @@registered_apps
31
- end
32
-
33
- def self.instance
34
- i = current_instance
35
- return i if i
36
- $praxis_initializing_instance = self.new
37
- end
38
-
39
- def self.current_instance
40
- Thread.current[:praxis_instance] || $praxis_initializing_instance
41
- end
42
-
43
29
  def self.configure
44
- # Should fail (i.e., be nil) if it's not in initialization/setup or a runtime call
45
- yield(current_instance)
30
+ yield(self.instance)
46
31
  end
47
32
 
48
- def initialize(name: 'default', skip_registration: false)
49
- old = $praxis_initializing_instance
50
- $praxis_initializing_instance = self # ApiDefinition.new needs to get the instance...
33
+ def initialize
51
34
  @controllers = Set.new
52
35
  @resource_definitions = Set.new
53
36
 
@@ -68,135 +51,29 @@ module Praxis
68
51
  @config = Config.new
69
52
  @root = nil
70
53
  @logger = Logger.new(STDOUT)
71
- @api_definition = ApiDefinition.new(self)
72
-
73
- @api_definition.define do |api|
74
- api.response_template :ok do |media_type: , location: nil, headers: nil, description: nil |
75
- status 200
76
- description( description || 'Standard response for successful HTTP requests.' )
77
-
78
- media_type media_type
79
- location location
80
- headers headers if headers
81
- end
82
-
83
- api.response_template :created do |media_type: nil, location: nil, headers: nil, description: nil|
84
- status 201
85
- description( description || 'The request has been fulfilled and resulted in a new resource being created.' )
86
-
87
- media_type media_type if media_type
88
- location location
89
- headers headers if headers
90
- end
91
- end
92
-
93
- require 'praxis/responses/http'
94
- self.api_definition.define do |api|
95
- [
96
- [ :accepted, 202, "The request has been accepted for processing, but the processing has not been completed." ],
97
- [ :no_content, 204,"The server successfully processed the request, but is not returning any content."],
98
- [ :multiple_choices, 300,"Indicates multiple options for the resource that the client may follow."],
99
- [ :moved_permanently, 301,"This and all future requests should be directed to the given URI."],
100
- [ :found, 302,"The requested resource resides temporarily under a different URI."],
101
- [ :see_other, 303,"The response to the request can be found under another URI using a GET method"],
102
- [ :not_modified, 304,"Indicates that the resource has not been modified since the version specified by the request headers If-Modified-Since or If-Match."],
103
- [ :temporary_redirect, 307,"In this case, the request should be repeated with another URI; however, future requests should still use the original URI."],
104
- [ :bad_request, 400,"The request cannot be fulfilled due to bad syntax."],
105
- [ :unauthorized, 401,"Similar to 403 Forbidden, but specifically for use when authentication is required and has failed or has not yet been provided."],
106
- [ :forbidden, 403,"The request was a valid request, but the server is refusing to respond to it."],
107
- [ :not_found, 404,"The requested resource could not be found but may be available again in the future."],
108
- [ :method_not_allowed, 405,"A request was made of a resource using a request method not supported by that resource."],
109
- [ :not_acceptable, 406,"The requested resource is only capable of generating content not acceptable according to the Accept headers sent in the request."],
110
- [ :request_timeout, 408,"The server timed out waiting for the request."],
111
- [ :conflict, 409, "Indicates that the request could not be processed because of conflict in the request, such as an edit conflict in the case of multiple updates."],
112
- [ :precondition_failed, 412,"The server does not meet one of the preconditions that the requester put on the request."],
113
- [ :unprocessable_entity, 422,"The request was well-formed but was unable to be followed due to semantic errors."],
114
- ].each do |name, code, base_description|
115
- api.response_template name do |media_type: nil, location: nil, headers: nil, description: nil|
116
- status code
117
- description( description || base_description ) # description can "potentially" be overriden in an individual action.
118
-
119
- media_type media_type if media_type
120
- location location if location
121
- headers headers if headers
122
- end
123
- end
54
+ end
55
+
56
+
57
+ def setup(root: '.')
58
+ return self unless @app.nil?
59
+
60
+ @root = Pathname.new(root).expand_path
124
61
 
125
- end
126
-
127
- require 'praxis/responses/internal_server_error'
128
- self.api_definition.define do |api|
129
- api.response_template :internal_server_error do
130
- description "A generic error message, given when an unexpected condition was encountered and no more specific message is suitable."
131
- status 500
132
- media_type "application/json"
133
- end
134
- end
135
-
136
- require 'praxis/responses/validation_error'
137
- self.api_definition.define do |api|
138
- api.response_template :validation_error do
139
- description "An error message indicating that one or more elements of the request did not match the API specification for the action"
140
- status 400
141
- media_type "application/json"
142
- end
143
- end
144
-
145
-
146
- require 'praxis/responses/multipart_ok'
147
- self.api_definition.define do |api|
148
- api.response_template :multipart_ok do |media_type: Praxis::Types::MultipartArray|
149
- status 200
150
- media_type media_type
151
- end
152
- end
153
-
154
62
  builtin_handlers = {
155
63
  'plain' => Praxis::Handlers::Plain,
156
64
  'json' => Praxis::Handlers::JSON,
157
65
  'x-www-form-urlencoded' => Praxis::Handlers::WWWForm
158
66
  }
159
-
160
67
  # Register built-in handlers unless the app already provided its own
161
68
  builtin_handlers.each_pair do |name, handler|
162
69
  self.handler(name, handler) unless handlers.key?(name)
163
70
  end
164
-
165
- setup_initial_config!
166
-
167
- unless skip_registration
168
- if self.class.registered_apps[name]
169
- raise "A Praxis instance named #{name} has already been registered, please use the :name parameter to initialize them"
170
- end
171
- self.class.registered_apps[name] = self
172
- end
173
- $praxis_initializing_instance = old
174
- end
175
-
176
- def setup_initial_config!
177
- self.config do
178
- attribute :praxis do
179
- attribute :validate_responses, Attributor::Boolean, default: false
180
- attribute :validate_response_bodies, Attributor::Boolean, default: false
181
-
182
- attribute :show_exceptions, Attributor::Boolean, default: false
183
- attribute :x_cascade, Attributor::Boolean, default: true
184
- end
185
- end
186
- end
187
-
188
71
 
189
- def setup(root: '.')
190
- return self unless @app.nil?
191
- saved_value = $praxis_initializing_instance
192
- $praxis_initializing_instance = self
193
- @root = Pathname.new(root).expand_path
72
+ @bootloader.setup!
194
73
 
195
- bootloader.setup!
196
- builder.run(@router)
197
- @app = builder.to_app
74
+ @builder.run(@router)
75
+ @app = @builder.to_app
198
76
 
199
- $praxis_initializing_instance = saved_value
200
77
  self
201
78
  end
202
79
 
@@ -226,13 +103,9 @@ module Praxis
226
103
 
227
104
  def call(env)
228
105
  response = []
229
- old = Thread.current[:praxis_instance]
230
- Thread.current[:praxis_instance] = self
231
106
  Notifications.instrument 'rack.request.all'.freeze, response: response do
232
107
  response.push(*@app.call(env))
233
108
  end
234
- ensure
235
- Thread.current[:praxis_instance] = old
236
109
  end
237
110
 
238
111
  def layout(&block)
@@ -47,9 +47,8 @@ module Praxis
47
47
  stages << BootloaderStages::WarnUnloadedFiles.new(:warn_unloaded_files, application)
48
48
 
49
49
  after(:app) do
50
- Praxis::Mapper.finalize!
51
50
  Praxis::Blueprint.finalize!
52
- Praxis::ResourceDefinition.finalize!(application: self.application)
51
+ Praxis::ResourceDefinition.finalize!
53
52
  end
54
53
 
55
54
  end
@@ -8,6 +8,7 @@ module Praxis
8
8
  # 1) the environment.rb file - generic stuff for all environments
9
9
  # 2) "Deployer.environment".rb - environment specific stuff
10
10
  def execute
11
+ setup_initial_config!
11
12
 
12
13
  env_file = application.root + "config/environment.rb"
13
14
  require env_file if File.exists? env_file
@@ -36,6 +37,18 @@ module Praxis
36
37
  end
37
38
  end
38
39
 
40
+ # TODO: not really sure I like this here... but where else is better?
41
+ def setup_initial_config!
42
+ application.config do
43
+ attribute :praxis do
44
+ attribute :validate_responses, Attributor::Boolean, default: false
45
+ attribute :validate_response_bodies, Attributor::Boolean, default: false
46
+
47
+ attribute :show_exceptions, Attributor::Boolean, default: false
48
+ attribute :x_cascade, Attributor::Boolean, default: true
49
+ end
50
+ end
51
+ end
39
52
 
40
53
  end
41
54
 
@@ -20,8 +20,6 @@ module Praxis
20
20
  end
21
21
 
22
22
  definition.controller = self
23
- # `implements` should only be processed while the application initializes/setup
24
- # So we will use the `.instance` function to get the "current" application instance
25
23
  Application.instance.controllers << self
26
24
  end
27
25
 
@@ -28,13 +28,11 @@ module Praxis
28
28
  @deferred_callbacks[:after] << [conditions, block]
29
29
  end
30
30
 
31
- # Typically, this is only called from the router, and the app will always be known.
32
- # But we'll leave the application param as optional if we know there is a dispatcher in the thread
33
- def self.current(thread: Thread.current, application: nil)
31
+ def self.current(thread: Thread.current, application: Application.instance)
34
32
  thread[:praxis_dispatcher] ||= self.new(application: application)
35
33
  end
36
34
 
37
- def initialize(application:)
35
+ def initialize(application: Application.instance)
38
36
  @stages = []
39
37
  @application = application
40
38
  setup_stages!
@@ -106,9 +104,9 @@ module Praxis
106
104
  response_stage.run
107
105
 
108
106
  payload[:response] = controller.response
109
- controller.response.finish(application: application)
107
+ controller.response.finish
110
108
  rescue => e
111
- @application.error_handler.handle!(request, e, app: application)
109
+ @application.error_handler.handle!(request, e)
112
110
  end
113
111
  end
114
112
  end
@@ -5,8 +5,7 @@ module Praxis
5
5
  require 'active_support/core_ext/enumerable' # For index_by
6
6
 
7
7
  API_DOCS_DIRNAME = 'docs/api'
8
-
9
- attr_reader :app_instance
8
+
10
9
  attr_reader :resources_by_version, :types_by_id, :infos_by_version
11
10
  attr_reader :doc_root_dir
12
11
 
@@ -25,21 +24,13 @@ module Praxis
25
24
  Attributor::URI,
26
25
  ]).freeze
27
26
 
28
- def self.generate(root, name:, skip_sub_directory: false)
29
- instance = Praxis::Application.registered_apps[name]
30
- Thread.current[:praxis_instance] = instance
31
- self.new(root, instance: instance, name: name, skip_sub_directory: skip_sub_directory).save!
32
- Thread.current[:praxis_instance] = nil
33
- end
34
-
35
- def initialize(root, instance:, name:, skip_sub_directory:)
27
+
28
+ def initialize(root)
36
29
  require 'yaml'
37
30
  @resources_by_version = Hash.new do |h,k|
38
31
  h[k] = Set.new
39
32
  end
40
- @app_instance = instance
41
- subdir = skip_sub_directory ? nil : name
42
- initialize_directories(root, subdir: subdir )
33
+ initialize_directories(root)
43
34
 
44
35
  Attributor::AttributeResolver.current = Attributor::AttributeResolver.new
45
36
  collect_infos
@@ -57,10 +48,9 @@ module Praxis
57
48
 
58
49
  private
59
50
 
60
- def initialize_directories(root, subdir: nil )
51
+ def initialize_directories(root)
61
52
  @doc_root_dir = File.join(root, API_DOCS_DIRNAME)
62
- @doc_root_dir = File.join(@doc_root_dir, subdir) if subdir
63
-
53
+
64
54
  # remove previous data (and reset the directory)
65
55
  FileUtils.rm_rf @doc_root_dir if File.exists?(@doc_root_dir)
66
56
  FileUtils.mkdir_p @doc_root_dir unless File.exists? @doc_root_dir
@@ -68,7 +58,7 @@ module Praxis
68
58
 
69
59
  def collect_resources
70
60
  # load all resource definitions registered with Praxis
71
- app_instance.resource_definitions.map do |resource|
61
+ Praxis::Application.instance.resource_definitions.map do |resource|
72
62
  # skip resources with doc_visibility of :none
73
63
  next if resource.metadata[:doc_visibility] == :none
74
64
  version = resource.version
@@ -86,7 +76,7 @@ module Praxis
86
76
 
87
77
  def collect_infos
88
78
  # All infos. Including keys for `:global`, "n/a", and any string version
89
- @infos_by_version = app_instance.api_definition.describe
79
+ @infos_by_version = ApiDefinition.instance.describe
90
80
  end
91
81
 
92
82
 
@@ -20,7 +20,7 @@ module Praxis
20
20
 
21
21
  def endpoint
22
22
  @endpoint ||= begin
23
- endpoint = Application.current_instance.api_definition.global_info.documentation_url
23
+ endpoint = ApiDefinition.instance.global_info.documentation_url
24
24
  endpoint.gsub(/\/index\.html$/i, '/') if endpoint
25
25
  end
26
26
  end
@@ -1,15 +1,15 @@
1
1
  module Praxis
2
2
  class ErrorHandler
3
-
4
- def handle!(request, error, app:)
5
- app.logger.error error.inspect
3
+
4
+ def handle!(request, error)
5
+ Application.instance.logger.error error.inspect
6
6
  error.backtrace.each do |line|
7
- app.logger.error line
7
+ Application.instance.logger.error line
8
8
  end
9
9
 
10
10
  response = Responses::InternalServerError.new(error: error)
11
11
  response.request = request
12
- response.finish(application: app)
12
+ response.finish
13
13
  end
14
14
 
15
15
  end
@@ -23,7 +23,7 @@ module Praxis
23
23
  end
24
24
 
25
25
  # Base query to build upon
26
- def initialize(query: , model: )
26
+ def initialize(query: , model:)
27
27
  @query = query
28
28
  @table = model.table_name
29
29
  @last_join_alias = model.table_name