platanus 0.0.17 → 0.0.19

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.
data/README.md CHANGED
@@ -20,6 +20,10 @@ Or install it yourself as:
20
20
 
21
21
  ## Tools & Usage
22
22
 
23
+ ### Enum
24
+
25
+ TODO: Write usage instructions here
26
+
23
27
  ### Stacked
24
28
 
25
29
  TODO: Write usage instructions here
@@ -20,24 +20,24 @@ module Platanus
20
20
  base.rescue_from 'Exception' do |exc|
21
21
  logger.error exc.message
22
22
  logger.error exc.backtrace.join("\n")
23
- api_respond_error(:internal_server_error, { type: exc.class.to_s, msg: exc.message } )
23
+ api_respond_error(:internal_server_error, { msg: 'server_error', exception: { type: exc.class.to_s, msg: exc.message } } )
24
24
  end
25
25
 
26
26
  base.rescue_from 'ActiveRecord::RecordNotFound' do |exc|
27
- api_respond_error(:not_found)
27
+ api_respond_error(:not_found, { msg: 'record_not_found', detail: exc.message })
28
28
  end
29
29
 
30
- base.rescue_from 'ActiveRecord::RecordInvalid' do |exc|
31
- api_respond_error(:unprocessable_entity, { why: 'invalid', errors: exc.record.errors } )
30
+ base.rescue_from 'ActiveModel::MassAssignmentSecurity::Error' do |exc|
31
+ api_respond_error(:bad_request, { msg: 'protected_attributes', detail: exc.message } )
32
32
  end
33
33
 
34
- base.rescue_from 'ActiveModel::MassAssignmentSecurity::Error' do |exc|
35
- api_respond_error(:bad_request, { why: 'attribute_protected' } )
34
+ base.rescue_from 'ActiveRecord::RecordInvalid' do |exc|
35
+ api_respond_error(:bad_request, { msg: 'invalid_attributes', errors: exc.record.errors } )
36
36
  end
37
37
 
38
38
  # Platanus error support (of course)
39
39
  base.rescue_from 'Platanus::StatusError' do |exc|
40
- api_respond_error(exc.status, exc)
40
+ api_respond_error(exc.status, { msg: exc.message })
41
41
  end
42
42
 
43
43
  base.extend ClassMethods
@@ -67,6 +67,9 @@ module Platanus
67
67
  # # Enables cors
68
68
  def enable_cors
69
69
  # TODO: maybe cors support should be implemented as a middleware.
70
+ # response.headers['Access-Control-Allow-Headers'] = 'X-Requested-With,Content-Type'
71
+ # response.headers['Access-Control-Allow-Methods'] = 'OPTIONS,GET,HEAD,POST,PUT,DELETE'
72
+ # response.headers['Access-Control-Allow-Origin'] = '*'
70
73
  end
71
74
 
72
75
  end
@@ -77,7 +80,6 @@ module Platanus
77
80
  def api_respond_empty(_options={})
78
81
  _options[:json] = {}
79
82
  api_respond_with(_options)
80
- render_headers
81
83
  end
82
84
 
83
85
  # # Renders a regular response
@@ -92,7 +94,6 @@ module Platanus
92
94
  respond_with(*_params) do |format|
93
95
  format.json { render _options }
94
96
  end
95
- render_headers
96
97
  end
97
98
 
98
99
  # # Renders an error response
@@ -104,13 +105,6 @@ module Platanus
104
105
  respond_with do |format|
105
106
  format.json { render :status => _status, :json => _error_obj }
106
107
  end
107
- render_headers
108
- end
109
-
110
- def render_headers
111
- response.headers['Access-Control-Allow-Headers'] = 'X-Requested-With,Content-Type'
112
- response.headers['Access-Control-Allow-Methods'] = 'OPTIONS,GET,HEAD,POST,PUT,DELETE'
113
- response.headers['Access-Control-Allow-Origin'] = '*'
114
108
  end
115
109
 
116
110
  end
@@ -204,8 +204,8 @@ module Platanus
204
204
  # This can optionally take an inherit parameter to use
205
205
  # another profile as base for the new one.
206
206
  def profile(_name, _options={})
207
- inherit = _options.fetch(:inherits,nil)
208
- def_test = _options.fetch(:default,:equals)
207
+ inherit = _options.fetch(:inherits, nil)
208
+ def_test = _options.fetch(:default, :equals)
209
209
  yield self.profiles[_name.to_s] = BProfile.new(self,self.profiles[inherit],def_test)
210
210
  end
211
211
 
@@ -8,25 +8,20 @@ module Platanus
8
8
 
9
9
  # Allows to use an exception driven scheme to notify
10
10
  # the request that a especial status should be send
11
- # back to the client. Usefull when used with rescue_from.
11
+ # back to the client.
12
+ # Usefull when used with +api_base+ or +rescue_from+.
12
13
  class StatusError < StandardError
13
14
 
14
15
  class << self
15
16
  instance_variable_set(:@status, nil)
16
- instance_variable_set(:@msg, nil)
17
17
  end
18
18
 
19
- def self.setup(_status, _msg)
19
+ def self.setup(_status)
20
20
  @status = _status
21
- @msg = _msg
22
21
  end
23
22
 
24
23
  def self.status; @status; end
25
- def self.message; @msg; end
26
-
27
- def self.as_json(_options={})
28
- { 'status' => @status.to_s, 'msg' => @msg }
29
- end
24
+ def self.message; "status_#{@status.to_s}"; end
30
25
 
31
26
  def initialize(_msg=nil)
32
27
  @msg = _msg
@@ -34,28 +29,25 @@ module Platanus
34
29
 
35
30
  def status; self.class.status; end
36
31
  def message; if @msg.nil? then self.class.message else @msg end; end
37
- def as_json(_options={})
38
- { 'status' => status.to_s, 'msg' => message }
39
- end
40
32
  end
41
33
 
42
34
  class StatusNotFound < StatusError
43
- setup :not_found, 'Not found'
35
+ setup :not_found
44
36
  end
45
37
 
46
38
  class StatusUnauthorized < StatusError
47
- setup :unauthorized, 'Not authorized'
39
+ setup :unauthorized
48
40
  end
49
41
 
50
42
  class StatusUnprocessable < StatusError
51
- setup :unprocessable_entity, 'Invalid object'
43
+ setup :unprocessable_entity
52
44
  end
53
45
 
54
46
  class StatusBadRequest < StatusError
55
- setup :bad_request, 'Invalid parameters'
47
+ setup :bad_request
56
48
  end
57
49
 
58
50
  class StatusConflict < StatusError
59
- setup :conflict, 'Model conflict'
51
+ setup :conflict
60
52
  end
61
53
  end
@@ -8,6 +8,8 @@ module Platanus
8
8
  #
9
9
  module StackedAttr
10
10
 
11
+ class NotSupportedError < StandardError; end
12
+
11
13
  def self.included(base)
12
14
  base.extend ClassMethods
13
15
  end
@@ -18,70 +20,77 @@ module Platanus
18
20
  def has_stacked(_name, _options={}, &block)
19
21
 
20
22
  tname = _name.to_s
23
+ tname_single = tname.singularize
24
+
21
25
  to_cache = _options.delete(:cached)
22
26
  to_cache_prf = if _options[:cache_prf].nil? then 'last_' else _options.delete(:cache_prf) end
23
- stack_key = if _options[:stack_key].nil? then 'created_at DESC, id DESC' else _options.delete(:stack_key) end
24
27
 
25
28
  # Retrieve callbacks
26
29
  before_push = _options.delete(:before_push)
27
30
  after_push = _options.delete(:after_push)
28
31
 
29
- _options[:order] = stack_key
32
+ raise NotSupportedError.new('Only autosave mode is supported') if _options[:autosave] == false
33
+
34
+ _options[:order] = 'created_at DESC, id DESC'
30
35
  _options[:limit] = 10 if _options[:limit].nil?
31
36
 
32
- # Protect cached attributes.
37
+ # Prepare cached attributes, generate read-only aliases without prefix.
33
38
  unless to_cache.nil?
34
- to_cache = to_cache.map { |name| name.to_s }
35
- to_cache.each { |name| attr_protected(to_cache_prf + name) }
39
+ to_cache = to_cache.map do |name|
40
+ name = name.to_s
41
+ # attr_protected(to_cache_prf + name)
42
+ send :define_method, name do self.send(to_cache_prf + name) end
43
+ name
44
+ end
36
45
  end
37
46
 
38
47
  private
39
- has_many(_name,_options)
48
+ has_many _name, _options
40
49
  public
41
50
 
42
- send :define_method, 'push_' + tname[0...-1] + '!' do |obj|
51
+ send :define_method, "push_#{tname_single}!" do |obj|
43
52
  self.class.transaction do
44
53
 
45
- # Execute before callbacks
54
+ # execute before callbacks
46
55
  self.send(before_push, obj) unless before_push.nil?
47
56
  block.call(self, obj) unless block.nil?
48
57
 
49
- # Cache required fields
58
+ # cache required fields
50
59
  unless to_cache.nil?
51
60
  to_cache.each { |name| send(to_cache_prf + name + '=', obj.send(name)) }
52
61
  end
53
62
 
54
- # Save model and push attribute, cache last stacked attribute.
55
- self.save! if _options.fetch(:autosave, true) and (self.new_record? or self.changed?)
63
+ # push attribute, this will save the model if new.
56
64
  raise ActiveRecord::RecordInvalid.new(obj) unless self.send(tname).send('<<',obj)
57
- @_stacked_last = obj
58
65
 
59
- # Execute after callback
66
+ # update inverse association if posible
67
+ if self.attributes.has_key? "top_#{tname_single}_id"
68
+ self["top_#{tname_single}_id"] = obj.id
69
+ else
70
+ @_stacked_last = obj
71
+ end
72
+
73
+ # execute after callback
60
74
  self.send(after_push, obj) unless after_push.nil?
75
+
76
+ self.save! if self.changed? # Must save again, no other way...
61
77
  end
62
78
  end
63
79
 
64
- send :define_method, 'push_' + tname[0...-1] do |obj|
80
+ send :define_method, "push_#{tname_single}" do |obj|
65
81
  begin
66
- return self.send('push_' + tname[0...-1] + '!', obj)
82
+ return self.send("push_#{tname_single}!", obj)
67
83
  rescue ActiveRecord::RecordInvalid
68
84
  return false
69
85
  end
70
86
  end
71
87
 
72
- send :define_method, 'top_' + tname[0...-1] do
73
- # Storing the last stacked value will not prevent race conditions
74
- # when simultaneous updates occur.
75
- return @_stacked_last unless @_stacked_last.nil?
76
- @_stacked_last = self.send(_name).first
77
- end
78
-
79
- # Generate shorcut properties for cached attributes.
80
- unless to_cache.nil?
81
- to_cache.each do |name|
82
- send :define_method, name.to_s do
83
- self.send(to_cache_prf + name)
84
- end
88
+ unless self.column_names.include? "top_#{tname_single}_id"
89
+ send :define_method, "top_#{tname_single}" do
90
+ # Storing the last stacked value will not prevent race conditions
91
+ # when simultaneous updates occur.
92
+ return @_stacked_last unless @_stacked_last.nil?
93
+ @_stacked_last = self.send(_name).first
85
94
  end
86
95
  end
87
96
  end
@@ -1,3 +1,3 @@
1
1
  module Platanus
2
- VERSION = "0.0.17"
2
+ VERSION = "0.0.19" # 0.1 will come with tests!
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: platanus
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.17
4
+ version: 0.0.19
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-08-06 00:00:00.000000000 Z
12
+ date: 2012-10-03 00:00:00.000000000 Z
13
13
  dependencies: []
14
14
  description: Platan.us utility gem
15
15
  email:
@@ -70,3 +70,4 @@ summary: This gem contains various ruby classes used by Platanus in our rails pr
70
70
  test_files:
71
71
  - spec/canned_spec.rb
72
72
  - spec/spec_helper.rb
73
+ has_rdoc: