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