pakyow-ui 0.10.2 → 0.11.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/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
|