pakyow-ui 0.10.2 → 0.11.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/pakyow-ui/CHANGELOG.md +16 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/base.rb +0 -9
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/channel_builder.rb +3 -2
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/config.rb +4 -6
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/ext/app.rb +2 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/ext/view_context.rb +0 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/fetch_view_handler.rb +6 -5
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/helpers.rb +5 -1
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/mock_mutation_eval.rb +0 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/mutable.rb +0 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/mutable_data.rb +0 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/mutate_context.rb +2 -17
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/mutation_set.rb +0 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/mutation_store.rb +14 -3
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/mutator.rb +2 -2
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/no_op_view.rb +0 -0
- data/pakyow-ui/lib/pakyow/ui/registries/redis_mutation_registry.rb +70 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/registries/simple_mutation_registry.rb +8 -2
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/ui.rb +11 -13
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/ui_attrs.rb +0 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/ui_component.rb +0 -0
- data/pakyow-ui/lib/pakyow/ui/ui_context.rb +16 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/ui_instructable.rb +7 -2
- data/pakyow-ui/lib/pakyow/ui/ui_request.rb +14 -0
- data/pakyow-ui/lib/{pakyow-ui → pakyow/ui}/ui_view.rb +29 -8
- data/pakyow-ui/lib/pakyow/ui.rb +1 -0
- data/pakyow-ui/lib/pakyow-ui.rb +1 -1
- metadata +36 -35
- data/pakyow-ui/lib/pakyow-ui/ext/app_context.rb +0 -5
- data/pakyow-ui/lib/pakyow-ui/registries/redis_mutation_registry.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 24196ce0d24c1cadd2de47cf134537493f743080
|
4
|
+
data.tar.gz: 3507e7ff24e9590d2a02eec6282003f266f8d95a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1402d439bf007d90320dfc4e9d9dc0ac4991b6b0c9a446ea5c25f5c6f644c546319b786c0f97d05784d1ada9fa28cfc777bdc7e19a49f4de4bca48e852c86063
|
7
|
+
data.tar.gz: 01461b40f22477c6d65f310f63d4b2c15c4cc86a8612f1e79f47d968d2cb511e2502c5ef676c5cc0a2638cdb69574eb8fc03ef4293b6bb121a92830ac10b3cb4
|
data/pakyow-ui/CHANGELOG.md
CHANGED
@@ -1,3 +1,19 @@
|
|
1
|
+
# 0.11.0
|
2
|
+
|
3
|
+
* Mutators are now evaluated in a proper app context
|
4
|
+
* Helper methods can now be called inside of a mutator
|
5
|
+
* Sessions are now stored with mutations and available when the mutation is invoked after a state change
|
6
|
+
* Registered mutations are now unregistered when the WebSocket shuts down
|
7
|
+
* Qualification values are now typecasted to strings before comparison
|
8
|
+
* Removes code that inserts a node when subscribing an empty view
|
9
|
+
* Automatically returns the mutated view from the mutation
|
10
|
+
* Adds support for view versioning
|
11
|
+
* Allows mutables and mutations to have different scopes
|
12
|
+
* Moves everything into the Pakyow namespace
|
13
|
+
* Now sets `pakyow.socket` on request env when fetching view
|
14
|
+
* Fixes a bug determining qualifiers with non-array data
|
15
|
+
* No longer registers mutations registered on a socket request
|
16
|
+
|
1
17
|
# 0.10.0 / 2015-10-19
|
2
18
|
|
3
19
|
* Initial release
|
@@ -15,7 +15,6 @@ require_relative 'ui_component'
|
|
15
15
|
require_relative 'ui_instructable'
|
16
16
|
|
17
17
|
require_relative 'ext/app'
|
18
|
-
require_relative 'ext/app_context'
|
19
18
|
require_relative 'ext/view_context'
|
20
19
|
|
21
20
|
Pakyow::App.before :init do
|
@@ -25,11 +24,3 @@ end
|
|
25
24
|
Pakyow::App.after :load do
|
26
25
|
@ui.load(mutators, mutables)
|
27
26
|
end
|
28
|
-
|
29
|
-
Pakyow::App.before :route do
|
30
|
-
# setup a new ui context to work in
|
31
|
-
#
|
32
|
-
ui_dup = @ui.dup
|
33
|
-
ui_dup.context = self
|
34
|
-
@context.ui = ui_dup
|
35
|
-
end
|
@@ -34,12 +34,13 @@ module Pakyow
|
|
34
34
|
qualifiers = Array.ensure(qualifiers)
|
35
35
|
|
36
36
|
data = data.data if data.is_a?(Pakyow::UI::MutableData)
|
37
|
+
data = Array.ensure(data)
|
37
38
|
return if qualifiers.empty? || data.empty?
|
38
39
|
|
39
|
-
datum =
|
40
|
+
datum = data.first
|
40
41
|
|
41
42
|
qualifiers.each do |qualifier|
|
42
|
-
channel_extras << "#{qualifier}:#{datum[qualifier]}"
|
43
|
+
channel_extras << "#{qualifier}:#{datum[qualifier.to_sym]}"
|
43
44
|
end
|
44
45
|
end
|
45
46
|
|
@@ -1,13 +1,11 @@
|
|
1
1
|
require_relative 'registries/simple_mutation_registry'
|
2
2
|
require_relative 'registries/redis_mutation_registry'
|
3
3
|
|
4
|
-
Pakyow::Config.register
|
4
|
+
Pakyow::Config.register :ui do |config|
|
5
5
|
# The registry to use when keeping up with connections.
|
6
6
|
config.opt :registry, Pakyow::UI::SimpleMutationRegistry
|
7
|
-
|
7
|
+
end.env :development do |opts|
|
8
8
|
opts.registry = Pakyow::UI::SimpleMutationRegistry
|
9
|
-
|
9
|
+
end.env :production do |opts|
|
10
10
|
opts.registry = Pakyow::UI::RedisMutationRegistry
|
11
|
-
|
12
|
-
opts.registry = Pakyow::UI::RedisMutationRegistry
|
13
|
-
}
|
11
|
+
end
|
File without changes
|
@@ -20,22 +20,23 @@ require_relative 'no_op_view'
|
|
20
20
|
#
|
21
21
|
Pakyow::Realtime.handler :'fetch-view' do |message, session, response|
|
22
22
|
env = Rack::MockRequest.env_for(message['uri'])
|
23
|
+
env['pakyow.socket'] = true
|
23
24
|
env['rack.session'] = session
|
24
25
|
|
25
|
-
|
26
|
+
context = Pakyow::CallContext.new(env)
|
26
27
|
|
27
|
-
def
|
28
|
+
def context.view
|
28
29
|
Pakyow::Presenter::NoOpView.new(
|
29
30
|
Pakyow::Presenter::ViewContext.new(@presenter.view, self),
|
30
31
|
self
|
31
32
|
)
|
32
33
|
end
|
33
34
|
|
34
|
-
app_response =
|
35
|
+
app_response = context.process.finish
|
35
36
|
|
36
37
|
body = ''
|
37
38
|
lookup = message['lookup']
|
38
|
-
view =
|
39
|
+
view = context.presenter.view
|
39
40
|
|
40
41
|
channel = lookup['channel']
|
41
42
|
|
@@ -54,7 +55,7 @@ Pakyow::Realtime.handler :'fetch-view' do |message, session, response|
|
|
54
55
|
end
|
55
56
|
|
56
57
|
if view.is_a?(Pakyow::Presenter::ViewVersion)
|
57
|
-
body = view.use(lookup['version'] || :default).to_html
|
58
|
+
body = view.use((lookup['version'] || :default).to_sym).to_html
|
58
59
|
else
|
59
60
|
body = view.to_html
|
60
61
|
end
|
File without changes
|
File without changes
|
File without changes
|
@@ -35,8 +35,8 @@ module Pakyow
|
|
35
35
|
#
|
36
36
|
# @api public
|
37
37
|
def subscribe(qualifications = {})
|
38
|
-
if data.is_a?(MutableData)
|
39
|
-
MutationStore.instance.register(self, data, qualifications)
|
38
|
+
if data.is_a?(MutableData) && !view.context.request.env['pakyow.socket']
|
39
|
+
MutationStore.instance.register(self, view, data, qualifications, view.context.request.session)
|
40
40
|
end
|
41
41
|
|
42
42
|
channel = ChannelBuilder.build(
|
@@ -57,21 +57,6 @@ module Pakyow
|
|
57
57
|
working_view = view
|
58
58
|
end
|
59
59
|
|
60
|
-
if working_view.is_a?(Presenter::ViewCollection)
|
61
|
-
# NOTE there's a special case here where if the collection is
|
62
|
-
# empty we insert an empty element in its place; this makes
|
63
|
-
# it possible to know what the data should be applied to when
|
64
|
-
# a mutation occurs in the future
|
65
|
-
|
66
|
-
unless working_view.exists?
|
67
|
-
# TODO: would rather this be an html comment, but they aren't
|
68
|
-
# supported by query selectors; need to finalize how we will
|
69
|
-
# handle this particular edge case
|
70
|
-
working_view.first.doc.append('<span data-channel="' + channel + '" data-version="empty"></span>')
|
71
|
-
return
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
60
|
working_view.attrs.send(:'data-channel=', channel)
|
76
61
|
end
|
77
62
|
end
|
File without changes
|
@@ -10,21 +10,32 @@ module Pakyow
|
|
10
10
|
@registry = Config.ui.registry.instance
|
11
11
|
end
|
12
12
|
|
13
|
-
def register(mutate_context, mutable_data, qualifications)
|
14
|
-
# TODO: decide how we'll clean these up as clients disconnect
|
13
|
+
def register(mutate_context, view, mutable_data, qualifications, session)
|
15
14
|
@registry.register(
|
16
15
|
mutable_data.scope,
|
16
|
+
|
17
|
+
view_scope: view.scoped_as,
|
17
18
|
mutation: mutate_context.mutation[:name],
|
18
19
|
qualifiers: mutate_context.mutation[:qualifiers],
|
19
20
|
qualifications: qualifications,
|
20
21
|
query_name: mutable_data.query_name,
|
21
|
-
query_args: mutable_data.query_args
|
22
|
+
query_args: mutable_data.query_args,
|
23
|
+
session: session.to_h,
|
24
|
+
socket_key: mutate_context.view.context.socket_digest(mutate_context.view.context.socket_connection_id)
|
22
25
|
)
|
23
26
|
end
|
24
27
|
|
28
|
+
def unregister(socket_key)
|
29
|
+
@registry.unregister(socket_key)
|
30
|
+
end
|
31
|
+
|
25
32
|
def mutations(scope)
|
26
33
|
@registry.mutations(scope) || []
|
27
34
|
end
|
28
35
|
end
|
29
36
|
end
|
30
37
|
end
|
38
|
+
|
39
|
+
Pakyow::Realtime::Websocket.on :leave do
|
40
|
+
Pakyow::UI::MutationStore.instance.unregister(socket_digest(socket_connection_id))
|
41
|
+
end
|
@@ -54,8 +54,8 @@ module Pakyow
|
|
54
54
|
working_data = data
|
55
55
|
end
|
56
56
|
|
57
|
-
|
58
|
-
MutateContext.new(mutation,
|
57
|
+
view.instance_exec(view, working_data, &mutation[:fn])
|
58
|
+
MutateContext.new(mutation, view, data)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
end
|
File without changes
|
@@ -0,0 +1,70 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module Pakyow
|
4
|
+
module UI
|
5
|
+
# Manages mutations.
|
6
|
+
#
|
7
|
+
# This is the default registry in production systems and is required in
|
8
|
+
# deployments with more than one app instance.
|
9
|
+
#
|
10
|
+
# @api private
|
11
|
+
class RedisMutationRegistry
|
12
|
+
include Singleton
|
13
|
+
|
14
|
+
def initialize
|
15
|
+
end
|
16
|
+
|
17
|
+
def register(scope, mutation)
|
18
|
+
Pakyow::Realtime.redis.sadd(key(scope: scope, socket_key: mutation[:socket_key]), mutation.to_json)
|
19
|
+
end
|
20
|
+
|
21
|
+
def mutations(scope)
|
22
|
+
mutations = []
|
23
|
+
|
24
|
+
keys(key(scope: scope)) do |key|
|
25
|
+
Pakyow::Realtime.redis.smembers(key).each do |m|
|
26
|
+
mutations << Hash.strhash(JSON.parse(m))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
mutations
|
31
|
+
end
|
32
|
+
|
33
|
+
def unregister(socket_key)
|
34
|
+
keys(key(socket_key: socket_key)) do |key|
|
35
|
+
Pakyow::Realtime.redis.del(key)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def key(scope: nil, socket_key: nil)
|
42
|
+
if socket_key.nil?
|
43
|
+
base = "*:"
|
44
|
+
else
|
45
|
+
base = "#{socket_key}:"
|
46
|
+
end
|
47
|
+
|
48
|
+
if scope.nil?
|
49
|
+
"#{base}*"
|
50
|
+
else
|
51
|
+
"#{base}pui-mutation-#{scope}"
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def keys(match)
|
56
|
+
cursor = 0
|
57
|
+
|
58
|
+
loop do
|
59
|
+
cursor, keys = Pakyow::Realtime.redis.scan(cursor, match: match)
|
60
|
+
|
61
|
+
keys.each do |key|
|
62
|
+
yield key
|
63
|
+
end
|
64
|
+
|
65
|
+
break if cursor == '0'
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
@@ -18,11 +18,17 @@ module Pakyow
|
|
18
18
|
|
19
19
|
def register(scope, mutation)
|
20
20
|
@mutations[scope] ||= []
|
21
|
-
|
22
|
-
return if @mutations[scope].include?(mutation)
|
23
21
|
@mutations[scope] << mutation
|
24
22
|
end
|
25
23
|
|
24
|
+
def unregister(socket_key)
|
25
|
+
@mutations.each do |_, mutations|
|
26
|
+
mutations.delete_if { |mutation|
|
27
|
+
mutation[:socket_key] == socket_key
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
26
32
|
def mutations(scope)
|
27
33
|
@mutations[scope]
|
28
34
|
end
|
@@ -19,14 +19,14 @@ module Pakyow
|
|
19
19
|
context ||= @context
|
20
20
|
|
21
21
|
MutationStore.instance.mutations(scope).each do |mutation|
|
22
|
-
view = UIView.new(
|
22
|
+
view = UIView.new(mutation[:view_scope], mutation[:session])
|
23
23
|
|
24
24
|
qualified = true
|
25
25
|
|
26
26
|
# qualifiers are defined with the mutation
|
27
27
|
unless mutation[:qualifiers].empty? || data.nil?
|
28
28
|
mutation[:qualifiers].each_with_index do |qualifier, i|
|
29
|
-
qualified = false unless data[qualifier] == mutation[:query_args][i]
|
29
|
+
qualified = false unless data[qualifier.to_sym].to_s == mutation[:query_args][i].to_s
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
@@ -35,7 +35,7 @@ module Pakyow
|
|
35
35
|
# qualifications are set on the subscription
|
36
36
|
unless !qualified || mutation[:qualifications].empty? || data.nil?
|
37
37
|
mutation[:qualifications].each_pair do |key, value|
|
38
|
-
qualified = false
|
38
|
+
qualified = false if data[key.to_sym].to_s != value.to_s
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
@@ -44,17 +44,15 @@ module Pakyow
|
|
44
44
|
mutable_data = Mutator.instance.mutable(scope, context).send(mutation[:query_name], *mutation[:query_args]).data
|
45
45
|
Mutator.instance.mutate(mutation[:mutation].to_sym, view, mutable_data)
|
46
46
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
qualifiers: mutation[:qualifiers],
|
54
|
-
data: mutable_data,
|
55
|
-
qualifications: mutation[:qualifications]
|
56
|
-
)
|
47
|
+
channel = ChannelBuilder.build(
|
48
|
+
scope: mutation[:view_scope],
|
49
|
+
mutation: mutation[:mutation].to_sym,
|
50
|
+
qualifiers: mutation[:qualifiers],
|
51
|
+
data: mutable_data,
|
52
|
+
qualifications: mutation[:qualifications]
|
57
53
|
)
|
54
|
+
|
55
|
+
Pakyow.app.socket.push_message_to_socket_with_key(view.finalize, channel, mutation[:socket_key])
|
58
56
|
end
|
59
57
|
end
|
60
58
|
|
File without changes
|
File without changes
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Pakyow
|
2
|
+
module UI
|
3
|
+
# A simple context object used for accessing the session.
|
4
|
+
#
|
5
|
+
# @api private
|
6
|
+
class UIContext
|
7
|
+
def initialize(session)
|
8
|
+
@session = session
|
9
|
+
end
|
10
|
+
|
11
|
+
def request
|
12
|
+
UIRequest.new(@session)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -58,7 +58,7 @@ module Pakyow
|
|
58
58
|
|
59
59
|
def mixin_bindings(data, bindings = {})
|
60
60
|
data.map { |bindable|
|
61
|
-
datum = bindable.to_hash
|
61
|
+
datum = bindable.to_hash.dup
|
62
62
|
Pakyow::Presenter::Binder.instance.bindings_for_scope(scoped_as, bindings).keys.each do |key|
|
63
63
|
result = Pakyow::Presenter::Binder.instance.value_for_scoped_prop(scoped_as, key, bindable, bindings, self)
|
64
64
|
|
@@ -67,8 +67,13 @@ module Pakyow
|
|
67
67
|
# TODO: look into what it would take to support this
|
68
68
|
result.delete(:view)
|
69
69
|
|
70
|
+
content = result.delete(:content)
|
71
|
+
if content.respond_to?(:to_proc)
|
72
|
+
content = content.to_proc.call()
|
73
|
+
end
|
74
|
+
|
70
75
|
datum[key] = {
|
71
|
-
__content:
|
76
|
+
__content: content,
|
72
77
|
__attrs: Hash[*result.flat_map { |k, v|
|
73
78
|
if v.respond_to?(:to_proc)
|
74
79
|
attrs = UIAttrs.new
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require_relative 'ui_attrs'
|
2
2
|
require_relative 'ui_instructable'
|
3
|
+
require_relative 'ui_context'
|
4
|
+
require_relative 'ui_request'
|
3
5
|
|
4
6
|
module Pakyow
|
5
7
|
module UI
|
@@ -8,14 +10,17 @@ module Pakyow
|
|
8
10
|
# @api private
|
9
11
|
class UIView
|
10
12
|
include Instructable
|
13
|
+
include Pakyow::Helpers
|
11
14
|
|
12
|
-
def initialize(scope)
|
15
|
+
def initialize(scope, session = {})
|
13
16
|
super()
|
14
|
-
@scope = scope
|
17
|
+
@scope = scope.to_sym
|
18
|
+
@session = session
|
19
|
+
@context = UIContext.new(session)
|
15
20
|
end
|
16
21
|
|
17
22
|
def nested_instruct_object(_method, _data, scope)
|
18
|
-
UIView.new(scope || @scope)
|
23
|
+
UIView.new(scope || @scope, @session)
|
19
24
|
end
|
20
25
|
|
21
26
|
def scoped_as
|
@@ -50,6 +55,7 @@ module Pakyow
|
|
50
55
|
after
|
51
56
|
before
|
52
57
|
replace
|
58
|
+
use
|
53
59
|
).each do |method|
|
54
60
|
define_method method do |value|
|
55
61
|
instruct(method, value.to_s)
|
@@ -93,6 +99,23 @@ module Pakyow
|
|
93
99
|
|
94
100
|
### view methods that continue into a new context
|
95
101
|
|
102
|
+
def version(data, &block)
|
103
|
+
nested = nested_instruct(:version, data)
|
104
|
+
Array.ensure(data).each do |datum|
|
105
|
+
sub = UIView.new(@scope)
|
106
|
+
|
107
|
+
if block.arity == 1
|
108
|
+
sub.instance_exec(datum, &block)
|
109
|
+
else
|
110
|
+
block.call(sub, datum)
|
111
|
+
end
|
112
|
+
|
113
|
+
nested.instructions << sub.finalize
|
114
|
+
end
|
115
|
+
|
116
|
+
self
|
117
|
+
end
|
118
|
+
|
96
119
|
def for(data, &block)
|
97
120
|
nested = nested_instruct(:for, data)
|
98
121
|
Array.ensure(data).each do |datum|
|
@@ -134,8 +157,7 @@ module Pakyow
|
|
134
157
|
def bind(data, bindings: {}, context: nil, &block)
|
135
158
|
# TODO: handle context?
|
136
159
|
|
137
|
-
|
138
|
-
nested = nested_instruct(:bind, data)
|
160
|
+
nested = nested_instruct(:bind, mixin_bindings(Array.ensure(data), bindings))
|
139
161
|
return self unless block_given?
|
140
162
|
|
141
163
|
data.each do |datum|
|
@@ -158,12 +180,11 @@ module Pakyow
|
|
158
180
|
def apply(data, bindings: {}, context: nil, &block)
|
159
181
|
# TODO: handle context?
|
160
182
|
|
161
|
-
|
162
|
-
nested = nested_instruct(:apply, data)
|
183
|
+
nested = nested_instruct(:apply, mixin_bindings(Array.ensure(data), bindings))
|
163
184
|
return self unless block_given?
|
164
185
|
|
165
186
|
data.each do |datum|
|
166
|
-
sub = UIView.new(@scope)
|
187
|
+
sub = UIView.new(@scope, @session)
|
167
188
|
|
168
189
|
if block.arity == 1
|
169
190
|
sub.instance_exec(datum, &block)
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'pakyow/ui/base'
|
data/pakyow-ui/lib/pakyow-ui.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
require 'pakyow/ui'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pakyow-ui
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.11.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Bryan Powell
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-04-21 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pakyow-support
|
@@ -16,56 +16,56 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - '='
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.
|
19
|
+
version: 0.11.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - '='
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.
|
26
|
+
version: 0.11.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: pakyow-core
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - '='
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 0.
|
33
|
+
version: 0.11.0
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - '='
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: 0.
|
40
|
+
version: 0.11.0
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: pakyow-presenter
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
45
|
- - '='
|
46
46
|
- !ruby/object:Gem::Version
|
47
|
-
version: 0.
|
47
|
+
version: 0.11.0
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
52
|
- - '='
|
53
53
|
- !ruby/object:Gem::Version
|
54
|
-
version: 0.
|
54
|
+
version: 0.11.0
|
55
55
|
- !ruby/object:Gem::Dependency
|
56
56
|
name: pakyow-realtime
|
57
57
|
requirement: !ruby/object:Gem::Requirement
|
58
58
|
requirements:
|
59
59
|
- - '='
|
60
60
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
61
|
+
version: 0.11.0
|
62
62
|
type: :runtime
|
63
63
|
prerelease: false
|
64
64
|
version_requirements: !ruby/object:Gem::Requirement
|
65
65
|
requirements:
|
66
66
|
- - '='
|
67
67
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
68
|
+
version: 0.11.0
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
70
|
name: minitest
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -104,29 +104,31 @@ files:
|
|
104
104
|
- pakyow-ui/LICENSE
|
105
105
|
- pakyow-ui/README.md
|
106
106
|
- pakyow-ui/lib/pakyow-ui.rb
|
107
|
-
- pakyow-ui/lib/pakyow
|
108
|
-
- pakyow-ui/lib/pakyow
|
109
|
-
- pakyow-ui/lib/pakyow
|
110
|
-
- pakyow-ui/lib/pakyow
|
111
|
-
- pakyow-ui/lib/pakyow
|
112
|
-
- pakyow-ui/lib/pakyow
|
113
|
-
- pakyow-ui/lib/pakyow
|
114
|
-
- pakyow-ui/lib/pakyow
|
115
|
-
- pakyow-ui/lib/pakyow
|
116
|
-
- pakyow-ui/lib/pakyow
|
117
|
-
- pakyow-ui/lib/pakyow
|
118
|
-
- pakyow-ui/lib/pakyow
|
119
|
-
- pakyow-ui/lib/pakyow
|
120
|
-
- pakyow-ui/lib/pakyow
|
121
|
-
- pakyow-ui/lib/pakyow
|
122
|
-
- pakyow-ui/lib/pakyow
|
123
|
-
- pakyow-ui/lib/pakyow
|
124
|
-
- pakyow-ui/lib/pakyow
|
125
|
-
- pakyow-ui/lib/pakyow
|
126
|
-
- pakyow-ui/lib/pakyow
|
127
|
-
- pakyow-ui/lib/pakyow
|
128
|
-
- pakyow-ui/lib/pakyow
|
129
|
-
- pakyow-ui/lib/pakyow
|
107
|
+
- pakyow-ui/lib/pakyow/ui.rb
|
108
|
+
- pakyow-ui/lib/pakyow/ui/base.rb
|
109
|
+
- pakyow-ui/lib/pakyow/ui/channel_builder.rb
|
110
|
+
- pakyow-ui/lib/pakyow/ui/config.rb
|
111
|
+
- pakyow-ui/lib/pakyow/ui/ext/app.rb
|
112
|
+
- pakyow-ui/lib/pakyow/ui/ext/view_context.rb
|
113
|
+
- pakyow-ui/lib/pakyow/ui/fetch_view_handler.rb
|
114
|
+
- pakyow-ui/lib/pakyow/ui/helpers.rb
|
115
|
+
- pakyow-ui/lib/pakyow/ui/mock_mutation_eval.rb
|
116
|
+
- pakyow-ui/lib/pakyow/ui/mutable.rb
|
117
|
+
- pakyow-ui/lib/pakyow/ui/mutable_data.rb
|
118
|
+
- pakyow-ui/lib/pakyow/ui/mutate_context.rb
|
119
|
+
- pakyow-ui/lib/pakyow/ui/mutation_set.rb
|
120
|
+
- pakyow-ui/lib/pakyow/ui/mutation_store.rb
|
121
|
+
- pakyow-ui/lib/pakyow/ui/mutator.rb
|
122
|
+
- pakyow-ui/lib/pakyow/ui/no_op_view.rb
|
123
|
+
- pakyow-ui/lib/pakyow/ui/registries/redis_mutation_registry.rb
|
124
|
+
- pakyow-ui/lib/pakyow/ui/registries/simple_mutation_registry.rb
|
125
|
+
- pakyow-ui/lib/pakyow/ui/ui.rb
|
126
|
+
- pakyow-ui/lib/pakyow/ui/ui_attrs.rb
|
127
|
+
- pakyow-ui/lib/pakyow/ui/ui_component.rb
|
128
|
+
- pakyow-ui/lib/pakyow/ui/ui_context.rb
|
129
|
+
- pakyow-ui/lib/pakyow/ui/ui_instructable.rb
|
130
|
+
- pakyow-ui/lib/pakyow/ui/ui_request.rb
|
131
|
+
- pakyow-ui/lib/pakyow/ui/ui_view.rb
|
130
132
|
homepage: http://pakyow.org
|
131
133
|
licenses:
|
132
134
|
- MIT
|
@@ -147,9 +149,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
147
149
|
version: '0'
|
148
150
|
requirements: []
|
149
151
|
rubyforge_project:
|
150
|
-
rubygems_version: 2.
|
152
|
+
rubygems_version: 2.5.1
|
151
153
|
signing_key:
|
152
154
|
specification_version: 4
|
153
155
|
summary: Pakyow UI
|
154
156
|
test_files: []
|
155
|
-
has_rdoc:
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'json'
|
2
|
-
|
3
|
-
module Pakyow
|
4
|
-
module UI
|
5
|
-
# Manages mutations.
|
6
|
-
#
|
7
|
-
# This is the default registry in production systems and is required in
|
8
|
-
# deployments with more than one app instance.
|
9
|
-
#
|
10
|
-
# @api private
|
11
|
-
class RedisMutationRegistry
|
12
|
-
include Singleton
|
13
|
-
|
14
|
-
def initialize
|
15
|
-
end
|
16
|
-
|
17
|
-
def register(scope, mutation)
|
18
|
-
Pakyow::Realtime.redis.sadd(key(scope), mutation.to_json)
|
19
|
-
end
|
20
|
-
|
21
|
-
def mutations(scope)
|
22
|
-
Pakyow::Realtime.redis.smembers(key(scope)).map do |m|
|
23
|
-
Hash.strhash(JSON.parse(m))
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def key(scope)
|
30
|
-
"pui-mutation-#{scope}"
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|