backframe 0.0.49 → 1.0.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.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +16 -0
  3. data/.gitignore +2 -2
  4. data/.rspec +2 -0
  5. data/.rubocop.yml +1156 -0
  6. data/Gemfile +9 -13
  7. data/README.md +133 -4
  8. data/Rakefile +3 -7
  9. data/backframe.gemspec +10 -11
  10. data/circle.yml +5 -2
  11. data/lib/backframe.rb +21 -34
  12. data/lib/backframe/mime.rb +4 -0
  13. data/lib/backframe/query.rb +48 -0
  14. data/lib/backframe/query/sort.rb +29 -0
  15. data/lib/backframe/railtie.rb +1 -16
  16. data/lib/backframe/response.rb +60 -0
  17. data/lib/backframe/response/adapter/csv.rb +39 -0
  18. data/lib/backframe/response/adapter/json.rb +53 -0
  19. data/lib/backframe/response/adapter/xlsx.rb +41 -0
  20. data/lib/backframe/response/adapter/xml.rb +37 -0
  21. data/lib/backframe/response/collection.rb +43 -0
  22. data/lib/backframe/response/fields.rb +62 -0
  23. data/lib/backframe/response/record.rb +38 -0
  24. data/lib/backframe/service.rb +60 -0
  25. data/lib/backframe/service/result/base.rb +24 -0
  26. data/lib/backframe/service/result/failure.rb +21 -0
  27. data/lib/backframe/service/result/success.rb +21 -0
  28. data/lib/backframe/version.rb +1 -1
  29. data/spec/fixtures/active_record.rb +22 -0
  30. data/spec/fixtures/models.rb +25 -0
  31. data/spec/fixtures/queries.rb +28 -0
  32. data/spec/fixtures/seeds.rb +12 -0
  33. data/spec/fixtures/serializers.rb +23 -0
  34. data/spec/fixtures/services.rb +26 -0
  35. data/spec/query/sort_spec.rb +47 -0
  36. data/spec/query_spec.rb +63 -0
  37. data/spec/response/adapter/csv_spec.rb +47 -0
  38. data/spec/response/adapter/json_spec.rb +66 -0
  39. data/spec/response/adapter/xlsx_spec.rb +59 -0
  40. data/spec/response/adapter/xml_spec.rb +63 -0
  41. data/spec/response/fields_spec.rb +45 -0
  42. data/spec/response/record_spec.rb +45 -0
  43. data/spec/response_spec.rb +153 -0
  44. data/spec/service/result/failure_spec.rb +16 -0
  45. data/spec/service/result/sucess_spec.rb +17 -0
  46. data/spec/service_spec.rb +16 -0
  47. data/spec/spec_helper.rb +15 -52
  48. metadata +78 -81
  49. data/lib/backframe/actioncontroller/acts_as_activation.rb +0 -70
  50. data/lib/backframe/actioncontroller/acts_as_api.rb +0 -39
  51. data/lib/backframe/actioncontroller/acts_as_api/adapter.rb +0 -53
  52. data/lib/backframe/actioncontroller/acts_as_api/errors.rb +0 -48
  53. data/lib/backframe/actioncontroller/acts_as_api/headers.rb +0 -11
  54. data/lib/backframe/actioncontroller/acts_as_api/page.rb +0 -181
  55. data/lib/backframe/actioncontroller/acts_as_reset.rb +0 -86
  56. data/lib/backframe/actioncontroller/acts_as_resource.rb +0 -92
  57. data/lib/backframe/actioncontroller/acts_as_resource/actions.rb +0 -100
  58. data/lib/backframe/actioncontroller/acts_as_session.rb +0 -80
  59. data/lib/backframe/activerecord/acts_as_activable.rb +0 -50
  60. data/lib/backframe/activerecord/acts_as_distinct.rb +0 -49
  61. data/lib/backframe/activerecord/acts_as_enum.rb +0 -62
  62. data/lib/backframe/activerecord/acts_as_orderable.rb +0 -40
  63. data/lib/backframe/activerecord/acts_as_percent.rb +0 -46
  64. data/lib/backframe/activerecord/acts_as_phone.rb +0 -59
  65. data/lib/backframe/activerecord/acts_as_user.rb +0 -101
  66. data/lib/backframe/activerecord/default_values.rb +0 -32
  67. data/lib/backframe/activerecord/filter_sort.rb +0 -79
  68. data/lib/backframe/activerecord/migration.rb +0 -25
  69. data/lib/backframe/image_cache/image_cache.rb +0 -45
  70. data/lib/backframe/image_cache/lib/asset.rb +0 -109
  71. data/lib/backframe/image_cache/lib/cache.rb +0 -67
  72. data/lib/backframe/image_cache/lib/conversions.rb +0 -132
  73. data/lib/backframe/models/activation.rb +0 -60
  74. data/lib/backframe/models/activity.rb +0 -40
  75. data/lib/backframe/models/reset.rb +0 -59
  76. data/lib/backframe/models/story.rb +0 -9
  77. data/lib/backframe/serializers/activity_serializer.rb +0 -44
  78. data/spec/backframe/acts_as_api_spec.rb +0 -225
  79. data/spec/backframe/acts_as_resource_spec.rb +0 -178
  80. data/spec/support/example_factory.rb +0 -9
  81. data/spec/support/example_serializer.rb +0 -3
  82. data/spec/support/schema.rb +0 -8
@@ -1,92 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'active_support'
4
-
5
- require 'backframe/actioncontroller/acts_as_resource/actions'
6
-
7
- module Backframe
8
- module ActsAsResource
9
- extend ActiveSupport::Concern
10
-
11
- class_methods do
12
- def acts_as_resource(resource, *args)
13
- arguments = args[0] || {}
14
-
15
- @resource = resource
16
- @resource_opts = arguments
17
-
18
- include Helpers
19
-
20
- member_methods = [:show,:edit,:update,:destroy]
21
- if arguments.key?(:has_many)
22
- member_methods.concat(arguments[:has_many])
23
- end
24
-
25
- if arguments.key?(:only)
26
- member_methods = (member_methods.to_set & arguments[:only].to_set).to_a
27
- end
28
-
29
- if arguments.key?(:except)
30
- member_methods = (member_methods.to_set - arguments[:except].to_set).to_a
31
- end
32
-
33
- before_action :load_item, only: member_methods
34
-
35
- include Actions::Index if include_method?(arguments, :index)
36
- include Actions::Create if include_method?(arguments, :create)
37
- include Actions::Show if include_method?(arguments, :show)
38
- include Actions::Edit if include_method?(arguments, :edit)
39
- include Actions::Update if include_method?(arguments, :update)
40
- include Actions::UpdateAll if include_method?(arguments, :update)
41
- include Actions::Destroy if include_method?(arguments, :destroy)
42
-
43
- if arguments.key?(:has_many)
44
- arguments[:has_many].each do |association|
45
- class_eval <<-EOV
46
- def #{association}
47
- page(@item.#{association})
48
- end
49
- EOV
50
- end
51
- end
52
- end
53
-
54
- def resource; @resource; end
55
- def resource_opts; @resource_opts; end
56
-
57
- private
58
-
59
- def include_method?(arguments, method)
60
- (arguments[:only].present? && arguments[:only].include?(method)) ||
61
- (arguments[:except].present? && !arguments[:except].include?(method)) ||
62
- (arguments[:only].nil? && arguments[:except].nil?)
63
- end
64
- end
65
- end
66
-
67
- module Helpers
68
- def resource
69
- self.class.resource.constantize
70
- rescue NameError
71
- instance_eval self.class.resource
72
- end
73
-
74
- def load_item
75
- @item = resource.find(params[:id])
76
- end
77
-
78
- def allowed_params
79
- allowed = params.permit(self.class.resource_opts[:allowed])
80
- self.class.resource_opts[:allowed].each do |attribute|
81
- if attribute.is_a?(Hash)
82
- attribute.each do |key,value|
83
- if value.is_a?(Array) && !allowed.key?(key)
84
- allowed[key] = []
85
- end
86
- end
87
- end
88
- end
89
- allowed
90
- end
91
- end
92
- end
@@ -1,100 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backframe
4
- module ActsAsResource
5
- module Actions
6
- module Index
7
- def index
8
- page(resource.includes(self.class.resource_opts[:include]), nil)
9
- end
10
- end
11
-
12
- module Create
13
- def create
14
- @item = resource.new(allowed_params)
15
- if @item.save
16
- if @item.respond_to?(:activities)
17
- Activity.create!(subject: current_user, text: 'created {object1}', object1: @item)
18
- end
19
-
20
- render json: @item, status: 201, adapter: Backframe::ActsAsAPI::Adapter
21
- else
22
- resource_error_response(@item, 422)
23
- end
24
- end
25
- end
26
-
27
- module Show
28
- def show
29
- render json: @item, adapter: Backframe::ActsAsAPI::Adapter
30
- end
31
- end
32
-
33
- module Edit
34
- def edit
35
- json = {}
36
- self.class.resource_opts[:allowed].each do |attribute|
37
- if(attribute.is_a?(Hash))
38
- attribute.each do |key,val|
39
- json[key] = @item.send(key)
40
- end
41
- else
42
- json[attribute] = @item.send(attribute)
43
- end
44
- end
45
- render json: json
46
- end
47
- end
48
-
49
- module Update
50
- def update
51
- if @item.update_attributes(allowed_params)
52
- if @item.respond_to?(:activities)
53
- Activity.create!(subject: current_user, text: 'updated {object1}', object1: @item)
54
- end
55
- render json: @item
56
- else
57
- resource_error_response(@item, 422)
58
- end
59
- end
60
- end
61
-
62
- module UpdateAll
63
- def update_all
64
- records = []
65
-
66
- ActiveRecord::Base.transaction do
67
- records = update_all_params.map(&method(:update_record))
68
- end
69
-
70
- render json: records, adapter: Backframe::ActsAsAPI::Adapter
71
- end
72
-
73
- private
74
-
75
- def update_record(attrs)
76
- attrs = attrs.with_indifferent_access
77
- record = resource.find(attrs[:id])
78
- record.attributes = attrs
79
- record.save!
80
- record
81
- end
82
-
83
- def update_all_params
84
- permitted = self.class.resource_opts[:allowed] << :id
85
- params.permit(records: permitted)[:records] || []
86
- end
87
- end
88
-
89
- module Destroy
90
- def destroy
91
- if @item.destroy
92
- render nothing: true, status: 204
93
- else
94
- resource_error_response(@item, 422)
95
- end
96
- end
97
- end
98
- end
99
- end
100
- end
@@ -1,80 +0,0 @@
1
- # encoding: utf-8
2
-
3
- require 'active_support'
4
- require 'active_support/inflector'
5
-
6
- module Backframe
7
- module ActsAsSession
8
- extend ActiveSupport::Concern
9
-
10
- class_methods do
11
- def acts_as_session(model, *args)
12
-
13
- arguments = args[0] || {}
14
-
15
- class_eval <<-EOV
16
-
17
- layout 'signin'
18
- before_action :redirect_if_signed_in, :except => [:application,:destroy]
19
- before_action :authenticate_#{model.underscore}, :only => :application
20
-
21
- def application
22
- render :layout => false
23
- end
24
-
25
- def new
26
- @user = #{model}.new
27
- end
28
-
29
- def create
30
- if @user = #{model}.where('LOWER(email) = ?', params[:#{model.underscore}][:email].downcase).first
31
- if @user.locked_out?
32
- flash[:error] = I18n.t(:session_locked)
33
- session[:signin_locked] = true
34
- redirect_to '#{arguments[:prefix]}/signin'
35
- elsif @user.authenticate(params[:#{model.underscore}][:password])
36
- @user.signin(:success)
37
- session.delete(:signin_locked)
38
- session[:#{model.underscore}_id] = @user.id
39
- url = session[:redirect_to] || '#{arguments[:redirect]}'
40
- redirect_to url
41
- else
42
- @user.signin(:failed)
43
- if @user.locked_out?
44
- session[:signin_locked] = true
45
- flash[:error] = I18n.t(:session_locking)
46
- else
47
- flash[:error] = I18n.t(:session_invalid)
48
- end
49
- redirect_to '#{arguments[:prefix]}/signin'
50
- end
51
- else
52
- flash[:error] = I18n.t(:session_not_found)
53
- redirect_to '#{arguments[:prefix]}/signin'
54
- end
55
- end
56
-
57
- def destroy
58
- flash[:success] = I18n.t(:session_signout)
59
- session.delete(:redirect_to)
60
- session.delete(:#{model.underscore}_id)
61
- redirect_to '#{arguments[:prefix]}/signin'
62
- end
63
-
64
- private
65
-
66
- def authenticate_#{model.underscore}
67
- if !signed_in?
68
- flash[:warning] = I18n.t(:session_interception)
69
- session[:redirect_to] = request.path
70
- redirect_to '#{arguments[:prefix]}/signin'
71
- end
72
- end
73
-
74
- EOV
75
-
76
- end
77
- end
78
-
79
- end
80
- end
@@ -1,50 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backframe
4
- module ActsAsActivable
5
-
6
- extend ActiveSupport::Concern
7
-
8
- def self.included(base)
9
- base.send :extend, ClassMethods
10
- end
11
-
12
- module ClassMethods
13
-
14
- def acts_as_activable(entity, text, link)
15
-
16
- class_eval <<-EOV
17
-
18
- def activities
19
- conditions = []
20
- conditions << '("activities"."object1_type"=? AND "activities"."object1_id"=?)'
21
- conditions << '("activities"."object2_type"=? AND "activities"."object2_id"=?)'
22
- conditions << '"activities"."subject_type"=? && "activities"."subject_id"=?' if self.is_a?(Admin) || self.is_a?(Customer)
23
- fragment = [conditions.join(' OR '), self.class.name, self.id, self.class.name, self.id]
24
- fragment.concat([self.class.name, self.id]) if self.is_a?(Admin) || self.is_a?(Customer)
25
- Activity.where(fragment)
26
- end
27
-
28
- def activity_entity
29
- "#{entity}"
30
- end
31
-
32
- def activity_text
33
- self.#{text}
34
- end
35
-
36
- def activity_link
37
- link = "#{link}"
38
- "#{link}".scan(/\\\[([\\\w\\\_]*)\\\]/).each do |token|
39
- link = link.gsub('['+token.first+']', self.send(token.first).to_s)
40
- end
41
- link
42
- end
43
- EOV
44
-
45
- end
46
-
47
- end
48
-
49
- end
50
- end
@@ -1,49 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backframe
4
- module ActsAsDistinct
5
-
6
- extend ActiveSupport::Concern
7
-
8
- def self.included(base)
9
- base.send :extend, ClassMethods
10
- end
11
-
12
- module ClassMethods
13
-
14
- def acts_as_distinct(*args)
15
-
16
- field = args[0]
17
- arguments = args[1]
18
-
19
- class_eval <<-EOV
20
-
21
- after_initialize :set_default_#{field}, :if => Proc.new { |m| m.new_record? && m.#{arguments[:parent]}.present? }
22
- after_save :toggle_#{field}_distinction, :if => Proc.new { |m| m.#{arguments[:parent]}.present? && m.#{field} && (m.new_record? || m.#{field}_changed?) }
23
-
24
- scope :#{field.to_s.gsub('is_', '')}, -> { where(:#{field} => true) }
25
-
26
- def #{field.to_s.gsub('is_', '')}?
27
- return self.#{field}
28
- end
29
-
30
- private
31
-
32
- def set_default_#{field}
33
- self.#{field} = self.#{arguments[:parent]}.#{arguments[:association]}.empty?
34
- end
35
-
36
- def toggle_#{field}_distinction
37
- self.#{arguments[:parent]}.#{arguments[:association]}.where('id != ?', self.id).each do |item|
38
- item.update_attributes(:#{field} => false)
39
- end
40
- end
41
-
42
- EOV
43
-
44
- end
45
-
46
- end
47
-
48
- end
49
- end
@@ -1,62 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backframe
4
- module ActsAsEnum
5
- extend ActiveSupport::Concern
6
-
7
- def self.included(base)
8
- base.send :extend, ClassMethods
9
- end
10
-
11
- module ClassMethods
12
-
13
- def acts_as_enum(*args)
14
-
15
- field = args[0]
16
- arguments = args[1]
17
-
18
- if arguments.key?(:required)
19
-
20
- validates_presence_of field
21
-
22
- end
23
-
24
- if arguments.key?(:default)
25
-
26
- after_initialize "init_#{field}".to_sym, :if => Proc.new { |d| d.new_record? }
27
-
28
- class_eval <<-EOV
29
- def init_#{field}
30
- self.#{field} ||= '#{arguments[:default]}'
31
- end
32
- EOV
33
-
34
- end
35
-
36
- if arguments.key?(:in)
37
-
38
- validates_inclusion_of field, :in => arguments[:in]
39
-
40
- class_eval <<-EOV
41
- scope :#{field}_is, -> (*options) { where('"#{self.table_name}"."#{field}" IN (?)', (options.is_a?(Array) ? options : [options])) }
42
-
43
- def #{field}_is?(*options)
44
- (options.is_a?(Array) ? options : [options]).map(&:to_s).include?(self.#{field})
45
- end
46
- EOV
47
-
48
- class_eval <<-EOV
49
- scope :#{field}_not, -> (*options) { where('"#{self.table_name}"."#{field}" NOT IN (?)', (options.is_a?(Array) ? options : [options])) }
50
-
51
- def #{field}_not?(*options)
52
- !(options.is_a?(Array) ? options : [options]).map(&:to_s).include?(self.#{field})
53
- end
54
- EOV
55
-
56
- end
57
-
58
- end
59
-
60
- end
61
- end
62
- end
@@ -1,40 +0,0 @@
1
- # encoding: utf-8
2
-
3
- module Backframe
4
- module ActsAsOrderable
5
- extend ActiveSupport::Concern
6
-
7
- def self.included(base)
8
- base.send :extend, ClassMethods
9
- end
10
-
11
- module ClassMethods
12
-
13
- def acts_as_orderable(field, args = {})
14
-
15
- class_eval <<-EOV
16
- validates_presence_of :#{field}
17
-
18
- before_validation :set_#{field}, :on => :create
19
- after_destroy :reorder_#{field}
20
-
21
- default_scope -> { order(:#{field} => :asc) }
22
-
23
- def set_#{field}
24
- self.#{field} ||= (self.#{args[:on]}.#{self.name.tableize}.any?) ? self.#{args[:on]}.#{self.name.tableize}.maximum(:#{field}) + 1 : 0
25
- end
26
-
27
- def reorder_#{field}
28
- self.#{args[:on]}.#{self.name.tableize}.order(:#{field} => :asc).each_with_index do |item, index|
29
- item.update_column(:#{field}, index)
30
- end
31
- end
32
-
33
- EOV
34
-
35
- end
36
-
37
- end
38
-
39
- end
40
- end