rasti-app 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 7c24be9250ab6f65ffd3cc688760f7bb0b4799d7
4
- data.tar.gz: 9c650eb527a592b8b2740920d4d0da99574638ff
3
+ metadata.gz: 3793dceedf42613f23ddee1725e14f152c97d6ce
4
+ data.tar.gz: 933deb25ee6be913c2013a277922262cef53d325
5
5
  SHA512:
6
- metadata.gz: 904659322892ac6ca613284384cfdea9d954f31d49cdc4400faee610c4f1a943ad029bc93b409a99a4828a387132ae7750e59ae3db6baaf8ceb306ae804ff437
7
- data.tar.gz: 6e2d6966e134d151b5630da1b196499cceeb075b44551e89926ab574f61b47a438930edc5e94e53ed9f81c6bfa045510fc15d4325b5fc564a08d39585fa535e9
6
+ metadata.gz: 5c467add607bc1afadb2ff9ab5c3eb46293fa33752b5b29a35c8d90c65bb3749e80e5187535d7daaeb50fdcb2e89a4fd8f17f7d83a5654c9697943cac8cfa561
7
+ data.tar.gz: e1ff86425b84a98621ce3563c81e34ffdd885c9edbf3d074d10bdaadc40e569d6ba935ecd8f8f21fa45098e25137b0044b77558a23c61f570e17be8816f3a2e6
data/lib/rasti/app.rb CHANGED
@@ -17,51 +17,34 @@ module Rasti
17
17
 
18
18
  class << self
19
19
 
20
- def permissions
21
- @permissions ||= []
22
- end
20
+ extend Forwardable
23
21
 
24
- def valid_permission?(permission)
25
- permission = Permission.new permission
26
- permissions.any? { |p| permission.include? p }
27
- end
22
+ def_delegators :facade, :interactions,
23
+ :synchronic_interactions,
24
+ :asynchronic_interactions,
25
+ :permissions,
26
+ :valid_permission?
28
27
 
29
- def classes_in(namespace, superclass=nil)
30
- [].tap do |classes|
31
- namespace.constants.each do |name|
32
- constant = namespace.const_get name
33
- if constant.class == Module
34
- classes_in(constant, superclass).each { |c| classes << c }
35
- elsif constant.class == Class && (superclass.nil? || constant.ancestors.include?(superclass))
36
- classes << constant
37
- end
38
- end
39
- end
40
- end
28
+ attr_reader :facade
41
29
 
42
30
  private
43
31
 
44
- def facade(namespace)
45
- classes_in(namespace, Interaction).each do |interaction|
46
- permission = interaction_permission interaction, namespace
47
- permissions << permission
32
+ def expose(namespace)
33
+ @facade = Facade.new namespace
48
34
 
49
- if !interaction.ancestors.include?(AsynchronicInteraction)
50
- define_method permission.last_section do |params={}|
51
- call interaction, permission, params
35
+ facade.interactions.each do |name, specification|
36
+ if specification.synchronic?
37
+ define_method name do |params={}|
38
+ call name, specification.permission, params
52
39
  end
53
40
  end
54
-
55
- define_method "enqueue_#{permission.last_section}" do |params={}|
56
- enqueue interaction, permission, params
41
+
42
+ define_method "enqueue_#{name}" do |params={}|
43
+ enqueue name, specification.permission, params
57
44
  end
58
45
  end
59
46
  end
60
47
 
61
- def interaction_permission(interaction, namespace)
62
- Permission.new interaction.name.sub("#{namespace.name}::", '').split('::').map { |s| Inflecto.underscore s }
63
- end
64
-
65
48
  end
66
49
 
67
50
  def initialize(container, context={})
@@ -77,19 +60,14 @@ module Rasti
77
60
  @policy ||= (container[:policy_class] || Policy).new container, context
78
61
  end
79
62
 
80
- def call(interaction, permission, params)
63
+ def call(name, permission, params={})
81
64
  authorize! permission, params
82
- interaction.new(container, context).call(params)
65
+ self.class.facade.call name, container, context, params
83
66
  end
84
67
 
85
- def enqueue(interaction, permission, params)
68
+ def enqueue(name, permission, params={})
86
69
  authorize! permission, params
87
-
88
- Job.enqueue queue: params.delete(:queue) || Asynchronic.default_queue,
89
- alias: interaction,
90
- interaction: interaction,
91
- context: context,
92
- params: interaction.build_form(params).attributes
70
+ self.class.facade.enqueue name, context, params
93
71
  end
94
72
 
95
73
  def authorize!(permission, params)
@@ -2,6 +2,10 @@ module Rasti
2
2
  class App
3
3
  class AsynchronicInteraction < Interaction
4
4
 
5
+ def self.asynchronic?
6
+ true
7
+ end
8
+
5
9
  private
6
10
 
7
11
  def job
@@ -0,0 +1,33 @@
1
+ module Rasti
2
+ class App
3
+ module Delegable
4
+
5
+ def methods(*args)
6
+ delegated_methods | super
7
+ end
8
+
9
+ def public_methods(*args)
10
+ delegated_methods | super
11
+ end
12
+
13
+ private
14
+
15
+ def delegated_method?(method_name)
16
+ delegated_methods.include? method_name.to_sym
17
+ end
18
+
19
+ def method_missing(method_name, *args, &block)
20
+ if delegated_method? method_name
21
+ call_delegated_method method_name, *args, &block
22
+ else
23
+ super
24
+ end
25
+ end
26
+
27
+ def respond_to_missing?(method_name, *args)
28
+ delegated_method?(method_name) || super
29
+ end
30
+
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,118 @@
1
+ module Rasti
2
+ class App
3
+ class Facade
4
+
5
+ class UndefinedInteraction < StandardError
6
+ def initialize(name)
7
+ super "Undefined interaction #{name}"
8
+ end
9
+ end
10
+
11
+
12
+ class InteractionSpecification
13
+
14
+ attr_reader :interaction, :namespace
15
+
16
+ def initialize(interaction, namespace)
17
+ @interaction = interaction
18
+ @namespace = namespace
19
+ end
20
+
21
+ def name
22
+ permission.last_section.to_sym
23
+ end
24
+
25
+ def permission
26
+ @permission ||= Permission.new interaction.name.sub("#{namespace.name}::", '').split('::').map { |s| Inflecto.underscore s }
27
+ end
28
+
29
+ def asynchronic?
30
+ interaction.asynchronic?
31
+ end
32
+
33
+ def synchronic?
34
+ !asynchronic?
35
+ end
36
+
37
+ end
38
+
39
+
40
+ class SynchronicInteractionsFactory
41
+
42
+ include Delegable
43
+
44
+ def initialize(facade, container, context)
45
+ @facade = facade
46
+ @container = container
47
+ @context = context
48
+ end
49
+
50
+ private
51
+
52
+ attr_reader :facade, :container, :context
53
+
54
+ def delegated_methods
55
+ facade.synchronic_interactions.keys
56
+ end
57
+
58
+ def call_delegated_method(method_name, *args, &block)
59
+ facade.call method_name, container, context, *args
60
+ end
61
+
62
+ end
63
+
64
+
65
+ attr_reader :interactions
66
+
67
+ def initialize(namespace)
68
+ @interactions = Utils.classes_in(namespace, Interaction).each_with_object({}) do |interaction, hash|
69
+ specificaiton = InteractionSpecification.new interaction, namespace
70
+ hash[specificaiton.name] = specificaiton
71
+ end
72
+ end
73
+
74
+ def call(name, container, context, params={})
75
+ interaction_class(name).new(container, context).call(params)
76
+ end
77
+
78
+ def enqueue(name, context, params={})
79
+ interaction = interaction_class name
80
+
81
+ Job.enqueue queue: params.delete(:queue) || Asynchronic.default_queue,
82
+ alias: interaction,
83
+ interaction: interaction,
84
+ context: context,
85
+ params: interaction.build_form(params).attributes
86
+ end
87
+
88
+ def synchronic_interactions
89
+ interactions.select { |k,v| v.synchronic? }
90
+ end
91
+
92
+ def asynchronic_interactions
93
+ interactions.select { |k,v| v.asynchronic? }
94
+ end
95
+
96
+ def permissions
97
+ interactions.values.map(&:permission).sort
98
+ end
99
+
100
+ def valid_permission?(permission)
101
+ permission = Permission.new permission
102
+ permissions.any? { |p| permission.include? p }
103
+ end
104
+
105
+ def synchronic_interactions_factory(container, context)
106
+ SynchronicInteractionsFactory.new self, container, context
107
+ end
108
+
109
+ private
110
+
111
+ def interaction_class(name)
112
+ raise UndefinedInteraction, name unless interactions.key?(name.to_sym)
113
+ interactions[name.to_sym].interaction
114
+ end
115
+
116
+ end
117
+ end
118
+ end
@@ -8,6 +8,10 @@ module Rasti
8
8
  constants.include?(:Form) ? const_get(:Form).new(params) : Form.new
9
9
  end
10
10
 
11
+ def self.asynchronic?
12
+ false
13
+ end
14
+
11
15
  def initialize(container, context)
12
16
  @container = container
13
17
  @context = context
@@ -0,0 +1,22 @@
1
+ module Rasti
2
+ class App
3
+ class Utils
4
+ class << self
5
+
6
+ def classes_in(namespace, superclass=nil)
7
+ [].tap do |classes|
8
+ namespace.constants.each do |name|
9
+ constant = namespace.const_get name
10
+ if constant.class == Module
11
+ classes_in(constant, superclass).each { |c| classes << c }
12
+ elsif constant.class == Class && (superclass.nil? || constant.ancestors.include?(superclass))
13
+ classes << constant
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ end
20
+ end
21
+ end
22
+ end
@@ -1,5 +1,5 @@
1
1
  module Rasti
2
2
  class App
3
- VERSION = '0.0.4'
3
+ VERSION = '0.0.5'
4
4
  end
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rasti-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gabriel Naiman
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-29 00:00:00.000000000 Z
11
+ date: 2017-10-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inflecto
@@ -238,6 +238,8 @@ files:
238
238
  - lib/rasti/app.rb
239
239
  - lib/rasti/app/asynchronic_interaction.rb
240
240
  - lib/rasti/app/container.rb
241
+ - lib/rasti/app/delegable.rb
242
+ - lib/rasti/app/facade.rb
241
243
  - lib/rasti/app/interaction.rb
242
244
  - lib/rasti/app/job.rb
243
245
  - lib/rasti/app/permission.rb
@@ -245,6 +247,7 @@ files:
245
247
  - lib/rasti/app/service.rb
246
248
  - lib/rasti/app/service_factory.rb
247
249
  - lib/rasti/app/settings.rb
250
+ - lib/rasti/app/utils.rb
248
251
  - lib/rasti/app/version.rb
249
252
  - rasti-app.gemspec
250
253
  - spec/coverage_helper.rb