pinkman 1.0.0 → 1.1.1

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
  SHA256:
3
- metadata.gz: 99be758a6c0fd2b3b91ded4b49b176b0084daa153008390ce2d7a0301b763339
4
- data.tar.gz: 7652fe78dbacada668465d7aa3abc24789439f87b8f9d32b8e861dc9467f3dd9
3
+ metadata.gz: 3763200ced79aa36f7e47198b0195abdcdfd0318f3b553b3875bfcecdb1883a3
4
+ data.tar.gz: a6d43c350ee70c96812144476c408b3b46612b3b16a0b9ed4b4d2f14919b7263
5
5
  SHA512:
6
- metadata.gz: b200b9dc96f6cdc0ff71a583d16e21dd65d953100f465fef9e2c0716009ffdc67f5226962e4fd52b5be931988bc9834a26f68e6793e8d949a7818a115ee529fb
7
- data.tar.gz: dcaca3c9a82cec48a1304ed40d0be1efb1ed480b0ecfeef432c611bfe764c83797a387fea888c10b121699c7a1f5789a2ee428b1f40d0cbff45ea748cc57e83a
6
+ metadata.gz: 900495e9e1845b8c5f55d70d5236bed4f1f602e548c59833bdd0fc62f1a30520d73810f93e1a08255f180cab5a34155d38dd3df59a446cdaaeb34744e83afde1
7
+ data.tar.gz: ecb1773b0a1b504c4872786460def8868949209eb91ecdc2f28005c7d73c3a7c67c43806d21127c62e9ed28c72cb7cd473f78ca11d4f3429996316f2c59c2f7d
@@ -0,0 +1,80 @@
1
+ require 'active_record'
2
+
3
+ module Pinkman
4
+ module Model
5
+ class Base < ::ActiveRecord::Base
6
+
7
+ self.abstract_class = true
8
+
9
+ # Serializer
10
+ def self.serializer= value
11
+ @serializer = value
12
+ end
13
+
14
+ def self.serializer
15
+ @serializer || (begin eval(self.to_s + 'Serializer') rescue nil end)
16
+ end
17
+
18
+ # Get: Pinkman way of fetching records
19
+ def self.get query
20
+ if (begin Integer(query) rescue false end)
21
+ [find(query)]
22
+ elsif query.is_a? Hash
23
+ where(query)
24
+ elsif query.is_a? Array
25
+ where(id: query)
26
+ elsif query.is_a? String
27
+ search(query)
28
+ else
29
+ []
30
+ end
31
+ end
32
+
33
+ def self.optimize(scope, options = {})
34
+ if (options.keys - [:includes, :select]).any?
35
+ raise ArgumentError, "#{self}.optimize called with invalid options. Options hash accepts :includes and :select only."
36
+ end
37
+ options_includes = options[:includes] || []
38
+ options_select = options[:select] || []
39
+
40
+ scope_obj = serializer.scope(scope)
41
+ including_array = scope_obj.including + options_includes
42
+ selecting_array = scope_obj.selecting + options_select
43
+
44
+ includes(including_array).select(selecting_array)
45
+ end
46
+ def self.optim(*args)
47
+ optimize(*args)
48
+ end
49
+
50
+ def serialize_for scope_name, params_hash = {}
51
+ options = {scope: scope_name}.merge(params: params_hash)
52
+ self.class.serializer.new(self,options)
53
+ end
54
+
55
+ def json scope_name=:public, params_hash={}
56
+ serialize_for(scope_name, params_hash).to_json
57
+ end
58
+
59
+ def json_for *args, &block
60
+ ActiveSupport::Deprecation.warn('"json_for" deprecated. Use "json" instead.')
61
+ json(*args, &block)
62
+ end
63
+
64
+ def has_json_key? key, scope=:public, options={}
65
+ json_version(scope, options).has_key?(key.to_s) and json_version(scope, options)[key.to_s].present?
66
+ end
67
+
68
+ def json_version *args
69
+ JSON.parse(json(*args))
70
+ end
71
+ alias json_hash json_version
72
+
73
+ def json_key key, scope=:public, options={}
74
+ json_version(scope, options)[key.to_s]
75
+ end
76
+
77
+
78
+ end
79
+ end
80
+ end
@@ -17,11 +17,14 @@ module Pinkman
17
17
  end
18
18
 
19
19
  self.root = false
20
-
20
+ def self.table_name
21
+ model.table_name
22
+ end
23
+
21
24
  def self.scope name=:public, &block
22
25
  @scopes ||= {}
23
26
  if block_given?
24
- @scopes[name.to_sym] = Pinkman::Serializer::Scope.new(serializer: self)
27
+ @scopes[name.to_sym] = Pinkman::Serializer::Scope.new(serializer: self, name: name.to_s)
25
28
  yield(@scopes[name.to_sym])
26
29
  else
27
30
  if @scopes[name.to_sym]
@@ -33,6 +36,10 @@ module Pinkman
33
36
  end
34
37
  end
35
38
  end
39
+
40
+ def self.has_scope?(name)
41
+ scopes.has_key?(name.to_sym)
42
+ end
36
43
 
37
44
  def self.scopes
38
45
  @scopes
@@ -77,6 +84,12 @@ module Pinkman
77
84
  errors.each {|k,v| e[k] = [v].flatten}
78
85
  e
79
86
  end
87
+
88
+ # assocs
89
+
90
+ def self.reflections
91
+ model.reflections
92
+ end
80
93
 
81
94
  def attributes *args
82
95
  hash = super(*args)
@@ -1,12 +1,16 @@
1
1
  module Pinkman
2
2
  module Serializer
3
3
  class Scope
4
+
5
+ attr_accessor :name, :read, :write, :access, :serializer
4
6
 
5
7
  def initialize hash
6
- self.serializer = hash[:serializer] if hash.is_a?(Hash) and hash[:serializer]
7
- end
8
-
9
- attr_accessor :read, :write, :access, :serializer
8
+ if hash.is_a?(Hash)
9
+ self.serializer = hash[:serializer]
10
+ self.name = hash[:name]
11
+ end
12
+ self
13
+ end
10
14
 
11
15
  def read_ghost
12
16
  @read_ghost || []
@@ -19,9 +23,47 @@ module Pinkman
19
23
  def read_attributes *args
20
24
  self.read = args
21
25
  self.read = [] unless args.first
26
+ query_optimizer
22
27
  read
23
28
  end
24
29
 
30
+ def associations
31
+ read.select{ |attribute| attribute_is_association?(attribute) }
32
+ end
33
+
34
+ def fields
35
+ read.select{ |attribute| attribute_is_in_db?(attribute) }
36
+ end
37
+
38
+ def query_optimizer
39
+ select_optimizer
40
+ include_optimizer
41
+ end
42
+
43
+ def select_optimizer
44
+ unless :all.in?(read.map(&:to_sym))
45
+ fields.each do |attribute|
46
+ selecting << "#{serializer.table_name}.#{attribute}"
47
+ end
48
+ end
49
+ selecting
50
+ end
51
+
52
+ def include_optimizer
53
+ associations.each do |attribute|
54
+ including << attribute_inclusion_clause(attribute)
55
+ end
56
+ including
57
+ end
58
+
59
+ def selecting
60
+ @selecting ||= []
61
+ end
62
+
63
+ def including
64
+ @including ||= []
65
+ end
66
+
25
67
  def read_ghost_attributes *args
26
68
  self.read_ghost = args
27
69
  self.read_ghost = [] unless args.first
@@ -45,7 +87,7 @@ module Pinkman
45
87
  end
46
88
 
47
89
  def can_write? attribute
48
- (write.include?(:all) or write.include?(attribute.to_sym)) and (serializer.model.column_names.include?(attribute.to_s) or (serializer.model.instance_methods.include?("#{attribute.to_s}=".to_sym) and write.include?(attribute.to_sym)))
90
+ (write.include?(:all) or write.include?(attribute.to_sym)) and (serializer.column_names.include?(attribute.to_s) or (serializer.instance_methods.include?("#{attribute.to_s}=".to_sym) and write.include?(attribute.to_sym)))
49
91
  end
50
92
 
51
93
  def can_access? action
@@ -63,6 +105,69 @@ module Pinkman
63
105
  def can_access
64
106
  access
65
107
  end
108
+
109
+ # private
110
+
111
+ def reflections
112
+ serializer.reflections
113
+ end
114
+
115
+ def attribute_is_in_db?(attribute)
116
+ attribute.to_s.in?(serializer.model.column_names)
117
+ end
118
+
119
+ def attribute_is_association?(attribute)
120
+ attribute.to_s.in?(reflections.keys.map(&:to_s))
121
+ end
122
+
123
+ def attribute_inclusion_clause attribute
124
+ if attribute_has_nested_associated?(attribute)
125
+ a = []
126
+ assoc_scope = attribute_assoc_scope(attribute)
127
+ assoc_scope.associations.each do |assoc_attribute|
128
+ a << assoc_scope.attribute_inclusion_clause(assoc_attribute)
129
+ end
130
+ { attribute.to_sym => a }
131
+ else
132
+ attribute.to_sym
133
+ end
134
+ end
135
+
136
+
137
+
138
+ def get_associated_model(reflection)
139
+ reflection.klass
140
+ end
141
+
142
+ def get_associated_serializer(attribute)
143
+ begin
144
+ get_associated_model(reflections[attribute.to_s]).serializer if attribute_is_association?(attribute.to_s)
145
+ rescue
146
+ raise ArgumentError, "#{serializer}.#{name}: association named - #{attribute} - found but I can't find its serializer."
147
+ end
148
+ end
149
+
150
+ def attribute_assoc_scope(attribute)
151
+ assoc_serializer = get_associated_serializer(attribute)
152
+ if assoc_serializer
153
+ assoc_serializer.scope(name.to_sym)
154
+ else
155
+ raise ArgumentError, "#{serializer}.#{name}: association named - #{attribute} - found but I can't find its serializer."
156
+ end
157
+ end
158
+
159
+ # given that a attribute is a association,
160
+ # and the associated serializer has same scope defined,
161
+ # checks if a nested association is present
162
+ def attribute_has_nested_associated?(attribute)
163
+ attribute = attribute.to_s
164
+ if attribute_is_association?(attribute)
165
+ assoc_scope = attribute_assoc_scope(attribute)
166
+ assoc_scope && assoc_scope.associations.any? && assoc_scope.serializer.model != serializer.model
167
+ end
168
+ end
169
+
66
170
  end
171
+
67
172
  end
68
173
  end
@@ -1,3 +1,3 @@
1
1
  module Pinkman
2
- VERSION = "1.0.0"
2
+ VERSION = "1.1.1"
3
3
  end
data/lib/pinkman.rb CHANGED
@@ -2,6 +2,7 @@ require 'rails'
2
2
  require 'pathname'
3
3
  require 'active_model_serializers'
4
4
  require 'pinkman/serializer'
5
+ require 'pinkman/model/base'
5
6
  require 'pinkman/views_helpers'
6
7
  require 'pinkman/form_helper'
7
8
  require 'pinkman/version'
@@ -37,34 +38,6 @@ module Pinkman
37
38
  Slim::Engine.set_options(attr_list_delims: {'(' => ')', '[' => ']'})
38
39
  end
39
40
 
40
- # Extending ActiveRecord
41
- ActiveRecord::Base.singleton_class.class_eval do
42
-
43
- # Serializer
44
- def serializer= value
45
- @serializer = value
46
- end
47
-
48
- def serializer
49
- @serializer || (begin eval(self.to_s + 'Serializer') rescue nil end)
50
- end
51
-
52
- # Get: Pinkman way of fetching records
53
- def get query
54
- if (begin Integer(query) rescue false end)
55
- [find(query)]
56
- elsif query.is_a? Hash
57
- where(query)
58
- elsif query.is_a? Array
59
- where(id: query)
60
- elsif query.is_a? String
61
- search(query)
62
- else
63
- []
64
- end
65
- end
66
-
67
- end
68
41
 
69
42
  # Active Record Relation: json
70
43
  ActiveRecord::Relation.class_eval do
@@ -101,36 +74,6 @@ module Pinkman
101
74
  end
102
75
  end
103
76
 
104
- # Instance method: json
105
- ActiveRecord::Base.class_eval do
106
- def serialize_for scope_name, params_hash = {}
107
- options = {scope: scope_name}.merge(params: params_hash)
108
- self.class.serializer.new(self,options)
109
- end
110
-
111
- def json scope_name=:public, params_hash={}
112
- serialize_for(scope_name, params_hash).to_json
113
- end
114
-
115
- def json_for *args, &block
116
- ActiveSupport::Deprecation.warn('"json_for" deprecated. Use "json" instead.')
117
- json(*args, &block)
118
- end
119
-
120
- def has_json_key? key, scope=:public, options={}
121
- json_version(scope, options).has_key?(key.to_s) and json_version(scope, options)[key.to_s].present?
122
- end
123
-
124
- def json_version *args
125
- JSON.parse(json(*args))
126
- end
127
- alias json_hash json_version
128
-
129
- def json_key key, scope=:public, options={}
130
- json_version(scope, options)[key.to_s]
131
- end
132
-
133
- end
134
77
  end
135
78
 
136
79
  end
data/pinkman.gemspec CHANGED
@@ -31,7 +31,7 @@ Gem::Specification.new do |spec|
31
31
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
32
32
  spec.require_paths = ['lib']
33
33
 
34
- spec.add_development_dependency 'bundler', '~> 1.13'
34
+ spec.add_development_dependency 'bundler'
35
35
  spec.add_development_dependency 'coffee-script'
36
36
  spec.add_development_dependency 'sprockets', '~> 3.0'
37
37
  spec.add_development_dependency 'uglifier'
@@ -41,6 +41,7 @@ Gem::Specification.new do |spec|
41
41
  spec.add_development_dependency 'rails'
42
42
 
43
43
  spec.add_dependency 'rails'
44
+ spec.add_dependency 'activerecord'
44
45
  spec.add_dependency 'jquery-rails'
45
46
  spec.add_dependency 'active_model_serializers', '~> 0.9.0'
46
47
 
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinkman
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Agilso Oliveira
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-02-28 00:00:00.000000000 Z
11
+ date: 2019-03-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.13'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.13'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: coffee-script
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -136,6 +136,20 @@ dependencies:
136
136
  - - ">="
137
137
  - !ruby/object:Gem::Version
138
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: activerecord
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
139
153
  - !ruby/object:Gem::Dependency
140
154
  name: jquery-rails
141
155
  requirement: !ruby/object:Gem::Requirement
@@ -273,6 +287,7 @@ files:
273
287
  - lib/pinkman/broadcaster.rb
274
288
  - lib/pinkman/form_helper.rb
275
289
  - lib/pinkman/form_helper/form_helpers.rb
290
+ - lib/pinkman/model/base.rb
276
291
  - lib/pinkman/serializer.rb
277
292
  - lib/pinkman/serializer/base.rb
278
293
  - lib/pinkman/serializer/scope.rb