platanus 0.0.17 → 0.0.19

Sign up to get free protection for your applications and to get access to all the features.
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: