resourcify 0.0.3 → 0.1.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ce0387e71b16f415b6e60fdc2c6a8c87cf619ce7
4
- data.tar.gz: 7edfd0fa2a98bb1586459c98255774f1004f957a
3
+ metadata.gz: 024f5520a2238ae49d504aa8cc020fa538bb1819
4
+ data.tar.gz: 16c2a53c2a5d639ee0bc48f2a3c4f1dd0ad3df1c
5
5
  SHA512:
6
- metadata.gz: 8eeb99efad71fcae6e9ad3cb7197bcce6e1ffa77a4cffb4afff4a590ed1e0c9968e49ebf9d5364300fe55f648bce314c0fff570e93b1890203864639f5be2252
7
- data.tar.gz: efd021a1a002a47dab329669025317f69c8566ed85c221cecbf789ccdf54f7927ae5310c10624556bda7584b5144308d9f922c386626d61a92a155302fa12956
6
+ metadata.gz: c8d915890438f9f14eb391c44c5440d84c7216764f79bce73bddc69e31e790358e7b5ae6030db19beb014f1e4ee81aa52c56376009ed5388182dc5f245752df0
7
+ data.tar.gz: b205151f540d8c63c841fed008b6c315b2cfc16dc39b541c0f2ca6499bdffe467845aa36d1efe00819503af1c94d97a8fcf23e04ab1767a17d2a92ecc285e98f
data/README.md CHANGED
@@ -1,11 +1,9 @@
1
1
  # Resourcify [![Gem Version](https://badge.fury.io/rb/resourcify.png)](http://badge.fury.io/rb/resourcify)
2
2
 
3
- Resourcify is a rails gem that helps to speed up development by giving you json api controllers that inherit all restful actions. It also makes your models easier to filter by adding a "resourcify_filter" method. This gem behaves as an "acts_as" gem by using ActiveSupport Concerns.
3
+ Resourcify is a rails gem that helps to speed up development by giving you json api controllers that inherit all restful actions. It also makes your models easier to filter by adding a "filter_by" method. This gem behaves as an "acts_as" gem by using ActiveSupport Concerns.
4
4
 
5
5
  #### Caveat
6
- The resourcify gem currently depends on
7
- * [ActiveModel::Serializers](https://github.com/rails-api/active_model_serializers)
8
- * [Pundit](https://github.com/elabs/pundit)
6
+ The resourcify gem currently depends on [Pundit](https://github.com/elabs/pundit)
9
7
 
10
8
  ## Installation
11
9
 
@@ -98,19 +96,19 @@ end
98
96
  This allows you to filter your models like this
99
97
  ```ruby
100
98
  # Post with title equal to 'My First Post'
101
- Post.resourcify_filter("title::eq::My First Post")
99
+ Post.filter_by('title' => 'My First Post')
102
100
 
103
101
  # Users with first_name like 'Jo'
104
- User.resourcify_filter("first_name::like::Jo")
102
+ User.filter_by('first_name.like' => 'Jo')
105
103
 
106
104
  # The following parameters are allowed:
107
105
  # [eq(=), ne(!=), like(LIKE), lt(<), gt(>), lte(<=), gte(>=), in(IN [items]), nin(NOT IN [items])]
108
- User.resourcify_filter("first_name::like::Jo;;last_name::eq::Doe")
109
- User.resourcify_filter("age::gt::37")
110
- User.resourcify_filter("age::gte::21;;age::lte::35")
106
+ User.filter_by('first_name.like' => 'Jo', 'last_name.eq' => 'Doe')
107
+ User.filter_by('age.gt' => 37)
108
+ User.filter_by('age.gte' => 21, 'age.lte' => 35)
111
109
 
112
110
  # Users with age in [25, 26, 52, 62]
113
- User.resourcify_filter("age::in::25,26,52,62")
111
+ User.filter_by('age.in' => '25,26,52,62')
114
112
  ```
115
113
 
116
114
  Each model with "resourcify" has a "policy_class" method which returns "ApiPolicy" that can be used by a generic api controller when using Pundit. This was added since the gem is currently tied with Pundit but will later be made optional.
@@ -1,7 +1,4 @@
1
1
  require "resourcify/resourcify"
2
2
 
3
3
  module Resourcify
4
-
5
- class UndefinedError < StandardError
6
- end
7
4
  end
@@ -6,17 +6,15 @@ module Controller::Actions
6
6
  authorize @record
7
7
 
8
8
  if @record.save
9
- @response_data[:success] = true
10
- @response_data[:data] = @record
9
+ render json: @record
11
10
  else
12
- @response_data[:error] = {
13
- type: 'validation',
14
- errors: @record.errors.messages,
15
- messages: @record.errors.full_messages
16
- }
17
- end
11
+ @error[:type] = 'Validation'
12
+ @error[:message] = 'Sorry, there were validation errors.'
13
+ @error[:errors] = @record.errors.messages
14
+ @error[:messages] = @record.errors.full_messages
18
15
 
19
- render json: @response_data
16
+ render json: @error
17
+ end
20
18
  end
21
19
  end
22
20
  end
@@ -4,17 +4,15 @@ module Controller::Actions
4
4
  authorize @record
5
5
 
6
6
  if @record.destroy
7
- @response_data[:success] = true
8
- @response_data[:data] = @record
7
+ render json: @record
9
8
  else
10
- @response_data[:error] = {
11
- type: 'other',
12
- errors: @record.errors.messages,
13
- messages: @record.errors.full_messages
14
- }
15
- end
9
+ @error[:type] = 'Validation'
10
+ @error[:message] = 'Sorry, there were validation errors.'
11
+ @error[:errors] = @record.errors.messages
12
+ @error[:messages] = @record.errors.full_messages
16
13
 
17
- render json: @response_data
14
+ render json: @error
15
+ end
18
16
  end
19
17
  end
20
18
  end
@@ -3,30 +3,20 @@ module Controller::Actions
3
3
  def index
4
4
  authorize _RC.new
5
5
 
6
- # recs = policy_scope(_RC.all)
7
- recs = policy_scope(_RC.includes(belongs_tos))
8
- # recs = policy_scope(_RC.includes([]).all)
6
+ @records = policy_scope(_RC.includes(belongs_tos))
9
7
 
10
- # apply resourcify_filter if present and query param is also present
11
- if recs.respond_to? "resourcify_filter" and params[:query].present?
12
- recs = recs.resourcify_filter(params[:query])
8
+ # apply filter_by if present
9
+ if @records.respond_to? "filter_by"
10
+ @records = @records.filter_by(params.except(:controller, :action, :page, :size))
13
11
  end
14
12
 
15
- recs_total = recs.count
13
+ response.headers['_meta_total'] = @records.count.to_s
16
14
 
17
15
  page = params[:page] || 1
18
- size = params[:size] || 25
19
- recs = recs.offset((page.to_i - 1) * size.to_i).limit(size)
16
+ size = params[:size] || 20
17
+ @records = @records.offset((page.to_i - 1) * size.to_i).limit(size)
20
18
 
21
- if recs
22
- @response_data[:success] = true
23
- @response_data[:data] = {
24
- total: recs_total,
25
- rows: recs
26
- }
27
- end
28
-
29
- render json: @response_data
19
+ render json: @records
30
20
  end
31
21
  end
32
22
  end
@@ -2,11 +2,8 @@ module Controller::Actions
2
2
  module Show
3
3
  def show
4
4
  authorize @record
5
-
6
- @response_data[:success] = true
7
- @response_data[:data] = @record
8
-
9
- render json: @response_data
5
+
6
+ render json: @record
10
7
  end
11
8
  end
12
9
  end
@@ -4,17 +4,15 @@ module Controller::Actions
4
4
  authorize @record
5
5
 
6
6
  if @record.update(permitted_params)
7
- @response_data[:success] = true
8
- @response_data[:data] = @record
7
+ render json: @record
9
8
  else
10
- @response_data[:error] = {
11
- type: 'validation',
12
- errors: @record.errors.messages,
13
- messages: @record.errors.full_messages
14
- }
15
- end
9
+ @error[:type] = 'Validation'
10
+ @error[:message] = 'Sorry, there were validation errors.'
11
+ @error[:errors] = @record.errors.messages
12
+ @error[:messages] = @record.errors.full_messages
16
13
 
17
- render json: @response_data
14
+ render json: @error
15
+ end
18
16
  end
19
17
  end
20
18
  end
@@ -1,49 +1,30 @@
1
1
  module Controller
2
2
  module Base
3
- require 'active_record/serializer_override'
4
- ActiveRecord::Base.send(:include, ActiveRecord::SerializerOverride)
5
3
 
6
4
  include Pundit
7
5
 
8
6
  private
9
- # Set JSON response data
10
- def set_response_data
11
- @response_data = {
12
- success: false,
13
- data: { total: 0, rows: [] },
14
- error: { type: '', errors: {}, messages: [] }
7
+ # Set error response data
8
+ def set_error
9
+ @error = {
10
+ error: true,
11
+ type: 'Error',
12
+ message: 'Sorry, an error occurred.'
15
13
  }
16
- # raise Resourcify::UndefinedError unless _RC.respond_to? 'resourcified?'
17
14
  end
18
15
 
19
- # def resource_not_resourcified
20
- # @response_data[:success] = false
21
- # @response_data[:error] = {
22
- # type: 'resource_not_resourcified',
23
- # messages: [ 'Resourcify::UndefinedError. Resource route not defined' ]
24
- # }
25
-
26
- # render json: @response_data
27
- # end
28
-
29
16
  def record_not_found
30
- @response_data[:success] = false
31
- @response_data[:error] = {
32
- type: 'record_not_found',
33
- messages: [ 'Sorry, the record was not found.' ]
34
- }
17
+ @error[:type] = 'RecordNotFound'
18
+ @error[:message] = 'Sorry, the record was not found.'
35
19
 
36
- render json: @response_data
20
+ render json: @error
37
21
  end
38
22
 
39
23
  def user_not_authorized
40
- @response_data[:success] = false
41
- @response_data[:error] = {
42
- type: 'user_not_authorized',
43
- messages: [ 'Sorry, you do not have the permission.' ]
44
- }
24
+ @error[:type] = 'UserNotAuthorized'
25
+ @error[:message] = 'Sorry, you do not have the permission.'
45
26
 
46
- render json: @response_data
27
+ render json: @error
47
28
  end
48
29
 
49
30
  def _RC
@@ -0,0 +1,33 @@
1
+ module Model
2
+ module FilterBy
3
+ def filter_by(filters = {})
4
+ records = self
5
+ column_names = self.column_names
6
+ simple_ops = { eq: '=', lt: '<', gt: '>', lte: '<=', gte: '>=' }
7
+ filters.select { |e| column_names.include?(e.split('.').first) }.each do |key, value|
8
+ field, operator = key.split('.')
9
+ operator = (operator)? operator.to_sym : :eq
10
+
11
+ if simple_ops[operator]
12
+ records = records.where("#{field} #{simple_ops[operator]} ?", value)
13
+ elsif operator == :ne
14
+ records = records.where.not("#{field} = ?", value)
15
+ elsif operator == :in
16
+ records = records.where("#{field} IN (?)", value.split(','))
17
+ elsif operator == :nin
18
+ records = records.where.not("#{field} IN (?)", value.split(','))
19
+ elsif operator == :like
20
+ if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
21
+ records = records.where("#{field} ILIKE ?", "%#{value}%")
22
+ else
23
+ records = records.where("#{field} LIKE ?", "%#{value}%")
24
+ end
25
+ else
26
+ records = records.where("#{field} = ?", value)
27
+ end
28
+ end
29
+
30
+ records
31
+ end
32
+ end
33
+ end
@@ -1,6 +1,6 @@
1
- require "resourcify/model/resourcify_filter"
2
- require "resourcify/model/policy_class"
3
1
  require "resourcify/model/tpl"
2
+ require "resourcify/model/filter_by"
3
+ require "resourcify/model/policy_class"
4
4
  require "resourcify/controller/base"
5
5
  require "resourcify/controller/actions/index"
6
6
  require "resourcify/controller/actions/create"
@@ -21,15 +21,14 @@ module Resourcify
21
21
  def resourcified?() true end
22
22
 
23
23
  if self.ancestors.include?(ActiveRecord::Base) # models
24
- # Include filter and tag as filterable?
25
- send :extend, Model::ResourcifyFilter
26
- def filterable?() true end
24
+ # Add tpl methods
25
+ send :extend, Model::Tpl
27
26
 
28
27
  # Add policy_class method for pundit
29
28
  send :extend, Model::PolicyClass
30
29
 
31
- # Add tpl methods
32
- send :extend, Model::Tpl
30
+ # Include filter_by
31
+ send :extend, Model::FilterBy
33
32
 
34
33
  # Include instance methods
35
34
  send :include, ModelInstanceMethods
@@ -40,14 +39,15 @@ module Resourcify
40
39
  # Respond to only json requests
41
40
  respond_to :json
42
41
 
43
- # Set before_actions with methods located in base.rb
44
- before_action :set_response_data
42
+ # Set error with set_error method located in base.rb
43
+ before_action :set_error
44
+
45
+ # Set record with set_record method located in base.rb
45
46
  before_action :set_record, only: [:show, :update, :destroy]
46
47
 
47
48
  # Set rescue_froms with methods located in base.rb
48
49
  rescue_from ActiveRecord::RecordNotFound, with: :record_not_found
49
50
  rescue_from Pundit::NotAuthorizedError, with: :user_not_authorized
50
- # rescue_from UndefinedError, with: :resource_not_resourcified
51
51
 
52
52
  # Include base.rb with before_action filters & rescue_from methods
53
53
  send :include, Controller::Base
@@ -1,3 +1,3 @@
1
1
  module Resourcify
2
- VERSION = "0.0.3"
2
+ VERSION = "0.1.0"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: resourcify
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.3
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Baidu
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-04-14 00:00:00.000000000 Z
11
+ date: 2014-04-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rails
@@ -24,20 +24,6 @@ dependencies:
24
24
  - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: 4.0.0
27
- - !ruby/object:Gem::Dependency
28
- name: active_model_serializers
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ~>
32
- - !ruby/object:Gem::Version
33
- version: 0.8.1
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ~>
39
- - !ruby/object:Gem::Version
40
- version: 0.8.1
41
27
  - !ruby/object:Gem::Dependency
42
28
  name: pundit
43
29
  requirement: !ruby/object:Gem::Requirement
@@ -66,7 +52,7 @@ dependencies:
66
52
  - - '>='
67
53
  - !ruby/object:Gem::Version
68
54
  version: '0'
69
- description: Resoucify rails controllers and models
55
+ description: Resourcify rails controllers and models
70
56
  email:
71
57
  - stephen@axoninfosystems.com
72
58
  executables: []
@@ -83,8 +69,8 @@ files:
83
69
  - lib/resourcify/controller/actions/show.rb
84
70
  - lib/resourcify/controller/actions/update.rb
85
71
  - lib/resourcify/controller/base.rb
72
+ - lib/resourcify/model/filter_by.rb
86
73
  - lib/resourcify/model/policy_class.rb
87
- - lib/resourcify/model/resourcify_filter.rb
88
74
  - lib/resourcify/model/tpl.rb
89
75
  - lib/resourcify/resourcify.rb
90
76
  - lib/resourcify/version.rb
@@ -159,7 +145,7 @@ rubyforge_project:
159
145
  rubygems_version: 2.2.2
160
146
  signing_key:
161
147
  specification_version: 4
162
- summary: Resoucify rails controllers and models
148
+ summary: Resourcify rails controllers and models
163
149
  test_files:
164
150
  - test/acts_as_resourcify_test.rb
165
151
  - test/dummy/app/assets/javascripts/application.js
@@ -1,36 +0,0 @@
1
- module Model
2
- module ResourcifyFilter
3
- def resourcify_filter(filter_string)
4
- records = self
5
- simple_ops = { eq: '=', lt: '<', gt: '>', lte: '<=', gte: '>=' }
6
- filter_string = filter_string.split(';;').map { |q| q.split('::') }
7
- filter_string = filter_string.map { |q| {name: q[0], op: q[1], value: q[2], type: q[3]} }
8
- filter_string = filter_string.select { |f| self.column_names.include?(f[:name]) }
9
-
10
- filter_string.each do |f|
11
- next if f[:value].blank?
12
-
13
- operand = f[:op].to_s.to_sym
14
-
15
- if simple_ops[operand]
16
- f[:value] = f[:value].to_time if f[:type] == "date"
17
- records = records.where("#{f[:name]} #{simple_ops[operand]} ?", f[:value])
18
- elsif operand == :like
19
- if ActiveRecord::Base.connection.adapter_name == "PostgreSQL"
20
- records = records.where("#{f[:name]} ILIKE ?", "%#{f[:value]}%")
21
- else
22
- records = records.where("#{f[:name]} LIKE ?", "%#{f[:value]}%")
23
- end
24
- elsif operand == :ne
25
- records = records.where.not("#{f[:name]} = ?", f[:value])
26
- elsif operand == :in
27
- records = records.where("#{f[:name]} IN (?)", f[:value].split(','))
28
- elsif operand == :nin
29
- records = records.where.not("#{f[:name]} IN (?)", f[:value].split(','))
30
- end
31
- end
32
-
33
- records
34
- end
35
- end
36
- end