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.
- checksums.yaml +4 -4
- data/.codeclimate.yml +16 -0
- data/.gitignore +2 -2
- data/.rspec +2 -0
- data/.rubocop.yml +1156 -0
- data/Gemfile +9 -13
- data/README.md +133 -4
- data/Rakefile +3 -7
- data/backframe.gemspec +10 -11
- data/circle.yml +5 -2
- data/lib/backframe.rb +21 -34
- data/lib/backframe/mime.rb +4 -0
- data/lib/backframe/query.rb +48 -0
- data/lib/backframe/query/sort.rb +29 -0
- data/lib/backframe/railtie.rb +1 -16
- data/lib/backframe/response.rb +60 -0
- data/lib/backframe/response/adapter/csv.rb +39 -0
- data/lib/backframe/response/adapter/json.rb +53 -0
- data/lib/backframe/response/adapter/xlsx.rb +41 -0
- data/lib/backframe/response/adapter/xml.rb +37 -0
- data/lib/backframe/response/collection.rb +43 -0
- data/lib/backframe/response/fields.rb +62 -0
- data/lib/backframe/response/record.rb +38 -0
- data/lib/backframe/service.rb +60 -0
- data/lib/backframe/service/result/base.rb +24 -0
- data/lib/backframe/service/result/failure.rb +21 -0
- data/lib/backframe/service/result/success.rb +21 -0
- data/lib/backframe/version.rb +1 -1
- data/spec/fixtures/active_record.rb +22 -0
- data/spec/fixtures/models.rb +25 -0
- data/spec/fixtures/queries.rb +28 -0
- data/spec/fixtures/seeds.rb +12 -0
- data/spec/fixtures/serializers.rb +23 -0
- data/spec/fixtures/services.rb +26 -0
- data/spec/query/sort_spec.rb +47 -0
- data/spec/query_spec.rb +63 -0
- data/spec/response/adapter/csv_spec.rb +47 -0
- data/spec/response/adapter/json_spec.rb +66 -0
- data/spec/response/adapter/xlsx_spec.rb +59 -0
- data/spec/response/adapter/xml_spec.rb +63 -0
- data/spec/response/fields_spec.rb +45 -0
- data/spec/response/record_spec.rb +45 -0
- data/spec/response_spec.rb +153 -0
- data/spec/service/result/failure_spec.rb +16 -0
- data/spec/service/result/sucess_spec.rb +17 -0
- data/spec/service_spec.rb +16 -0
- data/spec/spec_helper.rb +15 -52
- metadata +78 -81
- data/lib/backframe/actioncontroller/acts_as_activation.rb +0 -70
- data/lib/backframe/actioncontroller/acts_as_api.rb +0 -39
- data/lib/backframe/actioncontroller/acts_as_api/adapter.rb +0 -53
- data/lib/backframe/actioncontroller/acts_as_api/errors.rb +0 -48
- data/lib/backframe/actioncontroller/acts_as_api/headers.rb +0 -11
- data/lib/backframe/actioncontroller/acts_as_api/page.rb +0 -181
- data/lib/backframe/actioncontroller/acts_as_reset.rb +0 -86
- data/lib/backframe/actioncontroller/acts_as_resource.rb +0 -92
- data/lib/backframe/actioncontroller/acts_as_resource/actions.rb +0 -100
- data/lib/backframe/actioncontroller/acts_as_session.rb +0 -80
- data/lib/backframe/activerecord/acts_as_activable.rb +0 -50
- data/lib/backframe/activerecord/acts_as_distinct.rb +0 -49
- data/lib/backframe/activerecord/acts_as_enum.rb +0 -62
- data/lib/backframe/activerecord/acts_as_orderable.rb +0 -40
- data/lib/backframe/activerecord/acts_as_percent.rb +0 -46
- data/lib/backframe/activerecord/acts_as_phone.rb +0 -59
- data/lib/backframe/activerecord/acts_as_user.rb +0 -101
- data/lib/backframe/activerecord/default_values.rb +0 -32
- data/lib/backframe/activerecord/filter_sort.rb +0 -79
- data/lib/backframe/activerecord/migration.rb +0 -25
- data/lib/backframe/image_cache/image_cache.rb +0 -45
- data/lib/backframe/image_cache/lib/asset.rb +0 -109
- data/lib/backframe/image_cache/lib/cache.rb +0 -67
- data/lib/backframe/image_cache/lib/conversions.rb +0 -132
- data/lib/backframe/models/activation.rb +0 -60
- data/lib/backframe/models/activity.rb +0 -40
- data/lib/backframe/models/reset.rb +0 -59
- data/lib/backframe/models/story.rb +0 -9
- data/lib/backframe/serializers/activity_serializer.rb +0 -44
- data/spec/backframe/acts_as_api_spec.rb +0 -225
- data/spec/backframe/acts_as_resource_spec.rb +0 -178
- data/spec/support/example_factory.rb +0 -9
- data/spec/support/example_serializer.rb +0 -3
- 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
|