daylight 0.9.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (116) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +113 -0
  3. data/app/controllers/daylight_documentation/documentation_controller.rb +27 -0
  4. data/app/helpers/daylight_documentation/documentation_helper.rb +57 -0
  5. data/app/views/daylight_documentation/documentation/_header.haml +4 -0
  6. data/app/views/daylight_documentation/documentation/index.haml +12 -0
  7. data/app/views/daylight_documentation/documentation/model.haml +114 -0
  8. data/app/views/layouts/documentation.haml +22 -0
  9. data/config/routes.rb +8 -0
  10. data/doc/actions.md +70 -0
  11. data/doc/benchmarks.md +17 -0
  12. data/doc/contribute.md +80 -0
  13. data/doc/develop.md +1205 -0
  14. data/doc/environment.md +109 -0
  15. data/doc/example.md +3 -0
  16. data/doc/framework.md +31 -0
  17. data/doc/install.md +128 -0
  18. data/doc/principles.md +42 -0
  19. data/doc/testing.md +107 -0
  20. data/doc/usage.md +970 -0
  21. data/lib/daylight/api.rb +293 -0
  22. data/lib/daylight/associations.rb +247 -0
  23. data/lib/daylight/client_reloader.rb +45 -0
  24. data/lib/daylight/collection.rb +161 -0
  25. data/lib/daylight/errors.rb +94 -0
  26. data/lib/daylight/inflections.rb +7 -0
  27. data/lib/daylight/mock.rb +282 -0
  28. data/lib/daylight/read_only.rb +88 -0
  29. data/lib/daylight/refinements.rb +63 -0
  30. data/lib/daylight/reflection_ext.rb +67 -0
  31. data/lib/daylight/resource_proxy.rb +226 -0
  32. data/lib/daylight/version.rb +10 -0
  33. data/lib/daylight.rb +27 -0
  34. data/rails/daylight/api_controller.rb +354 -0
  35. data/rails/daylight/documentation.rb +13 -0
  36. data/rails/daylight/helpers.rb +32 -0
  37. data/rails/daylight/params.rb +23 -0
  38. data/rails/daylight/refiners.rb +186 -0
  39. data/rails/daylight/server.rb +29 -0
  40. data/rails/daylight/tasks.rb +37 -0
  41. data/rails/extensions/array_ext.rb +9 -0
  42. data/rails/extensions/autosave_association_fix.rb +49 -0
  43. data/rails/extensions/has_one_serializer_ext.rb +111 -0
  44. data/rails/extensions/inflections.rb +6 -0
  45. data/rails/extensions/nested_attributes_ext.rb +94 -0
  46. data/rails/extensions/read_only_attributes.rb +35 -0
  47. data/rails/extensions/render_json_meta.rb +99 -0
  48. data/rails/extensions/route_options.rb +47 -0
  49. data/rails/extensions/versioned_url_for.rb +22 -0
  50. data/spec/config/dependencies.rb +2 -0
  51. data/spec/config/factory_girl.rb +4 -0
  52. data/spec/config/simplecov_rcov.rb +26 -0
  53. data/spec/config/test_api.rb +1 -0
  54. data/spec/controllers/documentation_controller_spec.rb +24 -0
  55. data/spec/dummy/README.rdoc +28 -0
  56. data/spec/dummy/Rakefile +6 -0
  57. data/spec/dummy/app/assets/images/.keep +0 -0
  58. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  59. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  60. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  61. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  62. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  63. data/spec/dummy/app/mailers/.keep +0 -0
  64. data/spec/dummy/app/models/.keep +0 -0
  65. data/spec/dummy/app/models/concerns/.keep +0 -0
  66. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  67. data/spec/dummy/bin/bundle +3 -0
  68. data/spec/dummy/bin/rails +4 -0
  69. data/spec/dummy/bin/rake +4 -0
  70. data/spec/dummy/config/application.rb +24 -0
  71. data/spec/dummy/config/boot.rb +5 -0
  72. data/spec/dummy/config/database.yml +25 -0
  73. data/spec/dummy/config/environment.rb +5 -0
  74. data/spec/dummy/config/environments/development.rb +29 -0
  75. data/spec/dummy/config/environments/production.rb +80 -0
  76. data/spec/dummy/config/environments/test.rb +36 -0
  77. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  78. data/spec/dummy/config/initializers/daylight.rb +1 -0
  79. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  80. data/spec/dummy/config/initializers/inflections.rb +16 -0
  81. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  82. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  83. data/spec/dummy/config/initializers/session_store.rb +3 -0
  84. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  85. data/spec/dummy/config/locales/en.yml +23 -0
  86. data/spec/dummy/config/routes.rb +59 -0
  87. data/spec/dummy/config.ru +4 -0
  88. data/spec/dummy/lib/assets/.keep +0 -0
  89. data/spec/dummy/log/.keep +0 -0
  90. data/spec/dummy/public/404.html +58 -0
  91. data/spec/dummy/public/422.html +58 -0
  92. data/spec/dummy/public/500.html +57 -0
  93. data/spec/dummy/public/favicon.ico +0 -0
  94. data/spec/helpers/documentation_helper_spec.rb +82 -0
  95. data/spec/lib/daylight/api_spec.rb +178 -0
  96. data/spec/lib/daylight/associations_spec.rb +325 -0
  97. data/spec/lib/daylight/collection_spec.rb +235 -0
  98. data/spec/lib/daylight/errors_spec.rb +111 -0
  99. data/spec/lib/daylight/mock_spec.rb +144 -0
  100. data/spec/lib/daylight/read_only_spec.rb +118 -0
  101. data/spec/lib/daylight/refinements_spec.rb +80 -0
  102. data/spec/lib/daylight/reflection_ext_spec.rb +50 -0
  103. data/spec/lib/daylight/resource_proxy_spec.rb +325 -0
  104. data/spec/rails/daylight/api_controller_spec.rb +421 -0
  105. data/spec/rails/daylight/helpers_spec.rb +41 -0
  106. data/spec/rails/daylight/params_spec.rb +45 -0
  107. data/spec/rails/daylight/refiners_spec.rb +178 -0
  108. data/spec/rails/extensions/array_ext_spec.rb +51 -0
  109. data/spec/rails/extensions/has_one_serializer_ext_spec.rb +135 -0
  110. data/spec/rails/extensions/nested_attributes_ext_spec.rb +177 -0
  111. data/spec/rails/extensions/render_json_meta_spec.rb +140 -0
  112. data/spec/rails/extensions/route_options_spec.rb +309 -0
  113. data/spec/rails/extensions/versioned_url_for_spec.rb +46 -0
  114. data/spec/spec_helper.rb +43 -0
  115. data/spec/support/migration_helper.rb +40 -0
  116. metadata +422 -0
@@ -0,0 +1,67 @@
1
+ require 'active_resource/reflection'
2
+
3
+ ##
4
+ # Extension to use the API namespace and version modules to lookup classes for
5
+ # a reflection. The benefit is to be able to define an association wihtout
6
+ # the module name or using the :class_name option.
7
+ #
8
+ # Without the extension, we have to specify the `:class_name`:
9
+ #
10
+ # class API::V1::Post < Daylight::API
11
+ # has_many :comments, class_name: 'api/v1/comment'
12
+ # end
13
+ #
14
+ # With the extension, it will be determined using the namespace and version modules
15
+ #
16
+ # class API::V1::Post < Daylight::API
17
+ # belongs_to :blog
18
+ # end
19
+ #
20
+ # API::V1::Post.find(1).blog #=> #<API::V1::Blog:0x007ffa8a43f1e8 ...>
21
+ #
22
+ # The `:class_name` option still can be specified for alternate behavior
23
+ #
24
+ # class API::V1::Post < Daylight::API
25
+ # belongs_to :author, class_name: 'api/v1/user', foreign_key: 'created_by'
26
+ # end
27
+
28
+ module Daylight::ReflectionExt
29
+ extend ActiveSupport::Concern
30
+
31
+ included do
32
+ ##
33
+ # Determines and tests for the name with namespace and version.
34
+ #
35
+ # Falls back to the name of the association which was the original behavior
36
+ # of `AssociationReflection`.
37
+ #
38
+ # See
39
+ # ActiveResource::Reflection::AssociationReflection
40
+
41
+ def expanded_name
42
+ @expanded_name = begin
43
+ candidate_name = [Daylight::API.namespace, Daylight::API.version, name.to_s.classify].join("::")
44
+ candidate_name.classify.constantize # test for the name, raise if non-existant
45
+ candidate_name.underscore
46
+ rescue
47
+ name.to_s # fallback to using the original functionality
48
+ end
49
+ end
50
+
51
+ private
52
+ ##
53
+ # Uses the expanded or default name to derive the class name. Changes
54
+ # original `AssociationReflection` functionality.
55
+ #
56
+ # See
57
+ # ActiveResource::Reflection::AssociationReflection.derive_class_name
58
+
59
+ def derive_class_name
60
+ return (options[:class_name] ? options[:class_name].to_s : expanded_name).classify
61
+ end
62
+ end
63
+ end
64
+
65
+ ActiveResource::Reflection::AssociationReflection.class_eval do
66
+ include Daylight::ReflectionExt
67
+ end
@@ -0,0 +1,226 @@
1
+ ##
2
+ # Proxies requests to ActiveResource once the data has been accessed.
3
+ # Allows chaining of scope calls ala ActiveRecord
4
+ class Daylight::ResourceProxy
5
+ include Enumerable
6
+
7
+ delegate :to_xml, :to_yaml, :length, :each, :to_ary, :size, :last, :[], :==, to: :to_a
8
+ delegate :first_or_initialize, :first_or_create, to: :records
9
+ delegate :resource_class, to: :class
10
+
11
+ attr_reader :association_name, :association_resource
12
+
13
+ # turn off constructor, only use factory methods
14
+ private_class_method :new
15
+
16
+ def initialize association={}
17
+ @current_params = {}
18
+ @association_name, @association_resource = association.first
19
+ end
20
+
21
+ ##
22
+ # Delegates appending to the association resource when available
23
+
24
+ def << value
25
+ if association_resource
26
+ association_resource.send("#{association_name}=", records.elements << value)
27
+ else
28
+ raise NoMethodError, "undefined method `<<' for #{self}"
29
+ end
30
+ end
31
+
32
+ ##
33
+ # Sets `from` URL on a request
34
+ def from from
35
+ @from = from
36
+ self
37
+ end
38
+
39
+ ##
40
+ # Loads records from server based on current paremeters and from URL
41
+ def load
42
+ resource_class.find(:all, params: to_params, from: @from)
43
+ end
44
+
45
+ ##
46
+ # Returns a copy of the current parameters used to fetch records
47
+ def to_params
48
+ current_params.dup
49
+ end
50
+
51
+ ##
52
+ # Returns the records, requests them from server if not fetched
53
+ def records
54
+ @records ||= load
55
+ end
56
+
57
+ ##
58
+ # Returns the records, forces fetch from server
59
+ def reload
60
+ @records = load
61
+ end
62
+
63
+ ##
64
+ # Converts records to an Array
65
+ def to_a
66
+ records.to_a
67
+ end
68
+
69
+ ##
70
+ # Adds scopes to the current parameters
71
+ def append_scope scope
72
+ spawn.tap do |proxy|
73
+ proxy.current_params[:scopes] ||= []
74
+ proxy.current_params[:scopes] << scope
75
+ proxy.current_params[:scopes].uniq!
76
+ end
77
+ end
78
+
79
+ ##
80
+ # Merges conditions to the current parameters
81
+ def where conditions
82
+ spawn.tap do |proxy|
83
+ proxy.current_params[:filters] ||= {}
84
+ proxy.current_params[:filters].merge! conditions
85
+ end
86
+ end
87
+
88
+ ##
89
+ # Sets limit in the current parameters
90
+ def limit value
91
+ spawn.tap do |proxy|
92
+ proxy.current_params[:limit] = value
93
+ end
94
+ end
95
+
96
+ ##
97
+ # Sets order in the current parameters
98
+ def order value
99
+ spawn.tap do |proxy|
100
+ proxy.current_params[:order] = value
101
+ end
102
+ end
103
+
104
+ ##
105
+ # Sets offset in the current parameters
106
+ def offset value
107
+ spawn.tap do |proxy|
108
+ proxy.current_params[:offset] = value
109
+ end
110
+ end
111
+
112
+ ##
113
+ # Merges conditions to the current parameters, and fetches the first result.
114
+ # Immediately issues the request to the API.
115
+
116
+ def find_by conditions
117
+ where(conditions).limit(1).first
118
+ end
119
+
120
+ ##
121
+ # Sets the limit to the current parameters, and fetches the first result.
122
+ # Immediately issues the request to the API.
123
+
124
+ def first
125
+ limit(1).to_a.first
126
+ end
127
+
128
+ ##
129
+ # Special inspect that shows the fetched results (up to 10 fo them) and the
130
+ # current params to fetch those results.
131
+ #
132
+ # Immediately issues the request to the API.
133
+
134
+ def inspect
135
+ records = to_a.take(11)
136
+ records[10] = '...' if entries.size == 11
137
+
138
+ "#<#{self.class.name} #{records} @current_params=#{current_params}>"
139
+ end
140
+
141
+ class << self
142
+ # Each ResourceProxy will have thier own resource
143
+ attr_accessor :resource_class
144
+
145
+ ##
146
+ # Factory method to generate a child class for ResourceProxy with the
147
+ # required resource class.
148
+ #
149
+ # proxy = ResourceProxy[User] #=> User::ResourceProxy
150
+ #
151
+ # Onece a child class has been created, it can be use it to create
152
+ # instances:
153
+ #
154
+ # ResourceProxy[User].new
155
+
156
+ def [] resource_class
157
+ if resource_class.const_defined?(:ResourceProxy)
158
+ return resource_class.const_get(:ResourceProxy)
159
+ end
160
+
161
+ Class.new(Daylight::ResourceProxy) do
162
+ # Allow instances to be created
163
+ public_class_method :new
164
+
165
+ # Set our resource
166
+ self.resource_class = resource_class
167
+
168
+ # Set our ResourceProxy constant
169
+ resource_class.const_set(:ResourceProxy, self)
170
+ end
171
+ end
172
+
173
+ ##
174
+ # Define a name for the class
175
+ def name
176
+ "#{resource_class}::ResourceProxy"
177
+ end
178
+
179
+ ##
180
+ # Use the class name as the inspect
181
+ alias_method :inspect, :name
182
+ end
183
+
184
+ ##
185
+ # Will attempt to fulfill the method if it exists on the resource or if it
186
+ # exists on an Array. Defines or delegates the method on for subsequent
187
+ # execution.
188
+
189
+ def method_missing(method_name, *args, &block)
190
+ if resource_class.respond_to?(method_name)
191
+ self.class.send(:define_method, method_name) do |*method_args, &method_block|
192
+ resource_class.send(method_name, *method_args, &method_block)
193
+ end
194
+ resource_class.send(method_name, *args, &block)
195
+ elsif Array.method_defined?(method_name)
196
+ self.class.delegate method_name, :to => :to_a
197
+ to_a.send(method_name, *args, &block)
198
+ else
199
+ super
200
+ end
201
+ end
202
+
203
+ protected
204
+ attr_accessor :current_params
205
+
206
+ ##
207
+ # Clone current ResourceProxy and with `current_params` to keep its query
208
+ # context
209
+ #
210
+ # See
211
+ # reset
212
+
213
+ def spawn
214
+ clone.reset(current_params)
215
+ end
216
+
217
+ ##
218
+ # Resets a ResourceProxy marked to refetch results based on blank or
219
+ # supplied `current_params`
220
+
221
+ def reset old_params={}
222
+ @current_params = old_params.deep_dup
223
+ @records = nil
224
+ self
225
+ end
226
+ end
@@ -0,0 +1,10 @@
1
+ module Daylight
2
+ module Version
3
+ MAJOR = 0
4
+ MINOR = 9
5
+ PATCH = 0
6
+ BUILD = 'rc1'
7
+
8
+ Daylight::VERSION = STRING = [MAJOR, MINOR, PATCH, BUILD].compact.join('.')
9
+ end
10
+ end
data/lib/daylight.rb ADDED
@@ -0,0 +1,27 @@
1
+ $:.unshift File.expand_path('../../rails', __FILE__)
2
+
3
+ require 'active_support/core_ext'
4
+ require 'active_resource'
5
+
6
+ ##
7
+ # Include into API client to enable Daylight::API based queries
8
+
9
+ module Daylight
10
+ extend ActiveSupport::Autoload
11
+
12
+ eager_autoload do
13
+ autoload :Version
14
+ autoload :Associations
15
+ autoload :Collection
16
+ autoload :Errors
17
+ autoload :Inflections
18
+ autoload :Refinements
19
+ autoload :ReadOnly
20
+ autoload :ResourceProxy
21
+ autoload :ReflectionExt
22
+ autoload :API
23
+ end
24
+ end
25
+
26
+ # run eager load
27
+ Daylight.eager_load!
@@ -0,0 +1,354 @@
1
+ ##
2
+ # Common conntroller built on top of `ApplicationController` that assists with
3
+ # setting up standard, conventional REST and Daylight supported actions.
4
+ #
5
+ # Have your API Controllers subclass from APIController:
6
+ #
7
+ # class ExampleController < APIController
8
+ # end
9
+ #
10
+ # You must "turn on" common actions to allow for functionality. All common
11
+ # actions are turned off by default so that what is exposed is
12
+ # determiend by the API devloper. For example, to turn on `index` action:
13
+ #
14
+ # class ExampleController < APIController
15
+ # handles :index
16
+ # end
17
+ #
18
+ # The common actions provided by APIController are: `:index`, `:create`,
19
+ # `:show`, `:update`, `:destroy`, `:associated`, and `:remoted`.
20
+ #
21
+ # The method implementations are simply methods in a superclass and can be
22
+ # overwritten or called through `super`:
23
+ #
24
+ # class ExampleController < APIController
25
+ # handles :index
26
+ #
27
+ # def index
28
+ # @title = 'My Title'
29
+ # super
30
+ # end
31
+ # end
32
+ #
33
+ # The model and instance variable for these actions are based on the
34
+ # controller name. If you need to customize these, you can change them:
35
+ #
36
+ # class ExampleController < APIController
37
+ # self.model_name = :news
38
+ # self.record_name = :post
39
+ #
40
+ # handles :index
41
+ # end
42
+ #
43
+ # Continue to use `ApplicationController` for shared methods.
44
+ #
45
+ # See:
46
+ # ApplicationController
47
+
48
+ class Daylight::APIController < ApplicationController
49
+ include Daylight::Helpers
50
+ include VersionedUrlFor
51
+
52
+ API_ACTIONS = [:index, :create, :show, :update, :destroy, :associated, :remoted].freeze
53
+ class_attribute :record_name, :collection_name, :model_name
54
+
55
+ alias_method :set_record_name, :record_name= #:nodoc:
56
+ alias_method :set_collection_name, :collection_name= #:nodoc:
57
+ alias_method :set_model_name, :model_name= #:nodoc:
58
+
59
+ ##
60
+ # Ensure messaging when sending unknown attributes or improper SQL
61
+ rescue_from ArgumentError,
62
+ ActiveRecord::UnknownAttributeError,
63
+ ActiveRecord::StatementInvalid do |e|
64
+
65
+ render json: { errors: e.message }, status: :bad_request
66
+ end
67
+
68
+ ##
69
+ # Ensure messaging when there are validation errors on save and update
70
+ rescue_from ActiveRecord::RecordInvalid do |e|
71
+ render json: { errors: e.record.errors }, status: :unprocessable_entity
72
+ end
73
+
74
+ ##
75
+ # Ensure messaging when there unpermitted attributes on save and update
76
+ rescue_from ActionController::UnpermittedParameters do |e|
77
+ errors = {}
78
+ e.params.each { |key| errors[key] = ['unpermitted parameter'] }
79
+ render json: { errors: errors }, status: :unprocessable_entity
80
+ end
81
+
82
+ ##
83
+ # Ensure messaging when attributes have not been permitted on the controller
84
+ rescue_from ActiveModel::ForbiddenAttributesError do |e|
85
+ render json: { errors: 'parameters have not been permitted on this action' }, status: :bad_request
86
+ end
87
+
88
+
89
+ class << self
90
+ protected
91
+ ##
92
+ # Turns on common actions based on subclass needs (sets them as public methods).
93
+ # Uses whitelist of allowed actions to be handled.
94
+ #
95
+ # See:
96
+ # API_ACTIONS
97
+ #--
98
+ # `public` is called in context of the subclass
99
+ def handles *actions
100
+ actions = API_ACTIONS.dup if actions.any? {|a| a == :all }
101
+
102
+ whitelisted = actions.map(&:to_sym) & API_ACTIONS
103
+
104
+ if (unhandled = actions - whitelisted).present?
105
+ logger.warn "Daylight::APIController isn't handling unwhitelisted actions"
106
+ logger.warn "\tspecified in #{self.name}#handles: #{unhandled.join(',')}"
107
+ end
108
+
109
+ public(*whitelisted) if whitelisted.present?
110
+ end
111
+
112
+ ##
113
+ # Retrieves conventional key for a model name used in params
114
+ def model_key
115
+ model_name.to_s.singularize.to_sym
116
+ end
117
+
118
+ ##
119
+ # Retieves `const` for ActiveRecord model as defined by `model_name`
120
+ def model
121
+ model_name.to_s.classify.constantize
122
+ end
123
+
124
+ ##
125
+ # Delegates to `model#primary_key`
126
+ # Not using delegate as model may change via `model_name` configuration
127
+ def primary_key
128
+ model.primary_key
129
+ end
130
+
131
+ ##
132
+ # Sets the default `model_name` and `record_name` by default.
133
+ # By default, they are based on the value determined by `controller_name`
134
+ #
135
+ # See:
136
+ # ActionController::Base.controller_name
137
+ def inherited api
138
+ name = api.controller_name.singularize
139
+
140
+ api.model_name = name
141
+ api.record_name = name
142
+ api.collection_name = 'collection'
143
+ end
144
+ end
145
+
146
+ protected
147
+ ##
148
+ # Retrieves the value for the `record_name` instance variable
149
+ def record
150
+ instance_variable_get("@#{record_name}")
151
+ end
152
+
153
+ ##
154
+ # Sets the value for the `record_name` instance variable
155
+ def record= value
156
+ instance_variable_set("@#{record_name}", value)
157
+ end
158
+
159
+ ##
160
+ # Retrieves the value for the `record_name` instance variable
161
+ def collection
162
+ instance_variable_get("@#{collection_name}")
163
+ end
164
+
165
+ ##
166
+ # Sets the value for the `record_name` instance variable
167
+ def collection= value
168
+ instance_variable_set("@#{collection_name}", value)
169
+ end
170
+
171
+ ##
172
+ # Instance-level delegate of the `model` method
173
+ #
174
+ # See:
175
+ # #model
176
+ def model
177
+ self.class.send(:model)
178
+ end
179
+
180
+ ##
181
+ # Instance-level delegate of the `model_key` method
182
+ #
183
+ # See:
184
+ # #model_key
185
+ def model_key
186
+ self.class.send(:model_key)
187
+ end
188
+
189
+ ##
190
+ # Retrieves the strong parameters for a model based on the `model_key` name.
191
+ # Ex. post_params
192
+ #
193
+ # If strong parameters are not defined, it will use the `model_key` to
194
+ # dereference the raw params.
195
+ # Ex. params[:post]
196
+ def model_params
197
+ model_params_name = "#{model_key}_params"
198
+ respond_to?(model_params_name, true) ? send(model_params_name) : params[model_key]
199
+ end
200
+
201
+ ##
202
+ # Instance-level delegate of the `primary_key` method
203
+ #
204
+ # See:
205
+ # #primary_key
206
+ def primary_key
207
+ self.class.send(:primary_key)
208
+ end
209
+ private
210
+ #
211
+ # The common actions for Daylight::APIController
212
+ #
213
+
214
+ ##
215
+ # Retrieves the collection for the records for `model` with any refinements
216
+ # in the params passed to `refine_by`. Accessed via:
217
+ #
218
+ # GET /posts.json
219
+ #
220
+ # Subclass implementation:
221
+ #
222
+ # def index
223
+ # render json: Post.refine_by(params)
224
+ # end
225
+ #
226
+ # See:
227
+ # Daylight::Refiners.refine_by
228
+ def index
229
+ render json: self.collection = model.refine_by(params)
230
+ end
231
+
232
+ ##
233
+ # Creates a record for the `model` with the attributes supplied in params.
234
+ # Accessed via:
235
+ #
236
+ # POST /posts.json
237
+ #
238
+ # Subclass implementation:
239
+ #
240
+ # def create
241
+ # @post = Post.new(params[:post])
242
+ # @post.save!
243
+ #
244
+ # render json: @post, status: :created, location: @post
245
+ # end
246
+ def create
247
+ self.record = model.new(model_params)
248
+ record.save!
249
+
250
+ render json: record, status: :created, location: record
251
+ end
252
+
253
+ ##
254
+ # Retrieves a record for the `model` with the `id` supplied in params.
255
+ # If the primary_key is configured to something besides `id` it will
256
+ # use that as a key.
257
+ #
258
+ # Accessed via:
259
+ #
260
+ # GET /posts/1.json
261
+ #
262
+ # Subclass implementation:
263
+ #
264
+ # def show
265
+ # render json: Post.find(params[Post.primary_key])
266
+ # end
267
+ def show
268
+ render json: self.record = model.find(params[primary_key])
269
+ end
270
+
271
+ ##
272
+ # Updates a record for the `model` with the `id` supplied in params.
273
+ # If the primary_key is configured to something besides `id` it will
274
+ # use that as a key.
275
+ #
276
+ # Accessed via:
277
+ #
278
+ # PATCH/PUT /posts/1.json
279
+ #
280
+ # Subclass implementation:
281
+ #
282
+ # def update
283
+ # Post.find(params[Post.primary_key]).update!(params[:post])
284
+ #
285
+ # head :no_content
286
+ # end
287
+ def update
288
+ (self.record = model.find(params[primary_key])).update!(model_params)
289
+
290
+ head :no_content
291
+ end
292
+
293
+ ##
294
+ # Destroys a record for the `model` with the `id` supplied in params.
295
+ # If the primary_key is configured to something besides `id` it will
296
+ # use that as a key.
297
+ #
298
+ # Accessed via:
299
+ #
300
+ # DELETE /posts/1.json
301
+ #
302
+ # Subclass implementation:
303
+ #
304
+ # def destroy
305
+ # Post.find(params[Post.primary_key]).destroy
306
+ #
307
+ # head :no_content
308
+ # end
309
+ def destroy
310
+ (self.record = model.find(params[primary_key])).destroy
311
+
312
+ head :no_content
313
+ end
314
+
315
+ ##
316
+ # Retrieves the collection for the associated records for a `model` with
317
+ # any refinements in the params passed to `associated`. Accessed via:
318
+ #
319
+ # GET /posts/1/comments.json
320
+ #
321
+ # Subclass implementation:
322
+ #
323
+ # def associated
324
+ # render json: Post.associated(params), root: associated_params
325
+ # end
326
+ #
327
+ # See:
328
+ # Daylight::Refiners.associated
329
+ # Daylight::Helpers.associated_params
330
+ # RouteOptions
331
+ def associated
332
+ render json: self.collection = model.associated(params), root: associated_params
333
+ end
334
+
335
+ ##
336
+ # Retrieves the collection returned by the `remoted` method with
337
+ # any refinements in the params passed to `remoted`. Accessed via:
338
+ #
339
+ # GET /posts/1/all_authorized_users.json
340
+ #
341
+ # Subclass implementation:
342
+ #
343
+ # def remoted
344
+ # render json: Post.remoted(params), root: remoted_params
345
+ # end
346
+ #
347
+ # See:
348
+ # Daylight::Refiners.remoted
349
+ # Daylight::Helpers.remoted_params
350
+ # RouteOptions
351
+ def remoted
352
+ render json: self.collection = model.remoted(params), root: remoted_params
353
+ end
354
+ end
@@ -0,0 +1,13 @@
1
+ require 'haml'
2
+ require 'actionpack/page_caching'
3
+
4
+ module DaylightDocumentation
5
+ end
6
+
7
+ ##
8
+ # Rails::Engine to add Documentation features to a Daylight::Server
9
+ module Daylight
10
+ class Documentation < ::Rails::Engine
11
+ isolate_namespace DaylightDocumentation
12
+ end
13
+ end