angus 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
data/lib/angus/base.rb CHANGED
@@ -9,6 +9,7 @@ require_relative 'responses'
9
9
  require_relative 'renders/base'
10
10
  require_relative 'marshallings/base'
11
11
  require_relative 'base_actions'
12
+ require_relative 'definition_reader'
12
13
 
13
14
  require 'angus/sdoc'
14
15
 
@@ -18,15 +19,22 @@ module Angus
18
19
 
19
20
  FIRST_VERSION = '0.1'
20
21
 
22
+ PRODUCTION_ENV = :production
23
+ DEVELOPMENT_ENV = :development
24
+ TEST_ENV = :test
25
+ DEFAULT_ENV = DEVELOPMENT_ENV
26
+
27
+ attr_reader :definitions
28
+
21
29
  def initialize
22
30
  super
23
31
 
24
- @resources_definitions = []
25
- @version = FIRST_VERSION
26
- @name = self.class.name.downcase
27
- @configured = false
28
- @definitions = nil
29
- @logger = Logger.new(STDOUT)
32
+ @resources_definitions = []
33
+ @version = FIRST_VERSION
34
+ @name = self.class.name.downcase
35
+ @configured = false
36
+ @definitions = nil
37
+ @logger = Logger.new(STDOUT)
30
38
 
31
39
  configure!
32
40
 
@@ -40,18 +48,33 @@ module Angus
40
48
  end
41
49
  end
42
50
 
51
+ def production?
52
+ environment_name.to_sym == PRODUCTION_ENV
53
+ end
54
+
55
+ def development?
56
+ environment_name.to_sym == DEVELOPMENT_ENV
57
+ end
58
+
59
+ def test?
60
+ environment_name.to_sym == TEST_ENV
61
+ end
62
+
63
+ def environment_name
64
+ ENV['RACK_ENV'] || DEFAULT_ENV
65
+ end
66
+
43
67
  def configured?
44
68
  @configured
45
69
  end
46
70
 
47
- # TODO ver que hacer
48
71
  def configure
72
+ warn 'Empty configuration for service.'
49
73
  end
50
74
 
51
75
  def configure!
52
76
  raise 'Already configured' if configured?
53
77
 
54
- # TODO ver como hacer configurable
55
78
  @definitions = Angus::SDoc::DefinitionsReader.service_definition('definitions')
56
79
 
57
80
  configure
@@ -79,42 +102,32 @@ module Angus
79
102
 
80
103
  def register_resource_routes(resource_definition)
81
104
  resource_definition.operations.each do |operation|
82
- method = operation.method.to_sym
105
+ method = operation.http_method.to_sym
83
106
  op_path = "#{api_path}#{operation.path}"
84
107
 
85
108
  response_metadata = resource_definition.build_response_metadata(operation.response_elements)
86
109
 
87
110
  router.on(method, op_path) do |env, params|
88
111
  request = Rack::Request.new(env)
89
- params = Params.indifferent_params(params)
112
+ params = Params.indifferent_params(params)
113
+ response = Response.new
90
114
 
91
115
  resource = resource_definition.resource_class.new(request, params)
92
- @response['Content-Type'] = 'application/json'
93
-
94
- begin
95
- response = resource.send(operation.code_name)
116
+ response['Content-Type'] = 'application/json'
96
117
 
97
- response = {} unless response.is_a?(Hash)
118
+ op_response = resource.send(operation.code_name)
119
+ op_response = {} unless op_response.is_a?(Hash)
98
120
 
99
- messages = response.delete(:messages)
121
+ messages = op_response.delete(:messages)
100
122
 
101
- response = build_data_response(response, response_metadata, messages)
123
+ op_response = build_data_response(op_response, response_metadata, messages)
102
124
 
103
- @response.write(response)
104
- rescue Exception => error
105
- status_code = get_error_status_code(error)
106
- if status_code == Angus::Responses::HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR
107
- @logger.error("An exception occurs on #{resource.class.name}##{operation.code_name}")
108
- @logger.error(error)
109
- end
110
- response = build_error_response(error)
125
+ response.write(op_response)
111
126
 
112
- @response.status = status_code
113
- @response.write(response)
114
- end
127
+ response
115
128
  end
116
129
  end
117
130
  end
118
131
 
119
132
  end
120
- end
133
+ end
@@ -9,19 +9,25 @@ module Angus
9
9
  end
10
10
 
11
11
  def register_base_routes
12
- router.on(:get, '/') do
13
- render discover_paths
12
+ router.on(:get, '/') do |env, params|
13
+ response = Response.new
14
+
15
+ render(response, discover_paths)
14
16
  end
15
17
 
16
- router.on(:get, base_path) do
17
- render discover_paths
18
+ router.on(:get, base_path) do |env, params|
19
+ response = Response.new
20
+
21
+ render(response, discover_paths)
18
22
  end
19
23
 
20
24
  router.on(:get, doc_path) do |env, params|
25
+ response = Response.new
26
+
21
27
  if params[:format] == 'json'
22
- render(Angus::SDoc::JsonFormatter.format_service(@definitions), format: :json)
28
+ render(response, Angus::SDoc::JsonFormatter.format_service(@definitions), format: :json)
23
29
  else
24
- render(Angus::SDoc::HtmlFormatter.format_service(@definitions), format: :html)
30
+ render(response, Angus::SDoc::HtmlFormatter.format_service(@definitions), format: :html)
25
31
  end
26
32
  end
27
33
  end
@@ -0,0 +1,19 @@
1
+ module Angus
2
+ class DefinitionReader
3
+
4
+ attr_reader :definitions
5
+
6
+ def initialize
7
+ @definitions = SDoc::DefinitionsReader.service_definition('definitions')
8
+ end
9
+
10
+ def message_definition(key, level)
11
+ message = definitions.messages.find { |name, definition|
12
+ name == key.to_s && definition.level.downcase == level.downcase
13
+ }
14
+
15
+ message.last if message
16
+ end
17
+
18
+ end
19
+ end
@@ -7,4 +7,4 @@ Bundler.setup
7
7
  require 'angus'
8
8
  require 'services/<%= app_name %>'
9
9
 
10
- run <%= classify(name) %>.new
10
+ run <%= classify(name) %>.build
@@ -13,13 +13,13 @@ module Angus
13
13
  NEW_APP_DIRECTORIES = %W(#{DEFINITIONS_DIR} #{RESOURCES_DIR} #{SERVICES_DIR})
14
14
 
15
15
  NEW_APP_FILES = %w(
16
- Gemfile
17
- config.ru.erb
18
- services/service.rb.erb
19
- definitions/messages.yml
20
- definitions/representations.yml
21
- definitions/service.yml.erb
22
- )
16
+ Gemfile
17
+ config.ru.erb
18
+ services/service.rb.erb
19
+ definitions/messages.yml
20
+ definitions/representations.yml
21
+ definitions/service.yml.erb
22
+ )
23
23
 
24
24
  FILE_MAPPINGS = {
25
25
  'services/service.rb.erb' => -> command, app_name { File.join(SERVICES_DIR, "#{command.underscore(command.classify(app_name))}.rb") },
@@ -0,0 +1,130 @@
1
+ require_relative '../definition_reader'
2
+ require_relative '../responses'
3
+ require_relative '../status_codes'
4
+ require_relative '../../../lib/angus/renders/json_render'
5
+
6
+ module Angus
7
+ module Middleware
8
+ class ExceptionHandler
9
+ include Angus::StatusCodes
10
+
11
+ def initialize(app)
12
+ @app = app
13
+ @definition_reader = Angus::DefinitionReader.new
14
+ end
15
+
16
+ def call(env)
17
+ dup.call!(env)
18
+ end
19
+
20
+ def call!(env)
21
+ @app.call(env)
22
+ rescue Exception => exception
23
+ [
24
+ status_code(exception),
25
+ { 'Content-Type' => 'application/json' },
26
+ [build_error_response(exception)]
27
+ ]
28
+ end
29
+
30
+ private
31
+
32
+
33
+ # Builds a service error response
34
+ def build_error_response(error)
35
+ error_messages = messages_from_error(error)
36
+
37
+ JsonRender.convert(:status => :error, :messages => error_messages)
38
+ end
39
+
40
+
41
+ # Returns an array of messages errors to be sent in an operation response
42
+ #
43
+ # If {error} respond_to? :errors then the method returns one error message
44
+ # for each one.
45
+ #
46
+ # Each message returned is a hash with:
47
+ # - level
48
+ # - key
49
+ # - description
50
+ #
51
+ # @param [Exception] error The error to be returned
52
+ #
53
+ # @return [Array] an array of messages
54
+ def messages_from_error(error, level = :error)
55
+ messages = []
56
+
57
+ if error.respond_to?(:errors)
58
+ error.errors.each do |key, description|
59
+ messages << {:level => level, :key => key, :dsc => description}
60
+ end
61
+ elsif error.respond_to?(:error_key)
62
+ messages << {:level => level, :key => error.error_key,
63
+ :dsc => error_message(error)}
64
+ else
65
+ messages << {:level => level, :key => error.class.name, :dsc => error.message}
66
+ end
67
+
68
+ messages
69
+ end
70
+
71
+
72
+ # Returns the message for an error.
73
+ #
74
+ # It first tries to get the message from text attribute of the error definition
75
+ # if no definition is found or if the text attribute is blank it the returns the error
76
+ # message attribute.
77
+ #
78
+ # @param [Exception] error The error to get the message for.
79
+ #
80
+ # @return [String] the error message.
81
+ def error_message(error)
82
+ error_definition = error_definition(error)
83
+
84
+ if error_definition && !error_definition.text.blank?
85
+ error_definition.text
86
+ else
87
+ error.message
88
+ end
89
+ end
90
+
91
+ # Returns the error definition.
92
+ #
93
+ # If the error does not responds to error_key nil will be returned, see EvolutionError.
94
+ #
95
+ # @param [#error_key] error An error object
96
+ #
97
+ # @return [Hash]
98
+ def error_definition(error)
99
+ error_key = error.class.name
100
+
101
+ @definition_reader.message_definition(error_key, SDoc::Definitions::Message::ERROR_LEVEL)
102
+ end
103
+
104
+ # Returns a suitable HTTP status code for the given error
105
+ #
106
+ # If error param responds to #errors, then #{HTTP_STATUS_CODE_CONFLICT} will be returned.
107
+ #
108
+ # If error param responds to #error_key, then the status_code associated
109
+ # with the message will be returned.
110
+ #
111
+ # @param [#errors, #error_key] exception An error object
112
+ #
113
+ # @return [Integer] HTTP status code
114
+ def status_code(exception)
115
+ if exception.respond_to?(:errors)
116
+ return HTTP_STATUS_CODE_CONFLICT
117
+ end
118
+
119
+ message = error_definition(exception)
120
+
121
+ if message
122
+ message.status_code
123
+ else
124
+ HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR
125
+ end
126
+ end
127
+
128
+ end
129
+ end
130
+ end
@@ -1,15 +1,17 @@
1
1
  module JsonRender
2
2
 
3
+ def self.convert(json)
4
+ if json.is_a?(String)
5
+ json
6
+ else
7
+ JSON(json, :ascii_only => true)
8
+ end
9
+ end
10
+
3
11
  def self.render(response, json)
4
12
  response['Content-Type'] = 'application/json'
5
13
 
6
- json = if json.is_a?(String)
7
- json
8
- else
9
- JSON(json, :ascii_only => true)
10
- end
11
-
12
- response.write(json)
14
+ response.write(convert(json))
13
15
  end
14
16
 
15
17
  end
@@ -2,6 +2,7 @@ require 'angus-router'
2
2
 
3
3
  require_relative 'response'
4
4
  require_relative 'responses'
5
+ require_relative 'middleware/exception_handler'
5
6
 
6
7
  module Angus
7
8
  class RequestHandler
@@ -10,10 +11,11 @@ module Angus
10
11
 
11
12
  DEFAULT_RENDER = :json
12
13
 
13
- attr_reader :env, :request, :response, :params
14
-
15
14
  def initialize
16
15
  @router = Angus::Router.new
16
+ @middleware = []
17
+
18
+ use Middleware::ExceptionHandler
17
19
  end
18
20
 
19
21
  def router
@@ -21,41 +23,47 @@ module Angus
21
23
  end
22
24
 
23
25
  def call(env)
24
- begin
25
- @env = env
26
- @response = Response.new
26
+ to_app.call(env)
27
+ end
27
28
 
28
- router.route(env)
29
- rescue Angus::Router::NotImplementedError
30
- @response.status = HTTP_STATUS_CODE_NOT_FOUND
29
+ def to_app
30
+ inner_app = lambda { |env| self.dup.call!(env) }
31
+ @middleware.reverse.inject(inner_app) { |app, middleware| middleware.call(app) }
32
+ end
33
+
34
+ def call!(env)
35
+ begin
36
+ response = router.route(env)
37
+ rescue NotImplementedError
38
+ response = Response.new
39
+ response.status = HTTP_STATUS_CODE_NOT_FOUND
31
40
 
32
- render({ 'status' => 'error',
33
- 'messages' => [{ 'level' => 'error', 'key' => 'RouteNotFound',
34
- 'dsc' => 'Invalid route' }]
35
- }, {format: :json})
41
+ render(response, { 'status' => 'error',
42
+ 'messages' => [{ 'level' => 'error', 'key' => 'RouteNotFound',
43
+ 'dsc' => 'Invalid route' }]
44
+ }, {format: :json})
36
45
  end
37
46
 
38
- @response.finish
47
+ response.finish
39
48
  end
40
49
 
41
50
  # TODO ver multiples formatos en el futuro
42
- def render(content, options = {})
51
+ def render(response, content, options = {})
43
52
  format = options[:format] || DEFAULT_RENDER
44
53
  case(format)
45
- when :html
46
- HtmlRender.render(@response, content)
47
- when :json
48
- JsonRender.render(@response, content)
49
- else
50
- raise 'Unknown render format'
54
+ when :html
55
+ HtmlRender.render(response, content)
56
+ when :json
57
+ JsonRender.render(response, content)
58
+ else
59
+ raise 'Unknown render format'
51
60
  end
61
+
62
+ response
52
63
  end
53
64
 
54
- # TODO ver esto en el futuro
55
- # Use the specified Rack middleware
56
65
  def use(middleware, *args, &block)
57
- @prototype = nil
58
- @middleware << [middleware, args, block]
66
+ @middleware << lambda { |app| middleware.new(app, *args, &block) }
59
67
  end
60
68
 
61
69
  end
@@ -1,40 +1,10 @@
1
1
  require 'angus/sdoc'
2
2
 
3
+ require_relative 'status_codes'
4
+
3
5
  module Angus
4
6
  module Responses
5
-
6
- HTTP_STATUS_CODE_OK = 200
7
-
8
- HTTP_STATUS_CODE_FORBIDDEN = 403
9
- HTTP_STATUS_CODE_NOT_FOUND = 404
10
- HTTP_STATUS_CODE_CONFLICT = 409
11
- HTTP_STATUS_CODE_UNPROCESSABLE_ENTITY = 422
12
-
13
- HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR = 500
14
-
15
- # Returns a suitable HTTP status code for the given error
16
- #
17
- # If error param responds to #errors, then #{HTTP_STATUS_CODE_CONFLICT} will be returned.
18
- #
19
- # If error param responds to #error_key, then the status_code associated
20
- # with the message will be returned.
21
- #
22
- # @param [#errors, #error_key] error An error object
23
- #
24
- # @return [Integer] HTTP status code
25
- def get_error_status_code(error)
26
- if error.respond_to?(:errors)
27
- return HTTP_STATUS_CODE_CONFLICT
28
- end
29
-
30
- message = get_error_definition(error)
31
-
32
- if message
33
- message.status_code
34
- else
35
- HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR
36
- end
37
- end
7
+ include Angus::StatusCodes
38
8
 
39
9
  # Returns the error definition.
40
10
  #
@@ -75,12 +45,6 @@ module Angus
75
45
  json(elements)
76
46
  end
77
47
 
78
- # Builds a service error response
79
- def build_error_response(error)
80
- error_messages = messages_from_error(error)
81
- build_response(:error, *error_messages)
82
- end
83
-
84
48
  # Builds a ResponseMessage object
85
49
  #
86
50
  # @param [#to_s] key Message key
@@ -0,0 +1,23 @@
1
+ module Angus
2
+ module StatusCodes
3
+
4
+ # TODO remove HTTP_STATUS from all constants
5
+ HTTP_STATUS_CODE_OK = 200
6
+
7
+ HTTP_STATUS_CODE_FORBIDDEN = 403
8
+ HTTP_STATUS_CODE_NOT_FOUND = 404
9
+ HTTP_STATUS_CODE_CONFLICT = 409
10
+ HTTP_STATUS_CODE_UNPROCESSABLE_ENTITY = 422
11
+
12
+ HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR = 500
13
+
14
+ def self.included(base)
15
+ self.constants.each do |const|
16
+ unless base.const_defined?(const)
17
+ base.const_set(const, self.const_get(const))
18
+ end
19
+ end
20
+ end
21
+
22
+ end
23
+ end
data/lib/angus/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Angus
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
@@ -0,0 +1,63 @@
1
+ #require_relative '../definition_reader'
2
+ #require_relative '../responses'
3
+ #require_relative '../status_codes'
4
+
5
+
6
+ require 'spec_helper'
7
+
8
+ require 'angus/middleware/exception_handler'
9
+
10
+ work_dir = File.join(File.dirname(__FILE__), '..', '..', 'functional', 'basic')
11
+ describe Angus::Middleware::ExceptionHandler, { :work_dir => work_dir } do
12
+
13
+ let(:app) { double(:app, :call => app_response) }
14
+
15
+ let(:app_response) { :ok }
16
+
17
+ let(:env) { :env }
18
+
19
+ subject(:middleware) { Angus::Middleware::ExceptionHandler.new(app) }
20
+
21
+ it 'returns app response' do
22
+ middleware.call(env).should eq(app_response)
23
+ end
24
+
25
+ context 'when unknown error' do
26
+ before { app.stub(:call).with(any_args).and_raise(Exception) }
27
+
28
+ it 'returns INTERNAL SERVER ERROR' do
29
+ response = middleware.call(env)
30
+
31
+ response.first.should eq(Angus::StatusCodes::HTTP_STATUS_CODE_INTERNAL_SERVER_ERROR)
32
+ end
33
+ end
34
+
35
+ context 'when #errors' do
36
+
37
+ let(:error) { Exception.new }
38
+
39
+ before do
40
+ error.stub(:errors => [:errors])
41
+ app.stub(:call).with(any_args).and_raise(error)
42
+ end
43
+
44
+ it 'returns CONFLICT ERROR' do
45
+ response = middleware.call(env)
46
+
47
+ response.first.should eq(Angus::StatusCodes::HTTP_STATUS_CODE_CONFLICT)
48
+ end
49
+ end
50
+
51
+ context 'when known error' do
52
+ let(:know_error) { UserNotFound = Class.new(StandardError) }
53
+
54
+ before { app.stub(:call).with(any_args).and_raise(know_error.new) }
55
+
56
+ it 'returns the status code set for the error' do
57
+ response = middleware.call(env)
58
+
59
+ response.first.should eq(Angus::StatusCodes::HTTP_STATUS_CODE_NOT_FOUND)
60
+ end
61
+ end
62
+
63
+ end
@@ -1,4 +1,4 @@
1
- ResourceNotFound:
1
+ UserNotFound:
2
2
  status_code: 404
3
3
  level: error
4
- description: Recurso no encontrado
4
+ description: User not found
@@ -6,5 +6,4 @@ user_profile:
6
6
  - field: name
7
7
  description: Nombres del usuario
8
8
  required: true
9
- type: string
10
-
9
+ type: string
@@ -16,7 +16,7 @@ get_user:
16
16
  type: user_profile
17
17
 
18
18
  messages:
19
- - key: ResourceNotFound
19
+ - key: UserNotFound
20
20
 
21
21
  get_users:
22
22
  name: Obtener Lista de usuarios
@@ -30,8 +30,4 @@ get_users:
30
30
  - element: users
31
31
  description: Perfil del usuario
32
32
  required: true
33
- elements_type: user_profile
34
-
35
- messages:
36
- - key: ResourceNotFound
37
-
33
+ elements_type: user_profile
@@ -0,0 +1,9 @@
1
+ class UserNotFound < StandardError
2
+ def initialize(id)
3
+ @id = id
4
+ end
5
+
6
+ def message
7
+ "User with id=#@id not found"
8
+ end
9
+ end
@@ -1,12 +1,18 @@
1
+ require_relative '../exceptions/user_errors'
2
+
1
3
  class Users < Angus::BaseResource
2
- USERS = [{ :id => 1, :name => 'ac/dc'},{:id => 2, :name => 'madonna' }]
4
+ USERS = [{ :id => 1, :name => 'ac/dc' }, { :id => 2, :name => 'madonna' }]
3
5
 
4
6
  def get_user
5
- {:profile => USERS.find{ |user| user[:id] == params[:user_id].to_i }}
7
+ user = USERS.find { |user| user[:id] == params[:user_id].to_i }
8
+
9
+ raise UserNotFound.new(params[:user_id]) unless user
10
+
11
+ { :profile => user }
6
12
  end
7
13
 
8
14
  def get_users
9
- {:users => USERS}
15
+ { :users => USERS }
10
16
  end
11
17
 
12
- end
18
+ end
@@ -3,7 +3,6 @@ require 'angus'
3
3
  module Spec
4
4
  module Functional
5
5
 
6
-
7
6
  class Basic < Angus::Base
8
7
  def configure
9
8
  register :users
@@ -4,11 +4,10 @@ require 'rack/test'
4
4
 
5
5
  require 'functional/basic/services/basic'
6
6
 
7
- describe Spec::Functional::Basic do
7
+ describe Spec::Functional::Basic, { :work_dir => "#{File.dirname(__FILE__ )}/basic" } do
8
8
  include Rack::Test::Methods
9
9
 
10
10
  def app
11
- Dir.chdir("#{File.dirname(__FILE__ )}/basic")
12
11
  Spec::Functional::Basic.new
13
12
  end
14
13
 
@@ -58,6 +57,30 @@ describe Spec::Functional::Basic do
58
57
  last_response.header['Content-Type'].should eq('application/json')
59
58
  end
60
59
 
60
+ context 'when a expected error happens' do
61
+ it 'sets the correct status code' do
62
+ get '/basic/api/0.1/users/-1'
63
+
64
+ last_response.status.should eq(404)
65
+ end
66
+
67
+ it 'sets a json content type' do
68
+ get '/basic/api/0.1/users/-1'
69
+
70
+ last_response.header['Content-Type'].should eq('application/json')
71
+ end
72
+
73
+ describe 'the response body' do
74
+ subject(:body) {
75
+ get '/basic/api/0.1/users/-1'
76
+ JSON(last_response.body)
77
+ }
78
+
79
+ its(['status']) { should eq('error')}
80
+ its(['messages']) { should include({ 'level' => 'error', 'key' => 'UserNotFound',
81
+ 'dsc' => 'User with id=-1 not found' })}
82
+ end
83
+ end
61
84
  end
62
85
 
63
86
  end
@@ -3,7 +3,6 @@ require 'angus'
3
3
  module Spec
4
4
  module Functional
5
5
 
6
-
7
6
  class EmptyResource < Angus::Base
8
7
  def configure
9
8
  register :users
@@ -4,11 +4,11 @@ require 'rack/test'
4
4
 
5
5
  require 'functional/empty_resource/services/empty_resource'
6
6
 
7
- describe Spec::Functional::EmptyResource do
7
+ describe Spec::Functional::EmptyResource,
8
+ { :work_dir => "#{File.dirname(__FILE__ )}/empty_resource" } do
8
9
  include Rack::Test::Methods
9
10
 
10
11
  def app
11
- Dir.chdir("#{File.dirname(__FILE__ )}/empty_resource")
12
12
  Spec::Functional::EmptyResource.new
13
13
  end
14
14
 
@@ -3,10 +3,8 @@ require 'angus'
3
3
  module Spec
4
4
  module Functional
5
5
 
6
-
7
6
  class NoResources < Angus::Base
8
- def configure
9
- end
7
+
10
8
  end
11
9
 
12
10
  end
@@ -4,11 +4,11 @@ require 'rack/test'
4
4
 
5
5
  require 'functional/no_resources/services/no_resources'
6
6
 
7
- describe Spec::Functional::NoResources do
7
+ describe Spec::Functional::NoResources,
8
+ { :work_dir => "#{File.dirname(__FILE__ )}/no_resources" } do
8
9
  include Rack::Test::Methods
9
10
 
10
11
  def app
11
- Dir.chdir("#{File.dirname(__FILE__ )}/no_resources")
12
12
  Spec::Functional::NoResources.new
13
13
  end
14
14
 
data/spec/spec_helper.rb CHANGED
@@ -24,4 +24,14 @@ RSpec.configure do |config|
24
24
  # --seed 1234
25
25
  config.order = 'random'
26
26
 
27
+ config.around(:each) do |example|
28
+ old_work_dir = Dir.pwd
29
+
30
+ Dir.chdir(example.metadata[:work_dir] || old_work_dir)
31
+
32
+ example.run
33
+
34
+ Dir.chdir(old_work_dir)
35
+ end
36
+
27
37
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: angus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.0.4
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -11,7 +11,7 @@ authors:
11
11
  autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2013-11-01 00:00:00.000000000 Z
14
+ date: 2013-11-26 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: thor
@@ -39,7 +39,7 @@ dependencies:
39
39
  version: '0.0'
40
40
  - - ! '>='
41
41
  - !ruby/object:Gem::Version
42
- version: 0.0.3
42
+ version: 0.0.4
43
43
  type: :runtime
44
44
  prerelease: false
45
45
  version_requirements: !ruby/object:Gem::Requirement
@@ -50,7 +50,7 @@ dependencies:
50
50
  version: '0.0'
51
51
  - - ! '>='
52
52
  - !ruby/object:Gem::Version
53
- version: 0.0.3
53
+ version: 0.0.4
54
54
  - !ruby/object:Gem::Dependency
55
55
  name: angus-router
56
56
  requirement: !ruby/object:Gem::Requirement
@@ -214,6 +214,7 @@ files:
214
214
  - lib/angus/marshallings/marshalling.rb
215
215
  - lib/angus/marshallings/base.rb
216
216
  - lib/angus/generator.rb
217
+ - lib/angus/status_codes.rb
217
218
  - lib/angus/version.rb
218
219
  - lib/angus/base_actions.rb
219
220
  - lib/angus/request_handler.rb
@@ -232,6 +233,7 @@ files:
232
233
  - lib/angus/base_resource.rb
233
234
  - lib/angus/command.rb
234
235
  - lib/angus/response.rb
236
+ - lib/angus/middleware/exception_handler.rb
235
237
  - lib/angus/rspec/support/examples/describe_errors.rb
236
238
  - lib/angus/rspec/support/matchers/operation_response_matchers.rb
237
239
  - lib/angus/rspec/support/operation_response.rb
@@ -241,12 +243,15 @@ files:
241
243
  - lib/angus/utils/params.rb
242
244
  - lib/angus/resource_definition.rb
243
245
  - lib/angus/utils.rb
246
+ - lib/angus/definition_reader.rb
244
247
  - lib/angus/base.rb
245
248
  - lib/angus.rb
246
249
  - spec/spec_helper.rb
250
+ - spec/angus/middleware/exception_handler_spec.rb
247
251
  - spec/angus/rspec/examples/describe_errors_spec.rb
248
252
  - spec/functional/no_resources_spec.rb
249
253
  - spec/functional/empty_resource_spec.rb
254
+ - spec/functional/basic/exceptions/user_errors.rb
250
255
  - spec/functional/basic/resources/users.rb
251
256
  - spec/functional/basic/services/basic.rb
252
257
  - spec/functional/basic/definitions/representations.yml
@@ -292,9 +297,11 @@ specification_version: 3
292
297
  summary: angus
293
298
  test_files:
294
299
  - spec/spec_helper.rb
300
+ - spec/angus/middleware/exception_handler_spec.rb
295
301
  - spec/angus/rspec/examples/describe_errors_spec.rb
296
302
  - spec/functional/no_resources_spec.rb
297
303
  - spec/functional/empty_resource_spec.rb
304
+ - spec/functional/basic/exceptions/user_errors.rb
298
305
  - spec/functional/basic/resources/users.rb
299
306
  - spec/functional/basic/services/basic.rb
300
307
  - spec/functional/basic/definitions/representations.yml