raisin 0.0.5 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 9b3878cbd61503984b0b018f8d6cff02f14ff59b
4
+ data.tar.gz: d9f5b25e36940ffc6527b60d72a691310d51ee5e
5
+ SHA512:
6
+ metadata.gz: 8cf72509e66b0dbc41fd4bb498c1bc066cc3d88864832a752c29db21630f2c84fcc7eab83234bf3342e67eb1cbb7f2f14d02c12ca1955690147f0a43a9406d97
7
+ data.tar.gz: 48bfaca74a995b61a8baaa1fbda7b7018508c2ed47affd110895bc2e8d134ebeac6e55617717d2f288eee6ac40678cb9a9e5b1a5dd40ac7664ac3575206cd9fd
data/lib/raisin/base.rb CHANGED
@@ -39,35 +39,13 @@ module Raisin
39
39
  AbstractController::Callbacks,
40
40
  ActionController::Rescue,
41
41
 
42
- ActionController::Instrumentation
42
+ ActionController::Instrumentation,
43
43
  ]
44
44
 
45
45
  MODULES.each { |mod|
46
46
  include mod
47
47
  }
48
48
 
49
- def self.controller_path
50
- @controller_path ||= name && name.sub(/\:\:[^\:]+$/, '').sub(/api$/i, '').underscore
51
- end
52
-
53
- def _prefixes
54
- @_prefixes ||= begin
55
- parent_prefixes = self.class.parent_prefixes
56
- parent_prefixes.compact.unshift(controller_path)#.map! { |pr| pr.split('/').last }
57
- end
58
- end
59
-
60
- def action_name
61
- self.class.name.demodulize.underscore
62
- end
63
-
64
- #
65
- # In test env, action is not :call. This is a bit of a hack
66
- #
67
- def process(action, *args)
68
- super(:call, *args)
69
- end
70
-
71
49
  ActiveSupport.run_load_hooks(:action_controller, self)
72
50
  end
73
51
  end
@@ -9,15 +9,6 @@ module Raisin
9
9
  end
10
10
 
11
11
  module Configuration
12
- mattr_accessor :enable_auth_by_default
13
- @@enable_auth_by_default = false
14
-
15
- mattr_accessor :default_auth_method
16
- @@default_auth_method = :authenticate_user! # Devise FTW
17
-
18
- mattr_accessor :response_formats
19
- @@response_formats = [:json]
20
-
21
12
  def self.version
22
13
  @version_config ||= VersionConfig.new
23
14
  end
@@ -1,4 +1,8 @@
1
1
  module Raisin
2
+ #
3
+ # Middleware responsable to filter HTTP Accept header
4
+ # It stores version and format accepted by the client in the env.
5
+ #
2
6
  class Middleware
3
7
  ACCEPT_REGEXP = /application\/vnd\.(?<vendor>[a-z]+)-(?<version>v[0-9]+)\+(?<format>[a-z]+)?/
4
8
 
@@ -1,42 +1,37 @@
1
- require 'raisin/version_constraint'
1
+ require 'raisin/routing'
2
2
 
3
3
  module ActionDispatch::Routing
4
4
  class Mapper
5
5
 
6
- #
7
- #
8
- #
9
- def mount_api(raisin_api)
10
- raisin_api.versions.each do |version, routes|
11
- next if routes.empty?
12
-
13
- send(:constraints, Raisin::VersionConstraint.new(version)) {
14
- routes.each do |method, path, endpoint|
15
- send(method, path, to: endpoint)
16
- end
17
- }
18
- end
19
- end
20
- end
6
+ def api(options, &block)
7
+ return unless block_given?
8
+
9
+ version = options[:version].to_s
10
+ is_default = options.fetch(:default, false)
11
+
12
+ raise 'Version is missing in constraint' if version.blank?
21
13
 
22
- class RouteSet
23
- class Dispatcher
24
-
25
- #
26
- # Allow to use controller like 'UsersAPI' instead of 'UsersController'
27
- #
28
- def controller_reference_with_api(controller_param)
29
- controller_name = "#{controller_param.camelize}Api"
30
- unless controller = @controllers[controller_param]
31
- controller = @controllers[controller_param] =
32
- ActiveSupport::Dependencies.reference(controller_name)
14
+ @api_resources = true
15
+
16
+ send(:constraints, Raisin::Routing::VersionConstraint.new(version, is_default)) do
17
+ send(:scope, module: version) do
18
+ yield
33
19
  end
34
- controller.get(controller_name)
35
- rescue NameError
36
- controller_reference_without_api(controller_param)
37
20
  end
21
+ ensure
22
+ @api_resources = nil
23
+ end
38
24
 
39
- alias_method_chain :controller_reference, :api
25
+ def resources(*resources, &block)
26
+ if @api_resources
27
+ options = resources.extract_options!
28
+ options[:except] ||= []
29
+ options[:except].concat([:new, :edit])
30
+ super(*resources, options)
31
+ else
32
+ super
33
+ end
40
34
  end
35
+
41
36
  end
42
37
  end
@@ -3,8 +3,5 @@ require 'raisin/rails/request'
3
3
 
4
4
  module Raisin
5
5
  class Railtie < Rails::Railtie
6
-
7
- # Force routes to be loaded if we are doing any eager load.
8
- config.before_eager_load { |app| app.reload_routes! }
9
6
  end
10
7
  end
@@ -0,0 +1,14 @@
1
+ module Raisin
2
+ module Routing
3
+ class VersionConstraint
4
+ def initialize(version, is_default)
5
+ @version = version
6
+ @bypass = is_default || version == ALL_VERSIONS
7
+ end
8
+
9
+ def matches?(req)
10
+ @bypass || @version == req.env['raisin.version']
11
+ end
12
+ end
13
+ end
14
+ end
@@ -1,3 +1,3 @@
1
1
  module Raisin
2
- VERSION = "0.0.5"
2
+ VERSION = '0.1.0'
3
3
  end
data/lib/raisin.rb CHANGED
@@ -1,17 +1,8 @@
1
1
  require 'raisin/version'
2
-
3
2
  require 'raisin/configuration'
4
3
 
5
- require 'raisin/exposable'
6
- require 'raisin/namespace'
7
- require 'raisin/mixin'
8
-
9
- require 'raisin/router'
10
4
  require 'raisin/base'
11
- require 'raisin/api'
12
-
13
5
  require 'raisin/middleware'
14
- require 'raisin/version_constraint'
15
6
 
16
7
  module Raisin
17
8
  def self.configure
metadata CHANGED
@@ -1,15 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: raisin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
5
- prerelease:
4
+ version: 0.1.0
6
5
  platform: ruby
7
6
  authors:
8
7
  - ccocchi
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-01-09 00:00:00.000000000 Z
11
+ date: 2013-04-23 00:00:00.000000000 Z
13
12
  dependencies: []
14
13
  description: An opiniated micro-framework to easily build elegant API on top of Rails
15
14
  email:
@@ -24,51 +23,36 @@ files:
24
23
  - README.md
25
24
  - Rakefile
26
25
  - lib/raisin.rb
27
- - lib/raisin/api.rb
28
- - lib/raisin/api/dsl.rb
29
26
  - lib/raisin/base.rb
30
27
  - lib/raisin/configuration.rb
31
- - lib/raisin/endpoint.rb
32
- - lib/raisin/exposable.rb
33
28
  - lib/raisin/middleware.rb
34
- - lib/raisin/mixin.rb
35
- - lib/raisin/namespace.rb
36
29
  - lib/raisin/rails/request.rb
37
30
  - lib/raisin/rails/routes.rb
38
31
  - lib/raisin/railtie.rb
39
- - lib/raisin/router.rb
40
- - lib/raisin/testing/rspec.rb
41
- - lib/raisin/testing/rspec/api_helper.rb
42
- - lib/raisin/testing/rspec/dsl.rb
43
- - lib/raisin/testing/rspec/functional_test.rb
44
- - lib/raisin/testing/rspec/test_request.rb
45
- - lib/raisin/testing/rspec/unit_helper.rb
46
- - lib/raisin/testing/rspec/unit_test.rb
32
+ - lib/raisin/routing.rb
47
33
  - lib/raisin/version.rb
48
- - lib/raisin/version_constraint.rb
49
34
  - raisin.gemspec
50
35
  homepage: https://github.com/ccocchi/raisin
51
36
  licenses: []
37
+ metadata: {}
52
38
  post_install_message:
53
39
  rdoc_options: []
54
40
  require_paths:
55
41
  - lib
56
42
  required_ruby_version: !ruby/object:Gem::Requirement
57
- none: false
58
43
  requirements:
59
- - - ! '>='
44
+ - - '>='
60
45
  - !ruby/object:Gem::Version
61
46
  version: '0'
62
47
  required_rubygems_version: !ruby/object:Gem::Requirement
63
- none: false
64
48
  requirements:
65
- - - ! '>='
49
+ - - '>='
66
50
  - !ruby/object:Gem::Version
67
51
  version: '0'
68
52
  requirements: []
69
53
  rubyforge_project:
70
- rubygems_version: 1.8.21
54
+ rubygems_version: 2.0.0
71
55
  signing_key:
72
- specification_version: 3
56
+ specification_version: 4
73
57
  summary: An opiniated micro-framework to easily build elegant API on top of Rails
74
58
  test_files: []
@@ -1,177 +0,0 @@
1
- module Raisin
2
- module DSL
3
- %w(get head post put delete).each do |via|
4
- class_eval <<-EOF, __FILE__, __LINE__ + 1
5
- def #{via}(path = '/', options = {}, &block)
6
- path = normalize_path(path)
7
- method_name = options.key?(:as) ? options[:as].to_s : extract_method_name(path, :#{via})
8
-
9
- klass = self.const_set method_name.camelize, Class.new(@_klass, &block)
10
-
11
- if current_namespace && current_namespace.expose?
12
- current_namespace.exposures.each do |name, b|
13
- klass.send(:expose, name, &b)
14
- end
15
- end
16
-
17
- current_namespace.add(method_name) if current_namespace
18
-
19
- routes << [:#{via}, path, default_route(method_name)]
20
- end
21
- EOF
22
- end
23
-
24
- def included(&block)
25
- self.action_klass.class_eval(&block) if block_given?
26
- end
27
-
28
- def member(&block)
29
- namespace(':id') do
30
- resource = self.api_name.singularize
31
- expose(resource) { resource.camelize.constantize.send :find, params[:id] }
32
- instance_eval(&block)
33
- end
34
- end
35
-
36
- def nested_into_resource(parent)
37
- parent = parent.to_s
38
- sing = parent.singularize
39
- id = "#{sing}_id"
40
-
41
- @_namespaces << Namespace.new("#{parent}/:#{id}")
42
- current_namespace.expose(sing) { sing.camelize.constantize.send :find, params[id.to_sym]}
43
- @_namespaces << Namespace.new(@_prefix)
44
- @_prefix = nil
45
- end
46
-
47
- def single_resource
48
- @_single_resource = true
49
- @_prefix = @_prefix.singularize if prefix?
50
- end
51
-
52
- def prefix(prefix)
53
- @_prefix = prefix
54
- end
55
-
56
- def description(desc)
57
- # noop
58
- end
59
-
60
- def expose(*args, &block)
61
- current_namespace.expose(*args, &block)
62
- end
63
-
64
- def namespace(path, &block)
65
- path = path.sub(%r(\A/?#{@_prefix}), '') if prefix?
66
- @_namespaces.push Namespace.new(path)
67
- yield
68
- process_filters
69
- @_namespaces.pop
70
- end
71
-
72
- %w(before around after).each do |type|
73
- class_eval <<-EOF, __FILE__, __LINE__ + 1
74
- def #{type}(*args, &block)
75
- return unless current_namespace
76
- current_namespace.filter(:#{type}, args, &block)
77
- end
78
- EOF
79
- end
80
-
81
- protected
82
-
83
- def prefix?
84
- !!@_prefix
85
- end
86
-
87
- def single_resource?
88
- !!@_single_resource
89
- end
90
-
91
- def current_namespace
92
- @_namespaces.at(0)
93
- end
94
-
95
- def current_namespace?
96
- @_namespaces.length > 0
97
- end
98
-
99
- def process_filters
100
- current_namespace.filters.each_pair { |type, filters|
101
- filters.each do |name, block|
102
- superclass.send("#{type}_filter", name, only: current_namespace.methods, &block)
103
- end
104
- }
105
- end
106
-
107
- def default_route(method)
108
- "#{modules_prefix}#{self.api_name}##{method}"
109
- end
110
-
111
- def modules_prefix
112
- @modules_prefix ||= begin
113
- modules = self.name.split('::').slice(0..-2)
114
- modules.empty? ? '' : "#{modules.map!(&:downcase).join('/')}/"
115
- end
116
- end
117
-
118
- #
119
- # Get method name from path
120
- # Example:
121
- # / => :index
122
- # /users/:id => :users
123
- # /users/:id/addresses => :addresses
124
- #
125
- def extract_method_name(path, via)
126
- return method_name_for_single_resource(path, via) if single_resource?
127
-
128
- if path =~ %r(\A/?#{@_prefix}\z)
129
- return via == :get ? 'index' : 'create'
130
- end
131
-
132
- parts = path.split('/').reverse!
133
-
134
- return parts.find { |part| !part.start_with?(':') } if parts.first != ':id'
135
-
136
- case via
137
- when :get
138
- 'show'
139
- when :put
140
- 'update'
141
- when :delete
142
- 'destroy'
143
- else
144
- raise "Cannot extract method name from #{path}"
145
- end
146
- end
147
-
148
- def method_name_for_single_resource(path, via)
149
- if path =~ %r(\A/?#{@_prefix}\z)
150
- case via
151
- when :get
152
- 'show'
153
- when :post
154
- 'create'
155
- when :put
156
- 'update'
157
- when :delete
158
- 'destroy'
159
- end
160
- else
161
- path.split('/').reverse!.last
162
- end
163
- end
164
-
165
- #
166
- # Creates path with version, namespace and
167
- # given path, then normalizes it
168
- #
169
- def normalize_path(path)
170
- parts = []
171
- parts << @_prefix unless !prefix? || path =~ %r(\A/?#{@_prefix})
172
- parts.concat @_namespaces.reject { |n| path =~ %r(/#{n.path}) }.map!(&:path) if current_namespace?
173
- parts << path.to_s unless path == '/'
174
- parts.join('/')
175
- end
176
- end
177
- end
data/lib/raisin/api.rb DELETED
@@ -1,74 +0,0 @@
1
- require 'raisin/api/dsl'
2
-
3
- module Raisin
4
- class API
5
-
6
- #
7
- # Returns a proc representing our action to be called in the given
8
- # environment.
9
- #
10
- def self.action(name, klass = ActionDispatch::Request)
11
- ->(env) { self.const_get(name.camelize).new.dispatch(:call, klass.new(env)) }
12
- end
13
-
14
- #
15
- # The abstract class that is inherited by all actions.
16
- #
17
- # It includes actions DSL, default call method, global authentication
18
- # filter and global respond_to
19
- #
20
- def self.action_klass
21
- @_klass ||= begin
22
- klass = Class.new(::Raisin::Base)
23
- klass.send(:include, Raisin::Mixin)
24
-
25
- if Configuration.enable_auth_by_default && Configuration.default_auth_method
26
- klass.send(:before_filter, Configuration.default_auth_method)
27
- end
28
-
29
- klass.send(:respond_to, *Configuration.response_formats)
30
- klass
31
- end
32
- end
33
-
34
- def self.action_klass=(klass) # :nodoc:
35
- @_klass = klass
36
- end
37
-
38
- #
39
- # Resets routes and namespaces.
40
- # Sets default prefix to api_name (e.g PostsAPI => 'api')
41
- #
42
- def self.reset
43
- @_routes = []
44
- @_prefix = self.api_name
45
- @_namespaces = []
46
- @_single_resource = false
47
- end
48
-
49
- #
50
- # Resets routes and namespaces for each new API class.
51
- # The action class is copied for some reasons (??)
52
- #
53
- def self.inherited(subclass)
54
- super
55
- subclass.reset
56
- subclass.action_klass = self.action_klass.dup
57
- end
58
-
59
- #
60
- # Returns the last part of the api's name, underscored, without the ending
61
- # <tt>API</tt>. For instance, PostsAPI returns <tt>posts</tt>.
62
- # Namespaces are left out, so Admin::PostsAPI returns <tt>posts</tt> as well.
63
- #
64
- def self.api_name
65
- @api_name ||= self.name.demodulize.sub(/api/i, '').underscore
66
- end
67
-
68
- def self.routes # :nodoc:
69
- @_routes
70
- end
71
-
72
- extend Raisin::DSL
73
- end
74
- end
@@ -1,39 +0,0 @@
1
- module Raisin
2
- class Endpoint
3
- include Exposable
4
-
5
- attr_reader :response_body, :auth_method, :formats
6
-
7
- def initialize
8
- @response_body = nil
9
- @auth_method = nil
10
- @formats = []
11
- end
12
-
13
- def response(&block)
14
- @response_body = block
15
- end
16
-
17
- def has_response?
18
- !!response_body
19
- end
20
-
21
- def desc(description)
22
- # noop
23
- end
24
-
25
- def format(*mime_types)
26
- @formats.concat mime_types
27
- end
28
-
29
- def enable_auth(method = Configuration.default_auth_method)
30
- return if Configuration.enable_auth_by_default
31
- @auth_method = method
32
- end
33
-
34
- def skip_auth(method = Configuration.default_auth_method)
35
- return unless Configuration.enable_auth_by_default
36
- @auth_method = method
37
- end
38
- end
39
- end
@@ -1,21 +0,0 @@
1
- module Raisin
2
- module Exposable
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- attr_reader :exposures
7
- end
8
-
9
- def initialize(*args)
10
- @exposures = []
11
- end
12
-
13
- def expose(name, &block)
14
- @exposures << [name, block]
15
- end
16
-
17
- def expose?
18
- !exposures.empty?
19
- end
20
- end
21
- end
data/lib/raisin/mixin.rb DELETED
@@ -1,53 +0,0 @@
1
- module Raisin
2
- module Mixin
3
- extend ActiveSupport::Concern
4
-
5
- def call
6
- end
7
-
8
- module ClassMethods
9
- def response(&block)
10
- define_method(:call, &block) if block_given?
11
- end
12
-
13
- def desc(description)
14
- # noop
15
- end
16
- alias_method :description, :desc
17
-
18
- def format(*args)
19
- self.class_eval <<-EOF, __FILE__, __LINE__ + 1
20
- respond_to(*#{args})
21
- EOF
22
- end
23
-
24
- def enable_auth(method = nil)
25
- method ||= Configuration.default_auth_method
26
- send(:before_filter, method) unless Configuration.enable_auth_by_default
27
- end
28
-
29
- def disable_auth(method = nil)
30
- method ||= Configuration.default_auth_method
31
- send(:skip_before_filter, method) if Configuration.enable_auth_by_default
32
- end
33
-
34
- def expose(name, &block)
35
- if block_given?
36
- define_method(name) do |*args|
37
- ivar = "@#{name}"
38
-
39
- if instance_variable_defined?(ivar)
40
- instance_variable_get(ivar)
41
- else
42
- instance_variable_set(ivar, instance_exec(block, *args, &block))
43
- end
44
- end
45
- else
46
- attr_reader name
47
- end
48
-
49
- helper_method name
50
- end
51
- end
52
- end
53
- end
@@ -1,27 +0,0 @@
1
- module Raisin
2
- class Namespace
3
- include Exposable
4
-
5
- attr_reader :path, :methods, :filters
6
-
7
- def initialize(path)
8
- super
9
-
10
- @path = path
11
- @methods = []
12
- @filters = {
13
- before: [],
14
- after: [],
15
- around: []
16
- }
17
- end
18
-
19
- def add(method)
20
- @methods << method
21
- end
22
-
23
- def filter(type, *args, &block)
24
- @filters[type] << [args.first, block]
25
- end
26
- end
27
- end
data/lib/raisin/router.rb DELETED
@@ -1,55 +0,0 @@
1
- module Raisin
2
- class Router
3
- ALL_VERSIONS = :all
4
-
5
- #
6
- # Reset class variables on the subclass when inherited
7
- #
8
- def self.inherited(subclass)
9
- subclass.reset
10
- end
11
-
12
- def self.reset
13
- @_current_version = nil
14
- @_versions = { ALL_VERSIONS => [] }
15
- end
16
-
17
- class << self
18
- attr_internal_accessor :versions, :current_version
19
-
20
- def mount(api)
21
- if version?(:header)
22
- @_versions[self.current_version].concat(api.routes)
23
- else
24
- @_versions[ALL_VERSIONS].concat(version?(:path) ? pathed_routes(api.routes) : api.routes)
25
- end
26
- end
27
-
28
- #
29
- # Set version for current block
30
- #
31
- def version(version, options = {}, &block)
32
- version = version.to_s
33
- self.current_version = version
34
- @_versions[version] = [] if version?(:header)
35
- yield
36
- self.current_version = nil
37
- end
38
-
39
- private
40
-
41
- def version?(type)
42
- self.current_version && Configuration.version.using == type
43
- end
44
-
45
- def pathed_routes(routes)
46
- self.routes.map! { |via, path, opts|
47
- path.append('/') unless path.start_with?('/')
48
- path.append(current_version.version)
49
- [via, path, opts]
50
- }
51
- end
52
- end
53
-
54
- end
55
- end
@@ -1,12 +0,0 @@
1
- module Raisin
2
- module RSpecApiHelper
3
- extend ActiveSupport::Concern
4
-
5
- included do
6
- include RSpec::Rails::ControllerExampleGroup
7
- subject { controller }
8
- end
9
-
10
- end
11
- end
12
-
@@ -1,97 +0,0 @@
1
- require 'raisin/testing/rspec/unit_helper'
2
- require 'raisin/testing/rspec/api_helper'
3
-
4
- module Raisin
5
- module Testing
6
- module RSpec
7
-
8
- #
9
- #
10
- #
11
- module HttpMethods
12
- %w(get head post put delete).each do |verb|
13
- class_eval <<-EOF, __FILE__, __LINE__ + 1
14
- def #{verb}(*args)
15
- method = self.example.metadata[:current_method].to_s.downcase
16
- super(method, *args)
17
- end
18
- EOF
19
- end
20
- end
21
-
22
- #
23
- #
24
- #
25
- module DSL
26
- %w(get head post put delete).each do |verb|
27
- class_eval <<-EOF, __FILE__, __LINE__ + 1
28
- def #{verb}(path_or_klass, &block)
29
- self.metadata[:current_klass] = _klass_from_path(path_or_klass, :#{verb})
30
- self.instance_eval(&block)
31
- self.metadata.delete(:current_klass)
32
- end
33
- EOF
34
- end
35
-
36
- def unit(&block)
37
- _describe_controller(self.metadata[:current_klass], self, &block).tap do |klass|
38
- klass.send(:include, Raisin::RSpecUnitHelper)
39
- end
40
- end
41
-
42
- def response(format = :json, &block)
43
- self.metadata[:type] = :api
44
- _describe_controller(self.metadata[:current_klass], self, &block).tap do |klass|
45
- klass.send(:include, Raisin::RSpecApiHelper)
46
- klass.send(:include, HttpMethods)
47
- klass.send(:render_views) if ::Raisin::Configuration.testing_render_views
48
- klass.send(:before) {
49
- request.accept = format.is_a?(Symbol) ? "application/#{format}" : format
50
- }
51
- self.metadata.delete(:type)
52
- end
53
- end
54
-
55
- protected
56
-
57
- def _klass_from_path(path_or_klass, via)
58
- api_klass = _find_first_api_klass
59
-
60
- case path_or_klass
61
- when String
62
- method_name = api_klass.send(:extract_method_name, api_klass.send(:normalize_path, path_or_klass), via)
63
- self.metadata[:current_method] = method_name
64
- api_klass.const_get(method_name.camelize)
65
- when Symbol
66
- self.metadata[:current_method] = path_or_klass
67
- api_klass.const_get(path_or_klass.to_s.camelize)
68
- else
69
- path_or_klass
70
- end
71
- end
72
-
73
- def _find_first_api_klass
74
- metadata = self.metadata[:example_group]
75
- klass = nil
76
-
77
- until metadata.nil? || klass.respond_to?(:new)
78
- klass = metadata[:description_args].first
79
- metadata = metadata[:example_group]
80
- end
81
-
82
- klass
83
- end
84
-
85
- def _describe_controller(klass, parent, &block)
86
- result = parent.describe(klass, &block)
87
- result.instance_eval <<-EOF
88
- def controller_class
89
- #{klass}
90
- end
91
- EOF
92
- result
93
- end
94
- end
95
- end
96
- end
97
- end
@@ -1,28 +0,0 @@
1
- require 'raisin/testing/rspec/test_request'
2
-
3
- module Raisin
4
- module FunctionalTest
5
- def self.append_features(base)
6
- base.class_eval do
7
- include RSpec::Rails::ControllerExampleGroup
8
- extend ClassMethods
9
- end
10
-
11
- super
12
- end
13
-
14
- module ClassMethods
15
- def controller_class
16
- metadata = self.metadata[:example_group]
17
- klass = nil
18
-
19
- until metadata.nil? || klass.respond_to?(:new)
20
- klass = metadata[:description_args].first
21
- metadata = metadata[:example_group]
22
- end
23
-
24
- klass.respond_to?(:new) ? klass : super
25
- end
26
- end
27
- end
28
- end
@@ -1,21 +0,0 @@
1
- module ActionController
2
- class TestRequest < ActionDispatch::TestRequest
3
-
4
- #
5
- # Transforms Raisin controller's path as a standart Rails path
6
- # before assigning parameters to the request
7
- #
8
- # Example:
9
- # controller_path: 'users_api#index', action: 'index'
10
- # becomes
11
- # controller_path: 'users', action: 'index'
12
- #
13
- def assign_parameters_with_api(routes, controller_path, action, parameters = {})
14
- controller_path.sub!(/_api/, '')
15
- controller_path.sub!(/\/?#{action}/, '')
16
- assign_parameters_without_api(routes, controller_path, action, parameters)
17
- end
18
-
19
- alias_method_chain :assign_parameters, :api
20
- end
21
- end
@@ -1,34 +0,0 @@
1
- module Raisin
2
- module UnitHelper
3
- extend ActiveSupport::Concern
4
-
5
- module ClassMethods
6
- def controller_class
7
- metadata = self.metadata[:example_group]
8
- klass = nil
9
-
10
- until metadata.nil? || klass.respond_to?(:new)
11
- klass = metadata[:description_args].first
12
- metadata = metadata[:example_group]
13
- end
14
-
15
- klass.respond_to?(:new) ? klass : super
16
- end
17
- end
18
-
19
- def controller
20
- self.class.controller_class.new.tap do |c|
21
- c.request = request
22
- c.response = response
23
- end
24
- end
25
-
26
- def request
27
- @request ||= ActionDispatch::TestRequest.new
28
- end
29
-
30
- def response
31
- @response ||= ActionDispatch::TestResponse.new
32
- end
33
- end
34
- end
@@ -1,21 +0,0 @@
1
- require 'raisin/testing/rspec/unit_helper'
2
-
3
- module Raisin
4
- module UnitTest
5
- if defined?(RSpec::Rails)
6
- include RSpec::Rails::RailsExampleGroup
7
- include RSpec::Rails::Matchers::RedirectTo
8
- include RSpec::Rails::Matchers::RenderTemplate
9
- end
10
-
11
- def self.append_features(base)
12
- base.class_eval do
13
- include Raisin::UnitHelper
14
- subject { controller }
15
- end
16
-
17
- super
18
- end
19
-
20
- end
21
- end
@@ -1,10 +0,0 @@
1
- # require 'rspec'
2
- # require 'raisin/testing/rspec/dsl'
3
- require 'raisin/testing/rspec/unit_test'
4
- require 'raisin/testing/rspec/functional_test'
5
-
6
- # require 'raisin/testing/rspec/helper'
7
-
8
- # RSpec.configure do |c|
9
- # c.extend(Raisin::Testing::RSpec::DSL)
10
- # end
@@ -1,12 +0,0 @@
1
- module Raisin
2
- class VersionConstraint
3
- def initialize(version)
4
- @version = version
5
- @bypass = version == Router::ALL_VERSIONS
6
- end
7
-
8
- def matches?(req)
9
- @bypass || @version == req.env['raisin.version']
10
- end
11
- end
12
- end