pinkman 0.9.9.9.11 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,37 +1,50 @@
1
1
  class window.PinkmanPath extends Pinkman.object
2
2
 
3
3
  constructor: (url) ->
4
- @levels = new Pinkman.collection
5
- @static = new Pinkman.collection
6
- @dynamic = new Pinkman.collection
7
- @params = new Object
8
- super()
9
- if Pinkman.isString(url)
10
- url = url.replace(window.location.origin,'') if PinkmanPath.isInternal(url)
11
- a = url.split('/')
12
- a.shift() if a[0] == ''
13
- a.pop() if a[a.length-1] == ''
14
- i = 0
15
- s = 0
16
- d = 0
17
- for l in a
18
- i = i + 1
19
- obj = new Pinkman.object({entry: l, index: i})
20
- if /:/.test(l[0])
21
- d = d + 1
22
- obj.set('dynamic',yes)
23
- obj.set('static',no)
24
- @dynamic.push(obj)
25
- else
26
- s = s + 1
27
- obj.set('dynamic',no)
28
- obj.set('static',yes)
29
- @static.push(obj)
30
- @levels.push(obj)
4
+ if PinkmanCache.has("p-path-#{url}")
5
+ return(PinkmanCache.get("p-path-#{url}"))
6
+ else
7
+ # setting params
8
+ paramsRegex = /\?.*/
9
+ if paramsRegex.test(url)
10
+ paramsString = /\?(.*)/.exec(url)[1]
11
+ @query = JSON.parse('{"' + decodeURI(paramsString).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
12
+ url = url.replace("?#{paramsString}", '')
13
+
31
14
 
32
- @set('depth',i)
33
- @set('staticDepth',s)
34
- @set('dynamicDepth',d)
15
+ @levels = new Pinkman.collection
16
+ @static = new Pinkman.collection
17
+ @dynamic = new Pinkman.collection
18
+ @params = new Object
19
+ super()
20
+ if Pinkman.isString(url)
21
+ url = url.replace(window.location.origin,'') if PinkmanPath.isInternal(url)
22
+
23
+
24
+ a = url.split('/')
25
+ a.shift() if a[0] == ''
26
+ a.pop() if a[a.length-1] == ''
27
+ i = 0
28
+ s = 0
29
+ d = 0
30
+ for l in a
31
+ i = i + 1
32
+ obj = new Pinkman.object({entry: l, index: i})
33
+ if /:/.test(l[0])
34
+ d = d + 1
35
+ obj.set('dynamic',yes)
36
+ obj.set('static',no)
37
+ @dynamic.push(obj)
38
+ else
39
+ s = s + 1
40
+ obj.set('dynamic',no)
41
+ obj.set('static',yes)
42
+ @static.push(obj)
43
+ @levels.push(obj)
44
+ @set('depth',i)
45
+ @set('staticDepth',s)
46
+ @set('dynamicDepth',d)
47
+ PinkmanCache.cache("p-path-#{url}",this)
35
48
 
36
49
  @depth: (url) ->
37
50
  a = url.split('/')
@@ -54,18 +67,25 @@ class window.PinkmanPath extends Pinkman.object
54
67
  @levels.last()
55
68
 
56
69
  match: (path) ->
70
+ # console.log "PinkmanPath#match - path arg: #{path}"
57
71
  path = new PinkmanPath(path) if Pinkman.isString(path)
58
72
  if PinkmanPath.isInstance(path) and path.depth == @depth
73
+ # console.log 'tentou'
59
74
  match = true
60
75
  @static.each (level) ->
61
- match = false if level.entry != path.level(level.index).entry
76
+ if level.entry != path.level(level.index).entry
77
+ # console.log level.entry
78
+ # console.log path.level(level.index).entry
79
+ match = false
62
80
  return(match)
63
81
  else
64
82
  false
65
83
 
66
84
  matchParams: (path) ->
67
85
  @dynamic.each (level) ->
68
- path.params[level.entry.replace(/:/g,"")] = path.level(level.index).entry
86
+ # console.log level
87
+ # console.log path
88
+ path.params[level.entry.replace(/:/g,"")] = path.level(level.index).entry.replace(/[#?].*/,'')
69
89
 
70
90
  deduceControllerName: ->
71
91
  @static.extract('entry').join('-').replace(/[\/_]/g,'-').replace(/^-/,'')
@@ -100,13 +120,20 @@ class window.PinkmanRouteMatcher extends Pinkman.object
100
120
 
101
121
  findRouteFor: (url) ->
102
122
  url = url.replace(window.location.origin,'') if PinkmanPath.isInternal(url)
103
- return Pinkman.routes
104
- .select(depth: PinkmanPath.depth(url))
105
- .select((candidate) -> candidate.path.match(url))
106
- .sortBy('staticDepth','desc').first()
123
+ # console.log 'tentando achar route'
124
+ # console.log(url)
125
+ if PinkmanCache.has("p-router-#{url}")
126
+ PinkmanCache.get("p-router-#{url}")
127
+ else
128
+ r = Pinkman.routes
129
+ .select(depth: PinkmanPath.depth(url))
130
+ .select((candidate) -> candidate.path.match(url))
131
+ .sortBy('staticDepth','desc').first()
132
+ return(PinkmanCache.cache("p-router-#{url}", r))
107
133
 
108
134
  setup: (route,url) ->
109
135
  if route? and url?
136
+ # console.log "PinkmanRouterMatcher#setup - url arg: #{url}"
110
137
  urlPath = new PinkmanPath(url)
111
138
  route.path.matchParams(urlPath)
112
139
  @set('url',url)
@@ -124,7 +151,7 @@ class window.PinkmanRouteMatcher extends Pinkman.object
124
151
  params: ->
125
152
  # console.log @path
126
153
  # console.log @path.params
127
- @path.params if @path and @path.params?
154
+ Pinkman.mergeObjects(@path.params, @path.query)
128
155
 
129
156
 
130
157
  # every route defined turn into a object of this class: PinkmanRoute
@@ -246,14 +273,19 @@ class window.PinkmanRouter
246
273
  if r? and r
247
274
  # console.log r
248
275
  r.options = options
276
+ @_config.beforeRender(r) if $p.isFunction(@_config.beforeRender)
249
277
  if @_config.transition? and typeof @_config.transition == 'function'
250
278
  @_config.transition =>
251
279
  @render(r,callback)
252
280
  else
253
281
  @render(r,callback)
254
282
  else
283
+ # console.log 'route not found'
255
284
  false
256
285
 
286
+ @path: ->
287
+ window.location.pathname
288
+
257
289
  # Goes to a path
258
290
  @visit: (path) ->
259
291
  @activate path, ->
@@ -287,12 +319,26 @@ class window.PinkmanRouter
287
319
  @back: ->
288
320
  window.history.back() if window.history?
289
321
 
322
+ @refresh: ->
323
+ @go(@path())
324
+
325
+ @reload: ->
326
+ window.location.reload()
327
+
328
+ @paramsObject: ->
329
+ regex = /\?(.*)/
330
+ if regex.test(window.location.href)
331
+ paramsString = regex.exec(window.location.href)[1]
332
+ JSON.parse('{"' + decodeURI(paramsString).replace(/"/g, '\\"').replace(/&/g, '","').replace(/=/g,'":"') + '"}')
333
+ else
334
+ return new Object
335
+
290
336
  @start: ->
291
337
  Pinkman.ready =>
292
338
  Pinkman.router = this
293
339
  App.router = this
294
340
  window.$r = App.router
295
- @activate(window.location.pathname)
341
+ @activate(window.location.href)
296
342
  $('body').on 'click', 'a:not([data-pinkman="false"],[target="blank"],[target="_blank"])', (ev) =>
297
343
  ev.preventDefault()
298
344
  path = ev.currentTarget.href
@@ -304,6 +350,12 @@ class window.PinkmanRouter
304
350
  namespaced._namespace = if @_namespace then ("#{@_namespace}/#{namespace}") else namespace
305
351
  rules(namespaced) if typeof rules == 'function'
306
352
 
353
+ scope: (scope, rules) ->
354
+ scope = scope.replace(/^\//,'')
355
+ scoped = new @constructor()
356
+ scoped._scope = if @_scope then ("#{@_scope}/#{scope}") else scope
357
+ rules(scoped) if typeof rules == 'function'
358
+
307
359
  resources: (resourceName) ->
308
360
 
309
361
  # controllerPrefix = if @_namespace then @_namespace.replace(/\//,'-') + '-' else ''
@@ -325,6 +377,7 @@ class window.PinkmanRouter
325
377
  if Pinkman.isString(path)
326
378
  path = path.replace(/^\//,'')
327
379
  path = "/#{@_namespace}/" + path if @_namespace
380
+ path = "/#{@_scope}/" + path if @_scope
328
381
  p = new PinkmanPath(path)
329
382
  route = new PinkmanRoute
330
383
  route.set('id',path)
@@ -45,9 +45,10 @@ module Pinkman
45
45
  generate 'pinkman:initializer'
46
46
  end
47
47
 
48
- def create_pinkman_channel
49
- generate 'pinkman:pinkman_channel'
50
- end
48
+ # # TO DO < pinkman channel
49
+ # def create_pinkman_channel
50
+ # generate 'pinkman:pinkman_channel'
51
+ # end
51
52
 
52
53
  def install_hello_world_controller
53
54
  copy_file "hello.controller.coffee.erb", Rails.root.join('app','assets','javascripts','pinkman','app','controllers','hello.coffee')
@@ -1,23 +1,23 @@
1
1
  class Api::<%= controller_name %> < ApiController
2
2
 
3
+ before_action :verify_permissions
3
4
  before_action :set_objects
4
- before_action :permissions
5
5
 
6
6
  # get api/<%= api_name %>
7
7
  def index
8
- <%= collection_name %> = <%= active_record_model_name %>.limit(params[:limit]).offset(params[:offset])
9
- render json: <%= collection_name %>.json(current_scope)
8
+ <%= collection_name %> = <%= active_record_model_name %>.limit(current_limit).offset(current_offset)
9
+ render json: <%= collection_name %>.json(requested_scope)
10
10
  end
11
11
 
12
12
  # get api/<%= api_name %>/:id
13
13
  def show
14
- render json: @<%= instance_name %>.json(current_scope)
14
+ render json: @<%= instance_name %>.json(requested_scope)
15
15
  end
16
16
 
17
17
  # get api/<%= api_name %>/get
18
18
  def get
19
19
  <%= collection_name %> = <%= active_record_model_name %>.get(handle_query_param)
20
- render json: <%= collection_name %>.json(current_scope)
20
+ render json: <%= collection_name %>.json(requested_scope)
21
21
  end
22
22
 
23
23
  # --- TO DO: Revise this ---
@@ -33,8 +33,8 @@ class Api::<%= controller_name %> < ApiController
33
33
  # get api/<%= api_name %>/search/:query
34
34
  def search
35
35
  if params[:query].present?
36
- <%= collection_name %> = <%= active_record_model_name %>.search(params[:query]).limit(params[:limit]).offset(params[:offset])
37
- render json: <%= collection_name %>.json(current_scope)
36
+ <%= collection_name %> = <%= active_record_model_name %>.search(params[:query]).limit(current_limit).offset(current_offset)
37
+ render json: <%= collection_name %>.json(requested_scope)
38
38
  end
39
39
  end
40
40
 
@@ -42,28 +42,28 @@ class Api::<%= controller_name %> < ApiController
42
42
  def create
43
43
  @<%= instance_name %>.assign_attributes <%= params_method_name %>
44
44
  @<%= instance_name %>.save
45
- render json: @<%= instance_name %>.json(current_scope)
45
+ render json: @<%= instance_name %>.json(requested_scope)
46
46
  end
47
47
 
48
48
  # put/patch api/<%= api_name %>/:id
49
49
  def update
50
50
  @<%= instance_name %>.update <%= params_method_name %>
51
- render json: @<%= instance_name %>.json(current_scope)
51
+ render json: @<%= instance_name %>.json(requested_scope)
52
52
  end
53
53
 
54
54
  # delete api/<%= api_name %>/:id
55
55
  def destroy
56
56
  @<%= instance_name %>.destroy
57
- render json: @<%= instance_name %>.json(current_scope)
57
+ render json: @<%= instance_name %>.json(requested_scope)
58
58
  end
59
59
 
60
60
  protected
61
61
 
62
62
  # --- begin permissions --- #
63
63
 
64
- def permissions
65
- unless <%= serializer_name %>.scope(current_scope).can_access? action_name
66
- render json: {errors: 'You have no permission.'}
64
+ def verify_permissions
65
+ unless requested_scope.in?(allowed_scopes) and <%= serializer_name %>.scope(requested_scope).can_access? action_name
66
+ render json: {error: 'Unauthorized'}, status: :unauthorized
67
67
  end
68
68
  end
69
69
 
@@ -79,7 +79,7 @@ class Api::<%= controller_name %> < ApiController
79
79
 
80
80
  def <%= params_method_name %>
81
81
  if params['pink_obj']
82
- params["pink_obj"].keep_if {|k,v| <%= serializer_name %>.scope(current_scope).can_write?(k)}
82
+ params["pink_obj"].keep_if {|k,v| <%= serializer_name %>.scope(requested_scope).can_write?(k)}
83
83
  params["pink_obj"].permit!
84
84
  else
85
85
  {}
@@ -1,15 +1,23 @@
1
1
  class ApiController < ApplicationController
2
2
 
3
- before_action :default_limit_and_offset
4
-
5
- def default_limit_and_offset
6
- params[:limit] = 20 if params[:limit].blank?
7
- params[:offset] = 0 if params[:offset].blank?
3
+ def current_limit
4
+ # default: 20
5
+ # max: 200
6
+ [(params[:limit] || 10).to_i, 100].min
7
+ end
8
+
9
+ def current_offset
10
+ params[:offset] || 0
11
+ end
12
+
13
+ # TO DO: allowed_scopes
14
+ # This method should return array of allowed scopes based on current user info.
15
+ def allowed_scopes
16
+ [:public]
8
17
  end
9
18
 
10
- # TO DO: rewrite the current_scope method the way you want.
11
- def current_scope
12
- :public
19
+ def requested_scope
20
+ begin params[:scope].to_sym rescue :public end
13
21
  end
14
22
 
15
23
  # You can define it according to the current user and his permissions
@@ -20,26 +28,9 @@ class ApiController < ApplicationController
20
28
  # * *
21
29
  # * Never pass params[:scope] directly to serializers. *
22
30
  # * params[:scope] must to be whitelisted if you are going to allow/use it. *
23
- # * See examples bellow. *
24
31
  # * *
25
- #******************************************************************************************
26
-
27
- # --- Examples
32
+ # *****************************************************************************************
28
33
 
29
- # Example 1:
30
- # def current_scope
31
- # current_user.admin? ? :admin : :public
32
- # end
33
-
34
- # Example 2:
35
- # def current_scope
36
- # params[:scope].in?(['public','user_allowed','vip']) ? params[:scope].to_sym : :public
37
- # end
38
-
39
- # Example 3:
40
- # def current_scope
41
- # your_custom_scope_verification_method?(params[:scope]) ? params[:scope].to_sym : :public
42
- # end
43
34
 
44
35
  # --- Settings scope in client
45
36
 
@@ -1,6 +1,10 @@
1
1
  Pinkman.setup do |config|
2
2
 
3
+ # Whenever a given scope is not defined, use this one instead.
4
+ config.scope_fallback = :public
5
+ # Comment the line above to raise an error everytime a scope is not found.
6
+
3
7
  # Choose between: handlebars, hogan, markup
4
- config.js_template_engine = 'hogan'
8
+ config.js_template_engine = :hogan
5
9
 
6
10
  end
@@ -15,7 +15,11 @@ module Pinkman
15
15
 
16
16
  define_helper :text do |attr_name,label=nil,html_attributes={}|
17
17
  label ||= attr_name.titleize
18
+
18
19
  error_for_name = html_attributes.delete(:error_for) || attr_name
20
+ error_prepend = html_attributes.delete(:error_prepend)
21
+ error_for_name = error_prepend + error_for_name if error_prepend
22
+
19
23
  render partial: 'pinkman/pinkman/form_textarea', locals: {attr_name: attr_name, label: label, error_for_name: error_for_name, textarea_options: {name: attr_name}.merge(html_attributes) }
20
24
  end
21
25
 
@@ -40,6 +44,8 @@ module Pinkman
40
44
  obligatory = true if obligatory.nil?
41
45
  label ||= attr_name.titleize
42
46
  error_for_name = html_attributes.delete(:error_for) || attr_name
47
+ error_prepend = html_attributes.delete(:error_prepend)
48
+ error_for_name = error_prepend + error_for_name if error_prepend
43
49
  render partial: 'pinkman/pinkman/form_select', locals: {attr_name: attr_name, label: label, error_for_name: error_for_name, options_hash: options_hash, html_attributes: html_attributes, placeholder: placeholder, obligatory: obligatory}
44
50
  end
45
51
 
@@ -52,7 +58,7 @@ module Pinkman
52
58
  end
53
59
 
54
60
  define_helper :money do |attr_name,label=nil,html_attributes={}|
55
- p.input_helper attr_name, label, html_attributes.merge(type: 'number', min: '0', step: '0.01')
61
+ p.input_helper attr_name, label, html_attributes.merge(type: 'number', step: '0.01')
56
62
  end
57
63
 
58
64
  end
@@ -26,8 +26,10 @@ module Pinkman
26
26
  else
27
27
  if @scopes[name.to_sym]
28
28
  @scopes[name.to_sym]
29
+ elsif Pinkman.configuration.scope_fallback and @scopes[Pinkman.configuration.scope_fallback]
30
+ @scopes[Pinkman.configuration.scope_fallback]
29
31
  else
30
- raise ArgumentError.new("Scope '#{name}' not found/defined for #{self.to_s}.")
32
+ raise(ArgumentError, (Pinkman.configuration.scope_fallback ? ("Scope '#{name}' and fallback scope '#{Pinkman.configuration.scope_fallback}' were not found in #{self.to_s}.") : ("Scope '#{name}' not found in #{self.to_s}.") ))
31
33
  end
32
34
  end
33
35
  end
@@ -85,6 +87,8 @@ module Pinkman
85
87
  model.column_names.each {|attribute| hash[attribute] = object.send(attribute) } if include_all && model && model.methods.include?(:column_names)
86
88
  pinkmanscope.read.each {|attribute| hash[attribute] = send(attribute) if self.methods.include?(attribute)}
87
89
  pinkmanscope.read.each {|attribute| hash[attribute] ||= object.send(attribute) if object.methods.include?(attribute)}
90
+ pinkmanscope.read_ghost.each {|attribute| begin hash[attribute] ||= object.send(attribute) rescue nil end }
91
+ hash[:destroyed] = true if object.destroyed?
88
92
  hash[:errors] = self.class.format_errors(errors) if errors.present? and errors.any?
89
93
  hash
90
94
  end
@@ -7,12 +7,26 @@ module Pinkman
7
7
  end
8
8
 
9
9
  attr_accessor :read, :write, :access, :serializer
10
+
11
+ def read_ghost
12
+ @read_ghost || []
13
+ end
14
+
15
+ def read_ghost= value
16
+ @read_ghost = value
17
+ end
10
18
 
11
19
  def read_attributes *args
12
20
  self.read = args
13
21
  self.read = [] unless args.first
14
22
  read
15
23
  end
24
+
25
+ def read_ghost_attributes *args
26
+ self.read_ghost = args
27
+ self.read_ghost = [] unless args.first
28
+ read_ghost
29
+ end
16
30
 
17
31
  def write_attributes *args
18
32
  self.write = args
@@ -27,7 +41,7 @@ module Pinkman
27
41
  end
28
42
 
29
43
  def can_read? attribute
30
- read.include?(:all) or read.include?(attribute.to_sym) or attribute.to_sym == :error or attribute.to_sym == :errors
44
+ read.include?(:all) or read.include?(attribute.to_sym) or attribute.to_sym == :error or attribute.to_sym == :errors or read_ghost.include?(attribute.to_sym)
31
45
  end
32
46
 
33
47
  def can_write? attribute
@@ -39,7 +53,7 @@ module Pinkman
39
53
  end
40
54
 
41
55
  def can_read
42
- read
56
+ read + read_ghost
43
57
  end
44
58
 
45
59
  def can_write
@@ -1,3 +1,3 @@
1
1
  module Pinkman
2
- VERSION = "0.9.9.9.11"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -9,6 +9,10 @@ module Pinkman
9
9
  define_helper :input_helper do |attr_name,label=nil,options={}|
10
10
  label ||= attr_name.titleize
11
11
  error_for_name = options.delete(:error_for) || attr_name
12
+
13
+ error_prepend = options.delete(:error_prepend)
14
+ error_for_name = error_prepend + error_for_name if error_prepend
15
+
12
16
  render partial: 'pinkman/pinkman/form_input', locals: {attr_name: attr_name, label: label, error_for_name: error_for_name, html_attributes: options.merge(name: attr_name)}
13
17
  end
14
18
 
@@ -28,8 +32,8 @@ module Pinkman
28
32
  end
29
33
 
30
34
  define_helper :textarea do |hash|
31
- content_tag('textarea',hash.merge(data: {pinkey: p.pinkey, action: hash[:name]}, value: p._w(hash[:name]))) do
32
- p._w(hash[:name])
35
+ content_tag('textarea',hash.merge(data: {pinkey: p.pinkey, action: hash[:name]}, value: p.w(hash[:name]))) do
36
+ p.w(hash[:name])
33
37
  end
34
38
  end
35
39
 
@@ -61,7 +65,7 @@ module Pinkman
61
65
  end
62
66
 
63
67
  define_helper :first_error do
64
- p._w('firstError')
68
+ p.w('firstError')
65
69
  end
66
70
 
67
71
  end
@@ -32,17 +32,25 @@ module Pinkman
32
32
  end
33
33
  end
34
34
 
35
- define_helper :partial do |path, block=nil|
35
+ define_helper :partial do |path, opts_or_block=nil|
36
36
  # definition mode
37
37
  name = path.to_s
38
38
  id = (/(?:-template)$/ =~ name) ? name : (name + '-template')
39
- if block.is_a?(Proc)
40
- content_tag('script',{id: id, type: 'text/p-partial', class: 'p'},&block)
39
+ if opts_or_block.is_a?(Proc)
40
+ block = opts_or_block
41
+ content_tag('script',{id: id, type: 'text/p-partial', class: 'p'}, &block)
41
42
  # rendering template partial mode
42
43
  else
43
- content_tag 'div', {id: name} do
44
- raw("{{ partial(#{id}) }}")
45
- end
44
+ opts = opts_or_block if opts_or_block.is_a?(Hash)
45
+ div = opts && opts[:div]
46
+ div ? raw("<div id='#{id.sub(/(-template)$/,'')}'>{{ partial(#{id}) }}</div>") : raw("{{ partial(#{id}) }}")
47
+ end
48
+ end
49
+
50
+ # wrap and insert partial = imprint
51
+ define_helper :imprint do |path|
52
+ p.wrap_in path do
53
+ p.partial path
46
54
  end
47
55
  end
48
56
 
@@ -7,12 +7,13 @@ module Pinkman
7
7
  extend Pinkman::BaseHelper
8
8
 
9
9
  define_helper :write do |string|
10
- raw "{{ #{string} }}"
10
+ raw "{{. #{string} }}"
11
11
  end
12
12
  define_helper_alias :w, :write
13
13
 
14
14
  define_helper :write_and_escape_sync do |string|
15
- raw("{{. #{string} }}")
15
+ ActiveSupport::Deprecation.warn('"p._w" deprecated. Use "p.w" instead.')
16
+ p.write(string)
16
17
  end
17
18
  define_helper_alias :_w, :write_and_escape_sync
18
19
 
@@ -64,8 +64,8 @@ end
64
64
  # as procs. So...
65
65
 
66
66
  # Use:
67
- # define_method :method_name do |one, two, block=nil|
67
+ # define_helper :method_name do |one, two, block=nil|
68
68
 
69
69
  # DONT't use:
70
- # define_method :method_name do |one, two, &block|
70
+ # define_helper :method_name do |one, two, &block|
71
71
  # (this won't work)
data/lib/pinkman.rb CHANGED
@@ -9,7 +9,7 @@ require 'pinkman/broadcaster'
9
9
 
10
10
  module Pinkman
11
11
 
12
- @@configuration = OpenStruct.new js_template_engine: 'handlebars'
12
+ @@configuration = OpenStruct.new(js_template_engine: 'handlebars')
13
13
 
14
14
  def self.root
15
15
  Pathname.new(File.dirname(__FILE__)).join('..')
@@ -26,7 +26,7 @@ module Pinkman
26
26
  class Engine < ::Rails::Engine
27
27
  config.after_initialize do
28
28
  Rails.application.routes.append do
29
- mount Pinkman::Engine => '/'
29
+ mount(Pinkman::Engine => '/')
30
30
  end
31
31
 
32
32
  module ApplicationHelper
@@ -34,7 +34,7 @@ module Pinkman
34
34
  end
35
35
 
36
36
  if defined? Slim
37
- Slim::Engine.set_options attr_list_delims: {'(' => ')', '[' => ']'}
37
+ Slim::Engine.set_options(attr_list_delims: {'(' => ')', '[' => ']'})
38
38
  end
39
39
 
40
40
  # Extending ActiveRecord
@@ -68,13 +68,13 @@ module Pinkman
68
68
 
69
69
  # Active Record Relation: json
70
70
  ActiveRecord::Relation.class_eval do
71
- def json scope_name, params_hash = {}
72
- serialize_for(scope_name,params_hash).to_json
71
+ def json scope_name=:public, params_hash = {}
72
+ serialize_for(scope_name, params_hash).to_json
73
73
  end
74
74
 
75
75
  def json_for *args, &block
76
76
  ActiveSupport::Deprecation.warn('"json_for" deprecated. Use "json" instead.')
77
- json(*args,&block)
77
+ json(*args, &block)
78
78
  end
79
79
 
80
80
  def serialize_for scope_name, params_hash = {}
@@ -85,13 +85,13 @@ module Pinkman
85
85
  end
86
86
 
87
87
  Array.class_eval do
88
- def json scope_name, params_hash = {}
89
- serialize_for(scope_name,params_hash).to_json
88
+ def json scope_name=:public, params_hash = {}
89
+ serialize_for(scope_name, params_hash).to_json
90
90
  end
91
91
 
92
92
  def json_for *args, &block
93
93
  ActiveSupport::Deprecation.warn('"json_for" deprecated. Use "json" instead.')
94
- json(*args,&block)
94
+ json(*args, &block)
95
95
  end
96
96
 
97
97
  def serialize_for scope_name, params_hash = {}
@@ -108,24 +108,28 @@ module Pinkman
108
108
  self.class.serializer.new(self,options)
109
109
  end
110
110
 
111
- def json scope_name, params_hash={}
112
- serialize_for(scope_name,params_hash).to_json
111
+ def json scope_name=:public, params_hash={}
112
+ serialize_for(scope_name, params_hash).to_json
113
113
  end
114
114
 
115
115
  def json_for *args, &block
116
116
  ActiveSupport::Deprecation.warn('"json_for" deprecated. Use "json" instead.')
117
- json(*args,&block)
117
+ json(*args, &block)
118
118
  end
119
119
 
120
- def has_json_key? key, scope
121
- json_version = JSON.parse(json(scope))
122
- json_version.has_key?(key.to_s) and json_version[key.to_s].present?
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?
123
122
  end
124
123
 
125
- def json_hash scope
126
- JSON.parse(json(scope))
124
+ def json_version *args
125
+ JSON.parse(json(*args))
127
126
  end
128
-
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
+
129
133
  end
130
134
  end
131
135