web-connect 0.3.3 → 0.4.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/lib/netfira/web_connect/components.rb +1 -0
- data/lib/netfira/web_connect/components/hash_of_models.rb +52 -0
- data/lib/netfira/web_connect/events.rb +24 -4
- data/lib/netfira/web_connect/model.rb +4 -0
- data/lib/netfira/web_connect/model/record.rb +6 -0
- data/lib/netfira/web_connect/model/record/events.rb +26 -9
- data/lib/netfira/web_connect/model/record/relations.rb +2 -2
- data/lib/netfira/web_connect/model/relation.rb +5 -1
- data/lib/netfira/web_connect/model/relation/events.rb +17 -7
- data/lib/netfira/web_connect/models/support/setting.rb +3 -2
- data/lib/netfira/web_connect/rack_app/action.rb +4 -0
- data/lib/netfira/web_connect/rack_app/actions/version_8/commit.rb +11 -2
- data/lib/netfira/web_connect/rack_app/actions/version_8/commit/records.rb +1 -0
- data/lib/netfira/web_connect/rack_app/actions/version_8/commit/relations.rb +4 -3
- data/lib/netfira/web_connect/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a8bff92c7d13988bc68cf2aa9623c9621624319a
|
4
|
+
data.tar.gz: 303b28ea1214ce4c065527f0b5ab1efda2d2268c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7136d9aa509a71ff9d8208e5d463746d4f5d99c5a30ff1718ccd6427e7cbc0c95fc4432bf6f597b647f441d34b2070d77e875c430e635d9da114a506dd6882fb
|
7
|
+
data.tar.gz: 4b9672b379f9330b7537c35b88980de3405ac7d5294e3150af2814ac9049b8e9fb02a6f11b117cf533fc9ee6d20f85bc02b9b4d0ff99a46593e8e46077c41a41
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Netfira::WebConnect
|
2
|
+
class HashOfModels < Hash
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
super { |hash, key| hash[key] = [] }
|
6
|
+
end
|
7
|
+
|
8
|
+
def [](key)
|
9
|
+
super class_for_key(key)
|
10
|
+
end
|
11
|
+
|
12
|
+
def <<(value)
|
13
|
+
raise 'Only models are acceptable' unless Model === value
|
14
|
+
self[value.class] << value
|
15
|
+
end
|
16
|
+
|
17
|
+
def method_missing(sym, *args, &block)
|
18
|
+
if respond_to_missing? sym
|
19
|
+
klass = class_for_key(sym)
|
20
|
+
-> { self[klass] }.tap { |method| self.class.__send__ :define_method, sym, method }.call
|
21
|
+
else
|
22
|
+
super sym, *args, &block
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def respond_to_missing?(sym)
|
27
|
+
sym !~ /[^\w]/ && !!class_for_key(sym)
|
28
|
+
end
|
29
|
+
|
30
|
+
def as_json(options = nil)
|
31
|
+
map do |klass, records|
|
32
|
+
is_relation = klass < Model::Relation
|
33
|
+
[
|
34
|
+
klass.name.demodulize.to_sym,
|
35
|
+
records.map { |record| is_relation ? record.records.map(&:origin_id) : record.origin_id }
|
36
|
+
]
|
37
|
+
end.to_h
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def class_for_key(key)
|
43
|
+
return key if Class === key and key < Model
|
44
|
+
class_name = key.to_s.demodulize.camelize.singularize.to_sym
|
45
|
+
if Models.const_defined? class_name
|
46
|
+
klass = Models.const_get(class_name)
|
47
|
+
klass < Model and klass
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -4,10 +4,30 @@ module Netfira::WebConnect
|
|
4
4
|
@event_delegates ||= []
|
5
5
|
end
|
6
6
|
|
7
|
-
def self.dispatch_event(event, *args)
|
8
|
-
|
9
|
-
|
10
|
-
|
7
|
+
def self.dispatch_event(timing, event, *args)
|
8
|
+
|
9
|
+
# Allow multiple timings to be dispatched simultaneously, e.g. [:on, :after]
|
10
|
+
return timing.each{ |t| dispatch_event t, event, *args } if timing.respond_to? :each
|
11
|
+
|
12
|
+
# The method to invoke, e.g. :on_update_product
|
13
|
+
target = :"#{timing}_#{event}"
|
14
|
+
|
15
|
+
# Delegates that respond to this method
|
16
|
+
delegates = event_delegates.select { |d| d.respond_to? target }
|
17
|
+
|
18
|
+
# 'Around' events get special treatment
|
19
|
+
if timing == :around
|
20
|
+
chain_runner = -> do
|
21
|
+
delegate = delegates.shift
|
22
|
+
if delegate
|
23
|
+
delegate.__send__ target, *args, &chain_runner
|
24
|
+
else
|
25
|
+
yield
|
26
|
+
end
|
27
|
+
end
|
28
|
+
chain_runner.call
|
29
|
+
else
|
30
|
+
delegates.map { |d| d.__send__ target, *args }
|
11
31
|
end
|
12
32
|
end
|
13
33
|
|
@@ -5,7 +5,7 @@ module Netfira::WebConnect
|
|
5
5
|
|
6
6
|
included do
|
7
7
|
around_save :dispatch_create_or_update
|
8
|
-
|
8
|
+
around_destroy :dispatch_destroy
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
@@ -16,20 +16,37 @@ module Netfira::WebConnect
|
|
16
16
|
value = Checksum.new(value) if value and (key == 'checksum' or key == 'digest')
|
17
17
|
[key, value]
|
18
18
|
end.to_h
|
19
|
-
previous
|
20
|
-
|
19
|
+
event_name = previous ? 'update' : 'create'
|
20
|
+
event_args = [event_name, self]
|
21
|
+
named_event_args = ["#{event_name}_#{self.class.single_name}", self]
|
22
|
+
if previous
|
23
|
+
previous.merge! previous_translations if has_languages?
|
24
|
+
event_args << previous
|
25
|
+
named_event_args << previous
|
26
|
+
end
|
21
27
|
as_readonly do
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
28
|
+
dispatch_event :before, *named_event_args
|
29
|
+
dispatch_event :before, *event_args
|
30
|
+
dispatch_event :around, *named_event_args do
|
31
|
+
dispatch_event(:around, *event_args) { as_readwrite { yield } }
|
26
32
|
end
|
33
|
+
dispatch_event [:on, :after], *named_event_args
|
34
|
+
dispatch_event [:on, :after], *event_args
|
27
35
|
end
|
28
36
|
end
|
29
37
|
|
30
38
|
def dispatch_destroy
|
31
|
-
|
32
|
-
|
39
|
+
event_args = ['delete', self]
|
40
|
+
named_event_args = ["delete_#{self.class.single_name}", self]
|
41
|
+
as_readonly do
|
42
|
+
dispatch_event [:before, :on], *named_event_args
|
43
|
+
dispatch_event [:before, :on], *event_args
|
44
|
+
dispatch_event :around, *named_event_args do
|
45
|
+
dispatch_event(:around, *event_args) { as_readwrite { yield } }
|
46
|
+
end
|
47
|
+
dispatch_event :after, *named_event_args
|
48
|
+
dispatch_event :after, *event_args
|
49
|
+
end
|
33
50
|
end
|
34
51
|
|
35
52
|
end
|
@@ -10,7 +10,7 @@ module Netfira::WebConnect
|
|
10
10
|
wrong_shop: 'Tried to add a record from shop %s to shop %s'
|
11
11
|
}
|
12
12
|
prepare_relation(record, error_messages) do |relation_class, attrs|
|
13
|
-
relation_class.find_or_create_by
|
13
|
+
relation_class.with_deleted.find_or_create_by(attrs).tap { |x| x.restore! if x.destroyed? }
|
14
14
|
end
|
15
15
|
end
|
16
16
|
|
@@ -22,7 +22,7 @@ module Netfira::WebConnect
|
|
22
22
|
wrong_shop: 'Tried to remove a record of shop %s from shop %s'
|
23
23
|
}
|
24
24
|
prepare_relation(record, error_messages) do |relation_class, attrs|
|
25
|
-
relation_class.
|
25
|
+
relation_class.with_deleted.find_by(attrs).tap { |x| x.destroy! if x }
|
26
26
|
end
|
27
27
|
end
|
28
28
|
|
@@ -12,7 +12,11 @@ module Netfira::WebConnect
|
|
12
12
|
klass = Class.new(self)
|
13
13
|
Models.const_set "#{name_a}To#{name_b}", klass
|
14
14
|
klass.related_classes = [name_a, name_b].map{ |n| Models.const_get n.camelize.singularize }
|
15
|
-
|
15
|
+
if Netfira::WebConnect.paranoia?
|
16
|
+
klass.acts_as_paranoid
|
17
|
+
else
|
18
|
+
def klass.with_deleted; self end
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
def related_classes=(classes)
|
@@ -4,26 +4,36 @@ module Netfira::WebConnect
|
|
4
4
|
extend ActiveSupport::Concern
|
5
5
|
|
6
6
|
included do
|
7
|
-
|
8
|
-
|
7
|
+
around_save :dispatch_create
|
8
|
+
around_destroy :dispatch_destroy
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
13
|
def dispatch_create
|
14
|
-
dispatch_relation_event
|
14
|
+
dispatch_relation_event(:add, :to) { yield }
|
15
15
|
end
|
16
16
|
|
17
17
|
def dispatch_destroy
|
18
|
-
dispatch_relation_event
|
18
|
+
dispatch_relation_event(:remove, :from) { yield }
|
19
19
|
end
|
20
20
|
|
21
|
-
def dispatch_relation_event(
|
21
|
+
def dispatch_relation_event(action, preposition)
|
22
22
|
[records, records.reverse].each do |records|
|
23
|
-
event_name = (
|
23
|
+
event_name = ("#{action}_%s_#{preposition}_%s" % records.map{ |record| record.class.single_name }).to_sym
|
24
|
+
named_event_args = [event_name].concat(records)
|
25
|
+
event_args = [action].concat(records)
|
24
26
|
records[0].as_readonly do
|
25
27
|
records[1].as_readonly do
|
26
|
-
|
28
|
+
dispatch_event :before, *named_event_args
|
29
|
+
dispatch_event :before, *event_args
|
30
|
+
dispatch_event :around, *named_event_args do
|
31
|
+
dispatch_event :around, *event_args do
|
32
|
+
records[0].as_readwrite { records[1].as_readwrite { yield } }
|
33
|
+
end
|
34
|
+
end
|
35
|
+
dispatch_event [:on, :after], *named_event_args
|
36
|
+
dispatch_event [:on, :after], *event_args
|
27
37
|
end
|
28
38
|
end
|
29
39
|
end
|
@@ -42,14 +42,15 @@ module Netfira::WebConnect
|
|
42
42
|
old = persisted? ? cast_by_content_type(changed_attributes['value'], changed_attributes['content_type']) : nil
|
43
43
|
yield
|
44
44
|
new = OpenStruct.new(shop: shop, key: key, value: typed_value)
|
45
|
-
|
45
|
+
dispatch_event [:on, :after], 'change_setting', new, old unless old == new.value
|
46
46
|
end
|
47
47
|
|
48
48
|
def dispatch_destroy_event
|
49
49
|
return unless persisted?
|
50
50
|
new = OpenStruct.new(shop: shop, key: key, value: nil)
|
51
51
|
old = typed_value
|
52
|
-
|
52
|
+
dispatch_event [:before, :on], 'change_setting', new, old unless old.nil?
|
53
|
+
true
|
53
54
|
end
|
54
55
|
|
55
56
|
end
|
@@ -4,8 +4,13 @@ class Netfira::WebConnect::RackApp
|
|
4
4
|
|
5
5
|
def call
|
6
6
|
raise MethodNotAllowed unless verb == :put
|
7
|
-
|
8
|
-
|
7
|
+
dispatch_event :before, :commit, shop
|
8
|
+
dispatch_event :around, :commit, shop do
|
9
|
+
commit_records input['records'] if input['records']
|
10
|
+
commit_relations input['relations'] if input['relations']
|
11
|
+
[completed(:records), completed(:relations)]
|
12
|
+
end
|
13
|
+
dispatch_event [:on, :after], :commit, shop, completed(:records), completed(:relations)
|
9
14
|
{
|
10
15
|
complete: complete,
|
11
16
|
filesToSend: files_to_send
|
@@ -25,6 +30,10 @@ class Netfira::WebConnect::RackApp
|
|
25
30
|
}
|
26
31
|
end
|
27
32
|
|
33
|
+
def completed(type)
|
34
|
+
(@completed ||= {})[type] ||= Netfira::WebConnect::HashOfModels.new
|
35
|
+
end
|
36
|
+
|
28
37
|
end
|
29
38
|
end
|
30
39
|
end
|
@@ -8,8 +8,8 @@ class Netfira::WebConnect::RackApp
|
|
8
8
|
relations.each do |class_name, relation_sets|
|
9
9
|
klass = class_for_relation_type class_name.sub('&', 'To')
|
10
10
|
relation_sets.each do |relation|
|
11
|
-
update_relation
|
12
|
-
complete_relation class_name, relation
|
11
|
+
relation_model = update_relation(klass, relation)
|
12
|
+
complete_relation class_name, relation, relation_model
|
13
13
|
end
|
14
14
|
end
|
15
15
|
end
|
@@ -38,7 +38,8 @@ class Netfira::WebConnect::RackApp
|
|
38
38
|
records[0].unrelate records[1] if records.size == 2
|
39
39
|
end
|
40
40
|
|
41
|
-
def complete_relation(class_name, relation)
|
41
|
+
def complete_relation(class_name, relation, relation_model)
|
42
|
+
completed(:relations) << relation_model if relation_model
|
42
43
|
list = complete[:relations][class_name] ||= []
|
43
44
|
list << relation
|
44
45
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: web-connect
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Neil E. Pearson
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2014-08-
|
12
|
+
date: 2014-08-03 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: activerecord
|
@@ -124,6 +124,7 @@ files:
|
|
124
124
|
- lib/netfira/web_connect/components.rb
|
125
125
|
- lib/netfira/web_connect/components/checksum.rb
|
126
126
|
- lib/netfira/web_connect/components/guid.rb
|
127
|
+
- lib/netfira/web_connect/components/hash_of_models.rb
|
127
128
|
- lib/netfira/web_connect/components/octa_word.rb
|
128
129
|
- lib/netfira/web_connect/configuration.rb
|
129
130
|
- lib/netfira/web_connect/db_schema/20140514_support.rb
|