rails-add_ons 0.2.0 → 0.3.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/app/controllers/api/resources_controller/base.rb +68 -3
- data/app/controllers/api/service_controller/base.rb +13 -6
- data/app/controllers/service_controller/base.rb +9 -5
- data/app/parsers/api/resources_controller/condition_parser.rb +1 -1
- data/app/services/rails/add_ons/service/base.rb +2 -5
- data/app/services/rails/add_ons/service/messages.rb +44 -0
- data/app/views/frontend/_after_body.haml +0 -0
- data/app/views/frontend/_after_head.haml +0 -0
- data/app/views/frontend/_before_body.haml +0 -0
- data/app/views/frontend/_before_head.haml +0 -0
- data/app/views/layouts/rails/add_ons/application.haml +6 -2
- data/app/views/service_controller/base/create.haml +3 -3
- data/config/locales/de.yml +8 -1
- data/config/locales/en.yml +8 -1
- data/lib/active_model/model.rb +98 -0
- data/lib/rails/add_ons/version.rb +1 -1
- data/lib/rails-add_ons.rb +1 -0
- metadata +8 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ec60bb83abbf6700fdc1e9d9bad0aeab41c0d42d
|
4
|
+
data.tar.gz: 6768f210ab47e3c60bf57dcfecea186f1a4998e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 12e994afc0b6ab5eb2f0731f7c1454866b2af87b19b7f95dc38afdeee55d3854aaad261e97864c3a2141cd96b0c76f2977b8165b04a7253052b759964a67a290
|
7
|
+
data.tar.gz: 6756eff8bcde2f8b3fe5c1b638815215132e660864edefe8f539eecd5a263a00014308d6034e708c9f4e0c233150fcac0d6d23ad40e5ec9aa124ad3ec559280f
|
@@ -112,9 +112,9 @@ module Api
|
|
112
112
|
request.query_parameters.each do |field, condition|
|
113
113
|
case field
|
114
114
|
when 'limit'
|
115
|
-
scope = scope.limit(condition)
|
115
|
+
scope = scope.limit(condition.to_i)
|
116
116
|
when 'offset'
|
117
|
-
scope = scope.offset(condition)
|
117
|
+
scope = scope.offset(condition.to_i)
|
118
118
|
when 'order'
|
119
119
|
scope = scope.order(condition)
|
120
120
|
when 'includes'
|
@@ -190,7 +190,9 @@ module Api
|
|
190
190
|
private
|
191
191
|
|
192
192
|
def load_count
|
193
|
-
|
193
|
+
base_scope = resource_class
|
194
|
+
scope = add_conditions_from_query(base_scope)
|
195
|
+
@count = scope.count
|
194
196
|
end
|
195
197
|
end
|
196
198
|
|
@@ -241,6 +243,67 @@ module Api
|
|
241
243
|
@count = resource_class.delete_all
|
242
244
|
end
|
243
245
|
end
|
246
|
+
|
247
|
+
module FirstAction
|
248
|
+
extend ActiveSupport::Concern
|
249
|
+
|
250
|
+
included do
|
251
|
+
if respond_to?(:before_action)
|
252
|
+
before_action :load_first, only: [:first]
|
253
|
+
else
|
254
|
+
before_filter :load_first, only: [:first]
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
def first
|
259
|
+
respond_to do |format|
|
260
|
+
if @resource.nil?
|
261
|
+
format.json { render json: nil }
|
262
|
+
else
|
263
|
+
format.json { render json: [serialize_resource(@resource)] }
|
264
|
+
end
|
265
|
+
end
|
266
|
+
end
|
267
|
+
|
268
|
+
private
|
269
|
+
|
270
|
+
def load_first
|
271
|
+
base_scope = resource_class
|
272
|
+
scope = add_conditions_from_query(base_scope)
|
273
|
+
@resource = scope.first
|
274
|
+
end
|
275
|
+
end
|
276
|
+
|
277
|
+
module LastAction
|
278
|
+
extend ActiveSupport::Concern
|
279
|
+
|
280
|
+
included do
|
281
|
+
if respond_to?(:before_action)
|
282
|
+
before_action :load_last, only: [:last]
|
283
|
+
else
|
284
|
+
before_filter :load_last, only: [:last]
|
285
|
+
end
|
286
|
+
end
|
287
|
+
|
288
|
+
def last
|
289
|
+
respond_to do |format|
|
290
|
+
if @resource.nil?
|
291
|
+
format.json { render json: nil }
|
292
|
+
else
|
293
|
+
format.json { render json: [serialize_resource(@resource)] }
|
294
|
+
end
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
private
|
299
|
+
|
300
|
+
def load_last
|
301
|
+
base_scope = resource_class
|
302
|
+
scope = add_conditions_from_query(base_scope)
|
303
|
+
@resource = scope.last
|
304
|
+
end
|
305
|
+
end
|
306
|
+
|
244
307
|
include RestActions
|
245
308
|
include Resources
|
246
309
|
include RestResourceUrls
|
@@ -248,6 +311,8 @@ module Api
|
|
248
311
|
include CountAction
|
249
312
|
include DestroyAllAction
|
250
313
|
include DeleteAllAction
|
314
|
+
include FirstAction
|
315
|
+
include LastAction
|
251
316
|
include ApiControllerConcerns::ExceptionHandling
|
252
317
|
end
|
253
318
|
end
|
@@ -8,7 +8,7 @@ module Api
|
|
8
8
|
include ActionController::MimeResponds
|
9
9
|
|
10
10
|
respond_to :json
|
11
|
-
|
11
|
+
|
12
12
|
if respond_to?(:before_action)
|
13
13
|
before_action :initialize_service_for_create, only: [:create]
|
14
14
|
else
|
@@ -17,6 +17,12 @@ module Api
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def create
|
20
|
+
perform
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def perform
|
20
26
|
@result = @service.perform
|
21
27
|
respond_to do |format|
|
22
28
|
if @result.success?
|
@@ -27,16 +33,17 @@ module Api
|
|
27
33
|
end
|
28
34
|
end
|
29
35
|
|
30
|
-
private
|
31
|
-
|
32
36
|
def initialize_service_for_create
|
37
|
+
@service = service_class.new(*service_arguments)
|
38
|
+
end
|
39
|
+
|
40
|
+
def service_arguments
|
33
41
|
# In rails 5 permitted_params is an instance of ActionController::Parameters.
|
34
42
|
# Stragely, when calling #delete on it, it does not delete the key, so we have
|
35
|
-
# to transform it into a hash first.
|
43
|
+
# to transform it into a hash first.
|
36
44
|
params_hash = permitted_params.try(:to_h).presence || permitted_params
|
37
|
-
|
38
45
|
options = params_hash.try(:delete, :options) || {}
|
39
|
-
|
46
|
+
[params_hash, options]
|
40
47
|
end
|
41
48
|
|
42
49
|
def permitted_params
|
@@ -24,16 +24,20 @@ module ServiceController
|
|
24
24
|
def new; end
|
25
25
|
|
26
26
|
def create
|
27
|
-
|
28
|
-
|
27
|
+
perform
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def perform
|
33
|
+
@result = @resource.perform
|
34
|
+
if @result.success?
|
29
35
|
render :create
|
30
36
|
else
|
31
37
|
render :new
|
32
38
|
end
|
33
39
|
end
|
34
40
|
|
35
|
-
private
|
36
|
-
|
37
41
|
def initialize_service
|
38
42
|
@resource = service_class.new
|
39
43
|
end
|
@@ -132,4 +136,4 @@ module ServiceController
|
|
132
136
|
include ResourceInflections
|
133
137
|
include LocationHistory
|
134
138
|
end
|
135
|
-
end
|
139
|
+
end
|
@@ -3,6 +3,7 @@ module Rails
|
|
3
3
|
module Service
|
4
4
|
class Base
|
5
5
|
include ActiveModel::Model
|
6
|
+
extend ActiveModel::Naming
|
6
7
|
|
7
8
|
def self.attr_accessor(*args)
|
8
9
|
super
|
@@ -19,10 +20,6 @@ module Rails
|
|
19
20
|
(@attr_names ||= [])
|
20
21
|
end
|
21
22
|
|
22
|
-
def self.i18n_scope
|
23
|
-
:activerecord
|
24
|
-
end
|
25
|
-
|
26
23
|
def self.call(*args)
|
27
24
|
new(*args).perform
|
28
25
|
end
|
@@ -149,7 +146,7 @@ module Rails
|
|
149
146
|
include Errors
|
150
147
|
include Resultable
|
151
148
|
include Callbacks
|
152
|
-
include Messages
|
149
|
+
include Rails::AddOns::Service::Messages
|
153
150
|
end
|
154
151
|
end
|
155
152
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Rails
|
2
|
+
module AddOns
|
3
|
+
module Service
|
4
|
+
module Messages
|
5
|
+
private
|
6
|
+
|
7
|
+
def initialize_messages
|
8
|
+
@messages = []
|
9
|
+
end
|
10
|
+
|
11
|
+
def say(what, &block)
|
12
|
+
@indent ||= 0
|
13
|
+
if block_given?
|
14
|
+
@indent += 1
|
15
|
+
output "#{output_prefix}#{(" " * @indent)}#{what}..."
|
16
|
+
block_result = yield
|
17
|
+
say_done
|
18
|
+
@indent -= 1
|
19
|
+
block_result
|
20
|
+
else
|
21
|
+
output "#{output_prefix}#{(" " * @indent)}#{what}"
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def say_done
|
26
|
+
say " => Done"
|
27
|
+
end
|
28
|
+
|
29
|
+
def output_prefix
|
30
|
+
"[#{self.class.name}] "
|
31
|
+
end
|
32
|
+
|
33
|
+
def output(what)
|
34
|
+
@messages << what
|
35
|
+
puts what
|
36
|
+
end
|
37
|
+
|
38
|
+
def copy_messages_to_result
|
39
|
+
@result.instance_variable_set(:@messages, @messages)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
@@ -1,6 +1,7 @@
|
|
1
1
|
!!!
|
2
2
|
%html{:lang => "en"}
|
3
3
|
%head
|
4
|
+
= render 'before_head'
|
4
5
|
= csrf_meta_tags
|
5
6
|
|
6
7
|
/ Required meta tags
|
@@ -8,16 +9,19 @@
|
|
8
9
|
%meta{:content => "width=device-width, initial-scale=1, shrink-to-fit=no", :name => "viewport"}/
|
9
10
|
/ Bootstrap CSS
|
10
11
|
%link{:crossorigin => "anonymous", :href => "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0-alpha.6/css/bootstrap.min.css", :integrity => "sha384-rwoIResjU2yc3z8GV/NPeZWAv56rSmLldC3R/AZzGRnGxQQKnKkoFVhFQhNUwEyJ", :rel => "stylesheet"}/
|
11
|
-
= stylesheet_link_tag "rails/add_ons/application",
|
12
|
+
= stylesheet_link_tag "rails/add_ons/application", media: 'all', :'data-turbolinks-track' => 'reload'
|
12
13
|
= stylesheet_link_tag "rails/add_ons/font_awesome", media: 'all', :'data-turbolinks-track' => 'reload'
|
13
14
|
= javascript_include_tag "rails/add_ons/application", :'data-turbolinks-track' => 'reload'
|
14
15
|
/ widget endpoint
|
15
16
|
- if respond_to?(:rails_add_ons)
|
16
17
|
%meta{name: 'widget-base-path', content: rails_add_ons.widget_path}
|
18
|
+
= render 'after_head'
|
17
19
|
%body
|
20
|
+
= render 'before_body'
|
18
21
|
= render 'navbar'
|
19
22
|
.container-fluid
|
20
23
|
.starter-template
|
21
24
|
= bootstrap_flash
|
22
25
|
= yield
|
23
|
-
/ /.container
|
26
|
+
/ /.container
|
27
|
+
= render 'after_body'
|
@@ -1,13 +1,13 @@
|
|
1
|
-
= render 'create_before_service_output',
|
1
|
+
= render 'create_before_service_output', result: @result
|
2
2
|
|
3
3
|
%table.table.table-sm.table-striped.table-monospaced
|
4
4
|
%tbody
|
5
|
-
- @
|
5
|
+
- @result.messages.each_with_index do |message, index|
|
6
6
|
%tr
|
7
7
|
%td= index + 1
|
8
8
|
%td= message
|
9
9
|
|
10
|
-
= render 'create_after_service_output',
|
10
|
+
= render 'create_after_service_output', result: @result
|
11
11
|
|
12
12
|
= bootstrap_button(to: new_resource_path, context: :success) do
|
13
13
|
= fa_icon :back
|
data/config/locales/de.yml
CHANGED
@@ -15,6 +15,9 @@ de:
|
|
15
15
|
destroy:
|
16
16
|
notice: "%{resource_name} wurde gelöscht."
|
17
17
|
alert: "%{resource_name} konnte nicht gelöscht werden."
|
18
|
+
perform:
|
19
|
+
notice: "%{resource_name} wurde ausgeführt."
|
20
|
+
alert: "%{resource_name} konnte nicht ausgeführt werden. Es traten folgende Fehler auf: %{errors}"
|
18
21
|
i18n:
|
19
22
|
locales:
|
20
23
|
en: English
|
@@ -36,4 +39,8 @@ de:
|
|
36
39
|
create:
|
37
40
|
back: "Zurück"
|
38
41
|
new:
|
39
|
-
title: "%{service_name} ausführen"
|
42
|
+
title: "%{service_name} ausführen"
|
43
|
+
views:
|
44
|
+
pagination:
|
45
|
+
last: '▶'
|
46
|
+
next: '◀'
|
data/config/locales/en.yml
CHANGED
@@ -15,6 +15,9 @@ en:
|
|
15
15
|
destroy:
|
16
16
|
notice: "%{resource_name} was successfully destroyed."
|
17
17
|
alert: "%{resource_name} could not be destroyed."
|
18
|
+
perform:
|
19
|
+
notice: "%{resource_name} was executed."
|
20
|
+
alert: "%{resource_name} could not be executed. Errors: %{errors}"
|
18
21
|
i18n:
|
19
22
|
locales:
|
20
23
|
de: Deutsch
|
@@ -36,4 +39,8 @@ en:
|
|
36
39
|
create:
|
37
40
|
back: "Back"
|
38
41
|
new:
|
39
|
-
title: "Run %{service_name}"
|
42
|
+
title: "Run %{service_name}"
|
43
|
+
views:
|
44
|
+
pagination:
|
45
|
+
last: '▶'
|
46
|
+
next: '◀'
|
@@ -0,0 +1,98 @@
|
|
1
|
+
module ActiveModel
|
2
|
+
|
3
|
+
# == Active Model Basic Model
|
4
|
+
#
|
5
|
+
# Includes the required interface for an object to interact with
|
6
|
+
# <tt>ActionPack</tt>, using different <tt>ActiveModel</tt> modules.
|
7
|
+
# It includes model name introspections, conversions, translations and
|
8
|
+
# validations. Besides that, it allows you to initialize the object with a
|
9
|
+
# hash of attributes, pretty much like <tt>ActiveRecord</tt> does.
|
10
|
+
#
|
11
|
+
# A minimal implementation could be:
|
12
|
+
#
|
13
|
+
# class Person
|
14
|
+
# include ActiveModel::Model
|
15
|
+
# attr_accessor :name, :age
|
16
|
+
# end
|
17
|
+
#
|
18
|
+
# person = Person.new(name: 'bob', age: '18')
|
19
|
+
# person.name # => 'bob'
|
20
|
+
# person.age # => 18
|
21
|
+
#
|
22
|
+
# Note that, by default, <tt>ActiveModel::Model</tt> implements <tt>persisted?</tt>
|
23
|
+
# to return +false+, which is the most common case. You may want to override
|
24
|
+
# it in your class to simulate a different scenario:
|
25
|
+
#
|
26
|
+
# class Person
|
27
|
+
# include ActiveModel::Model
|
28
|
+
# attr_accessor :id, :name
|
29
|
+
#
|
30
|
+
# def persisted?
|
31
|
+
# self.id == 1
|
32
|
+
# end
|
33
|
+
# end
|
34
|
+
#
|
35
|
+
# person = Person.new(id: 1, name: 'bob')
|
36
|
+
# person.persisted? # => true
|
37
|
+
#
|
38
|
+
# Also, if for some reason you need to run code on <tt>initialize</tt>, make
|
39
|
+
# sure you call +super+ if you want the attributes hash initialization to
|
40
|
+
# happen.
|
41
|
+
#
|
42
|
+
# class Person
|
43
|
+
# include ActiveModel::Model
|
44
|
+
# attr_accessor :id, :name, :omg
|
45
|
+
#
|
46
|
+
# def initialize(attributes={})
|
47
|
+
# super
|
48
|
+
# @omg ||= true
|
49
|
+
# end
|
50
|
+
# end
|
51
|
+
#
|
52
|
+
# person = Person.new(id: 1, name: 'bob')
|
53
|
+
# person.omg # => true
|
54
|
+
#
|
55
|
+
# For more detailed information on other functionalities available, please
|
56
|
+
# refer to the specific modules included in <tt>ActiveModel::Model</tt>
|
57
|
+
# (see below).
|
58
|
+
module Model
|
59
|
+
def self.included(base) #:nodoc:
|
60
|
+
base.class_eval do
|
61
|
+
extend ActiveModel::Naming
|
62
|
+
extend ActiveModel::Translation
|
63
|
+
include ActiveModel::Validations
|
64
|
+
include ActiveModel::Conversion
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
# Initializes a new model with the given +params+.
|
69
|
+
#
|
70
|
+
# class Person
|
71
|
+
# include ActiveModel::Model
|
72
|
+
# attr_accessor :name, :age
|
73
|
+
# end
|
74
|
+
#
|
75
|
+
# person = Person.new(name: 'bob', age: '18')
|
76
|
+
# person.name # => "bob"
|
77
|
+
# person.age # => 18
|
78
|
+
def initialize(params={})
|
79
|
+
params.each do |attr, value|
|
80
|
+
# self.public_send("#{attr}=", value)
|
81
|
+
self.send("#{attr}=", value)
|
82
|
+
end if params
|
83
|
+
end
|
84
|
+
|
85
|
+
# Indicates if the model is persisted. Default is +false+.
|
86
|
+
#
|
87
|
+
# class Person
|
88
|
+
# include ActiveModel::Model
|
89
|
+
# attr_accessor :id, :name
|
90
|
+
# end
|
91
|
+
#
|
92
|
+
# person = Person.new(id: 1, name: 'bob')
|
93
|
+
# person.persisted? # => false
|
94
|
+
def persisted?
|
95
|
+
false
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
data/lib/rails-add_ons.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-add_ons
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Roberto Vasquez Angel
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-06-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -202,9 +202,14 @@ files:
|
|
202
202
|
- app/helpers/rails/add_ons/widget_helper.rb
|
203
203
|
- app/parsers/api/resources_controller/condition_parser.rb
|
204
204
|
- app/services/rails/add_ons/service/base.rb
|
205
|
+
- app/services/rails/add_ons/service/messages.rb
|
205
206
|
- app/services/rails/add_ons/service/result/base.rb
|
206
207
|
- app/views/component/_collection_table.haml
|
207
208
|
- app/views/component/_resource_table.haml
|
209
|
+
- app/views/frontend/_after_body.haml
|
210
|
+
- app/views/frontend/_after_head.haml
|
211
|
+
- app/views/frontend/_before_body.haml
|
212
|
+
- app/views/frontend/_before_head.haml
|
208
213
|
- app/views/frontend/_navbar.haml
|
209
214
|
- app/views/layouts/rails/add_ons/application.haml
|
210
215
|
- app/views/resources_controller/base/_after_show_table.haml
|
@@ -236,6 +241,7 @@ files:
|
|
236
241
|
- config/locales/de.yml
|
237
242
|
- config/locales/en.yml
|
238
243
|
- config/routes.rb
|
244
|
+
- lib/active_model/model.rb
|
239
245
|
- lib/rails-add_ons.rb
|
240
246
|
- lib/rails/add_ons.rb
|
241
247
|
- lib/rails/add_ons/engine.rb
|