api_presenter 0.3.0 → 0.4.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9e411385a8bd85df6bc3efe9f1ec418d5608f26f
4
- data.tar.gz: a7da14574b9aabd4501edafd1555feb16246ff05
3
+ metadata.gz: 0ac6c35bce2e92fb4729a274a36dd3e8def81451
4
+ data.tar.gz: ff79c2727b4dd200a6d8346d3362af4f689193fc
5
5
  SHA512:
6
- metadata.gz: 810bfdd0b1932949b0d6984ac1b0935467de3e5d27858f05890b906447aa2124fc0beee23c0cf95a5d624df168a2e20eb2b38d567650c685e291a905724859a4
7
- data.tar.gz: 29e3508ed61708ae44f7f4470e9687a0131d0e56a991b307ba1519ebd6b6755d92ff7903a26f7af6d25b6bd78d8f62b4a742332439d5b9b758f6bfc08e65f583
6
+ metadata.gz: 419305783b53de4985e852d0d69a6d8a8f39dfbe9b5255e0b6fef4e6fab9d8832bf6a75b3d0ef575a372c3d6e83e4dce9377adaf05eceabb79e630da9a933269
7
+ data.tar.gz: a1edcba953b05ebe0d699db1d336dc49c70cdefd54129a25b57589b32498049d4478c9617ff38b2b925c4b7bbce8a4b43a05e44a8218d2584c2ad17df4875dbb
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## 0.3.0 (2016-11-09)
2
+
3
+ Adds configuration options and generator.
4
+
1
5
  ## 0.2.4 (2016-11-07)
2
6
 
3
7
  Logical restructure. No API changes.
data/README.md CHANGED
@@ -52,16 +52,22 @@ class User < ActiveRecord::Base
52
52
  end
53
53
  ```
54
54
 
55
+ When requesting posts from the API, a client may also want any or all of the posts' categories, sub categories, and users. It may also want the current user's policies for the posts to generate correct UI.
56
+
55
57
  ### 0. Generate config file
56
58
 
57
59
  `rails g api_presenter:config`
58
60
 
59
- Generates a configuration file that allows you to override the default querystring params used by the `presenter` concern. More to come.
61
+ Generates a configuration file that allows you to override the default querystring params used by the `presenter` concern. More configuration options coming soon.
60
62
 
61
63
  ### 1. Create your Presenter
62
64
 
65
+ Using the supplied generator, generate a presenter class for your ActiveRecord model. The generator will also generate a convenient `ApplicationApiPresenter` class for centralized methods.
66
+
67
+ `rails g api_presenter:presenter post`
68
+
63
69
  ```ruby
64
- class PostPresenter < ApiPresenter::Base
70
+ class PostPresenter < ApiApplicationController
65
71
  def associations_map
66
72
  {
67
73
  categories: { associations: { sub_category: :category } },
@@ -80,7 +86,7 @@ class PostPresenter < ApiPresenter::Base
80
86
  end
81
87
  ```
82
88
 
83
- Presenters can define up to three methods:
89
+ Presenters have three opt-in methods:
84
90
 
85
91
  * `associations_map` The business-dictated includable resources for the ActiveRecord model (`Post`, in this case). Consists of the model name as key and traversal required to preload/load them. In most cases, the value of `associations` will correspond directly to associations on the primary model.
86
92
  * `policy_methods` A list of Pundit policy methods to resolve for the primary collection if policies are requested.
@@ -90,7 +96,7 @@ Presenters can define up to three methods:
90
96
 
91
97
  Your presentable collection can be an `ActiveRecord::Relation`, an array of records, or even a single record. Just call `present` on it from your controller action. The preloads will be performed, and the included collections/policies will be available in the `@presenter` instance variable.
92
98
 
93
- The following querystring params are used by the supplied controller concern's `present` method:
99
+ The following configurable querystring params are used by the supplied controller concern's `present` method:
94
100
 
95
101
  * `count [Boolean]` Pass true if you just want a count of the primary collection
96
102
  * `policies [Boolean]` Pass true if you want to resolve policies for the primary collection records
@@ -107,6 +113,7 @@ class PostsController < ApplicationController
107
113
  # GET /posts?include=categories,subCategories,users&policies=true
108
114
  #
109
115
  def index
116
+ authorize Post
110
117
  posts = PostQuery.records(current_user, params)
111
118
  present posts
112
119
  end
@@ -115,8 +122,9 @@ class PostsController < ApplicationController
115
122
  # GET /posts/:id?include=categories,subCategories,users&policies=true
116
123
  #
117
124
  def show
118
- post = Post.find(params[:id])
119
- present post
125
+ @post = Post.find(params[:id])
126
+ authorize @post
127
+ present @post
120
128
  end
121
129
  end
122
130
  ```
@@ -125,11 +133,11 @@ end
125
133
 
126
134
  How you ultimately render the primary collection and the data produced by ApiPresenter is up to you. `@presenter` has the following properties:
127
135
 
128
- * `collection` The primary collection that was passed into the presenter.
129
- * `total_count` When using Kaminari or another pagination method that defines a `total_count` property, returns unpaginated count. If the primary collection is not an `ActiveRecord::Relation`, simply returns the number of records.
130
- * `included_collection_names` Convenience method that returns an array of included collecton model names.
131
- * `included_collections` A hash of included collections, consisting of the model name and corresponding records.
132
- * `policies` An array of resolved policies for the primary collection.
136
+ * `collection [Array<ActiveRecord::Base>]` The primary collection that was passed into the presenter. Empty if count requested.
137
+ * `total_count [Integer]` When using Kaminari or another pagination method that defines a `total_count` property, returns unpaginated count. If the primary collection is not an `ActiveRecord::Relation`, simply returns the number of records.
138
+ * `included_collection_names [Array<Symbol>]` Convenience method that returns an array of included collecton model names.
139
+ * `included_collections [Hash]` A hash of included collections, consisting of the model name and corresponding records.
140
+ * `policies [Array<Hash>]` An array of resolved policies for the primary collection.
133
141
 
134
142
  Here's an example of how you might render this using JBduiler:
135
143
 
@@ -318,7 +326,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
318
326
 
319
327
  ## Contributing
320
328
 
321
- Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/api_presenter.
329
+ Bug reports and pull requests are welcome on GitHub at https://github.com/uberllama/api_presenter.
322
330
 
323
331
 
324
332
  ## License
@@ -1,3 +1,3 @@
1
1
  module ApiPresenter
2
- VERSION = "0.3.0"
2
+ VERSION = "0.4.0"
3
3
  end
@@ -1 +1,8 @@
1
- Creates configuration file
1
+ Description:
2
+ Generates configuration filee.
3
+
4
+ Example:
5
+ rails generate api_presenter:config
6
+
7
+ This will create:
8
+ config/initializers/api_presenter.rb
@@ -4,7 +4,7 @@ module ApiPresenter
4
4
  source_root File.expand_path('../templates', __FILE__)
5
5
 
6
6
  def copy_config_file
7
- copy_file 'api_presenter_config.rb', 'config/initializers/api_presenter_config.rb'
7
+ copy_file('config.rb', 'config/initializers/api_presenter.rb')
8
8
  end
9
9
  end
10
10
  end
@@ -0,0 +1,9 @@
1
+ Description:
2
+ Generates an API presenter for an ActiveRecord model with the given name, and a base class ApplicationApiPresenter unless already exists.
3
+
4
+ Example:
5
+ rails generate api_presenter:presenter post
6
+
7
+ This will create:
8
+ app/presenters/application_api_presenter.rb
9
+ app/presenters/post_presenter.rb
@@ -0,0 +1,17 @@
1
+ module ApiPresenter
2
+ module Generators
3
+ class PresenterGenerator < ::Rails::Generators::NamedBase
4
+ source_root File.expand_path('../templates', __FILE__)
5
+
6
+ def create_application_presenter
7
+ unless File.exist?('app/presenters/application_api_presenter.rb')
8
+ copy_file('application_presenter.rb', 'app/presenters/application_api_presenter.rb')
9
+ end
10
+ end
11
+
12
+ def create_presenter
13
+ template('presenter.rb', File.join('app/presenters', class_path, "#{file_name}_presenter.rb"))
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,2 @@
1
+ class ApplicationApiPresenter < ApiPresenter::Base
2
+ end
@@ -0,0 +1,13 @@
1
+ class <%= class_name %>Presenter < ApplicationApiPresenter
2
+ def associations_map
3
+ {}
4
+ end
5
+
6
+ def policy_methods
7
+ []
8
+ end
9
+
10
+ def policy_associations
11
+ []
12
+ end
13
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: api_presenter
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Yuval Kordov
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2016-11-09 00:00:00.000000000 Z
12
+ date: 2016-11-10 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activesupport
@@ -139,7 +139,11 @@ files:
139
139
  - lib/api_presenter/version.rb
140
140
  - lib/generators/api_presenter/config/USAGE
141
141
  - lib/generators/api_presenter/config/config_generator.rb
142
- - lib/generators/api_presenter/config/templates/api_presenter_config.rb
142
+ - lib/generators/api_presenter/config/templates/config.rb
143
+ - lib/generators/api_presenter/presenter/USAGE
144
+ - lib/generators/api_presenter/presenter/presenter_generator.rb
145
+ - lib/generators/api_presenter/presenter/templates/application_presenter.rb
146
+ - lib/generators/api_presenter/presenter/templates/presenter.rb
143
147
  homepage: http://github.com/uberllama/api_presenter
144
148
  licenses:
145
149
  - MIT