fie 0.2.0pa → 0.2.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/README.md +3 -2
- data/lib/fie.rb +1 -0
- data/lib/fie/commander.rb +22 -10
- data/lib/fie/pools.rb +2 -3
- data/lib/fie/state.rb +4 -4
- data/lib/fie/state/changelog.rb +3 -3
- data/lib/fie/version.rb +1 -1
- data/lib/layouts/fie.html.erb +2 -2
- data/spec/fie/changelog_spec.rb +76 -0
- data/spec/fie/commander_spec.rb +198 -2
- data/spec/fie/pools_spec.rb +62 -0
- data/spec/fie/state_spec.rb +23 -9
- data/spec/rails_helper.rb +5 -0
- data/spec/support/helper_methods.rb +3 -3
- metadata +68 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7c87d695d7cd5206d5dee85232552bf7f624b5db
|
4
|
+
data.tar.gz: 97648f74d8dca1744483ecdb16fe552af3ebcdf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6dc2b0185bcd909e5776be527fa076388c92d8cea891d91c4bb26d8c9c18aa2f105f2bb00053b64b770d191b37a1ccd082c6a0caaa7792062efa38841bb85a4f
|
7
|
+
data.tar.gz: 38030add9ee2db0cda45bdecf529aa3935d1dc9969d09a762d002600b110ec019d1ac1bf4ebc663116c87cdfe968efdc2206fe330f9bea449266841673ebb9d1
|
data/README.md
CHANGED
@@ -2,7 +2,8 @@
|
|
2
2
|
|
3
3
|
[](https://badge.fury.io/rb/fie)
|
4
4
|
[](https://travis-ci.org/raen79/fie)
|
5
|
-
[](https://codeclimate.com/github/raen79/fie/maintainability)
|
6
|
+
[](https://coveralls.io/github/raen79/fie?branch=master)
|
6
7
|
[](https://gitter.im/rails-fie/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
7
8
|
[](https://beerpay.io/raen79/fie)
|
8
9
|
|
@@ -20,7 +21,7 @@ fie therefore replaces traditional Javascript frontend frameworks while requirin
|
|
20
21
|
|
21
22
|
1. Add the gem to your gemfile like so:
|
22
23
|
```ruby
|
23
|
-
gem 'fie', '~> 0.
|
24
|
+
gem 'fie', '~> 0.2.0'
|
24
25
|
```
|
25
26
|
2. Run the bundler
|
26
27
|
```bash
|
data/lib/fie.rb
CHANGED
data/lib/fie/commander.rb
CHANGED
@@ -33,7 +33,7 @@ module Fie
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def publish(subject, object)
|
36
|
-
Fie::Pools.publish_lazy(subject, object,
|
36
|
+
Fie::Pools.publish_lazy(subject, object, params[:identifier])
|
37
37
|
end
|
38
38
|
|
39
39
|
def state
|
@@ -63,12 +63,20 @@ module Fie
|
|
63
63
|
$redis ||= Redis.new
|
64
64
|
end
|
65
65
|
|
66
|
+
def method_keywords_hash(method_name, params)
|
67
|
+
method(method_name).parameters.map do |_, parameter_name|
|
68
|
+
[parameter_name, params[parameter_name.to_s]]
|
69
|
+
end.to_h
|
70
|
+
end
|
71
|
+
|
66
72
|
class << self
|
67
73
|
def pool(subject, &block)
|
68
74
|
@@pools_subjects.add(subject)
|
69
75
|
|
70
76
|
pool_name = Fie::Pools.pool_name(subject)
|
71
|
-
define_method("#{ pool_name }_callback") do |object:, sender_uuid
|
77
|
+
define_method("#{ pool_name }_callback") do |object:, sender_uuid: nil, lazy: false|
|
78
|
+
@connection_uuid = self.params['identifier']
|
79
|
+
|
72
80
|
unless @connection_uuid == sender_uuid
|
73
81
|
@published_object = Marshal.load(object)
|
74
82
|
instance_eval(&block)
|
@@ -81,7 +89,7 @@ module Fie
|
|
81
89
|
end
|
82
90
|
|
83
91
|
def commander_name(connection_uuid)
|
84
|
-
"commander_#{connection_uuid}"
|
92
|
+
"commander_#{ connection_uuid }"
|
85
93
|
end
|
86
94
|
|
87
95
|
def method_added(name)
|
@@ -107,11 +115,14 @@ module Fie
|
|
107
115
|
end
|
108
116
|
|
109
117
|
private
|
110
|
-
def restructure_subclass_method_parameters(
|
111
|
-
alias_method("sub_#{
|
112
|
-
remove_method(
|
113
|
-
define_method(
|
114
|
-
|
118
|
+
def restructure_subclass_method_parameters(method_name)
|
119
|
+
alias_method("sub_#{ method_name }", method_name)
|
120
|
+
remove_method(method_name)
|
121
|
+
define_method(method_name) do |params|
|
122
|
+
if caller = params['caller']
|
123
|
+
@caller = { value: caller['value'], id: caller['id'], class: caller['class'] }
|
124
|
+
end
|
125
|
+
|
115
126
|
@controller_name = params['controller_name']
|
116
127
|
@action_name = params['action_name']
|
117
128
|
@connection_uuid = self.params['identifier']
|
@@ -119,9 +130,10 @@ module Fie
|
|
119
130
|
['caller', 'action', 'controller_name', 'action_name'].each { |param| params.delete param }
|
120
131
|
|
121
132
|
if params.blank?
|
122
|
-
self.send(:"sub_#{
|
133
|
+
self.send(:"sub_#{ method_name }")
|
123
134
|
else
|
124
|
-
|
135
|
+
method_keywords_hash = method_keywords_hash(:"sub_#{ method_name }", params)
|
136
|
+
self.send(:"sub_#{ method_name }", method_keywords_hash)
|
125
137
|
end
|
126
138
|
end
|
127
139
|
end
|
data/lib/fie/pools.rb
CHANGED
@@ -6,7 +6,7 @@ module Fie
|
|
6
6
|
|
7
7
|
class << self
|
8
8
|
def pool_name(subject)
|
9
|
-
"pool_#{subject}"
|
9
|
+
"pool_#{ subject }"
|
10
10
|
end
|
11
11
|
|
12
12
|
def publish_lazy(subject, object, sender_uuid)
|
@@ -15,8 +15,7 @@ module Fie
|
|
15
15
|
command: 'publish_to_pool_lazy',
|
16
16
|
parameters: {
|
17
17
|
subject: subject,
|
18
|
-
object: Marshal.dump(object)
|
19
|
-
sender_uuid: nil
|
18
|
+
object: Marshal.dump(object)
|
20
19
|
}
|
21
20
|
end
|
22
21
|
|
data/lib/fie/state.rb
CHANGED
@@ -37,16 +37,16 @@ module Fie
|
|
37
37
|
|
38
38
|
def inspect
|
39
39
|
object_reference = self.to_s
|
40
|
-
pretty_print = "\e[0;33m#{object_reference[0..-2]}\e[0m "
|
40
|
+
pretty_print = "\e[0;33m#{ object_reference[0..-2] }\e[0m "
|
41
41
|
|
42
42
|
attributes.each do |name, value|
|
43
43
|
if value.is_a? String
|
44
|
-
value = "\e[0;31m#{value.inspect}\e[0m"
|
44
|
+
value = "\e[0;31m#{ value.inspect }\e[0m"
|
45
45
|
else
|
46
|
-
value = "\e[1;34m#{value.inspect}\e[0m"
|
46
|
+
value = "\e[1;34m#{ value.inspect }\e[0m"
|
47
47
|
end
|
48
48
|
|
49
|
-
pretty_print += "\n #{name}: #{value}"
|
49
|
+
pretty_print += "\n #{ name }: #{ value }"
|
50
50
|
end
|
51
51
|
|
52
52
|
pretty_print += '>'
|
data/lib/fie/state/changelog.rb
CHANGED
@@ -15,7 +15,7 @@ module Fie
|
|
15
15
|
else
|
16
16
|
update_object_value \
|
17
17
|
object: object,
|
18
|
-
node_name:node_name,
|
18
|
+
node_name: node_name,
|
19
19
|
value: changelog_node
|
20
20
|
end
|
21
21
|
end
|
@@ -35,7 +35,7 @@ module Fie
|
|
35
35
|
object_node = object[node_name]
|
36
36
|
elsif symbol_in_hash
|
37
37
|
object_node = object[node_name.to_sym]
|
38
|
-
end
|
38
|
+
end
|
39
39
|
else
|
40
40
|
object_node = object.send(node_name)
|
41
41
|
end
|
@@ -45,7 +45,7 @@ module Fie
|
|
45
45
|
|
46
46
|
def update_object_value(object:, node_name:, value:)
|
47
47
|
if object.is_a?(Array)
|
48
|
-
node_name = node_name.to_i
|
48
|
+
node_name = node_name.to_i
|
49
49
|
object[node_name] = value
|
50
50
|
elsif object.is_a?(Hash)
|
51
51
|
string_in_hash = object.keys.include? node_name
|
data/lib/fie/version.rb
CHANGED
data/lib/layouts/fie.html.erb
CHANGED
@@ -1,8 +1,8 @@
|
|
1
1
|
<span fie-body='true'>
|
2
2
|
<%= yield %>
|
3
3
|
|
4
|
-
<% assigns.
|
5
|
-
<% unless assigns_value.
|
4
|
+
<% assigns.map do |assigns_name, assigns_value| %>
|
5
|
+
<% unless assigns_value.nil? || assigns_name == :marked_for_same_origin_verification %>
|
6
6
|
<% encryptor = ActiveSupport::MessageEncryptor.new Rails.application.credentials[:secret_key_base] %>
|
7
7
|
<span fie-variable='<%= assigns_name %>' fie-value='<%= encryptor.encrypt_and_sign Marshal.dump(assigns_value) %>'></span>
|
8
8
|
<% end %>
|
@@ -0,0 +1,76 @@
|
|
1
|
+
RSpec.describe Fie::Changelog do
|
2
|
+
before do
|
3
|
+
credentials = {
|
4
|
+
secret_key_base: 'c2c3f440e947a5592acaad052e756d87dd8db717275ef14ac794a3c2a07cbdaec8aa0df7a090c1bc83833736ee3f5209affe55639845871081d48598d57de3f7'
|
5
|
+
}
|
6
|
+
|
7
|
+
allow(Rails.application).to receive(:credentials) { credentials }
|
8
|
+
|
9
|
+
@unencrypted_variables = {
|
10
|
+
users: [
|
11
|
+
{ name: 'eran', age: '20' },
|
12
|
+
User.new(name: 'eran', age: '20'),
|
13
|
+
'120'
|
14
|
+
],
|
15
|
+
primitive: '120',
|
16
|
+
'hash' => {
|
17
|
+
array: [1, 2, 3],
|
18
|
+
primitive: '120'
|
19
|
+
}
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
let(:view_variables) do
|
24
|
+
@unencrypted_variables.map do |key, value|
|
25
|
+
[key, encrypt(value)]
|
26
|
+
end.to_h
|
27
|
+
end
|
28
|
+
|
29
|
+
let(:controller_name) { 'home_controller' }
|
30
|
+
let(:action_name) { 'index' }
|
31
|
+
let(:uuid) { SecureRandom.uuid }
|
32
|
+
let(:attributes) { nil }
|
33
|
+
|
34
|
+
let(:state) do
|
35
|
+
Fie::State.new \
|
36
|
+
view_variables: view_variables,
|
37
|
+
controller_name: controller_name,
|
38
|
+
action_name: action_name,
|
39
|
+
uuid: uuid,
|
40
|
+
attributes: attributes
|
41
|
+
end
|
42
|
+
|
43
|
+
context "when view_variables == #{ @unencrypted_variables.to_json }" do
|
44
|
+
describe '#update_object_using_changelog' do
|
45
|
+
subject { state.update_object_using_changelog(changelog) }
|
46
|
+
|
47
|
+
context 'when changelog == { "users" => { 0 => { "name" => "New Name" } } }' do
|
48
|
+
let(:changelog) do
|
49
|
+
{
|
50
|
+
'users' => {
|
51
|
+
0 => {
|
52
|
+
'name' => 'New Name'
|
53
|
+
}
|
54
|
+
}
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
it { expect { subject }.to change { state.users[0][:name] }.from('eran').to('New Name') }
|
59
|
+
end
|
60
|
+
|
61
|
+
context 'when changelog == { "hash" => { "array" => { 1 => 5 } }' do
|
62
|
+
let(:changelog) do
|
63
|
+
{
|
64
|
+
'hash' => {
|
65
|
+
'array' => {
|
66
|
+
1 => 5
|
67
|
+
}
|
68
|
+
}
|
69
|
+
}
|
70
|
+
end
|
71
|
+
|
72
|
+
it { expect { subject }.to change { state.hash[:array][1] }.from(2).to(5) }
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
data/spec/fie/commander_spec.rb
CHANGED
@@ -1,3 +1,199 @@
|
|
1
|
-
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
RSpec.describe Fie::Commander, type: :channel do
|
4
|
+
before do
|
5
|
+
credentials = {
|
6
|
+
secret_key_base: 'c2c3f440e947a5592acaad052e756d87dd8db717275ef14ac794a3c2a07cbdaec8aa0df7a090c1bc83833736ee3f5209affe55639845871081d48598d57de3f7'
|
7
|
+
}
|
8
|
+
|
9
|
+
allow(Rails.application).to receive(:credentials) { credentials }
|
10
|
+
end
|
11
|
+
|
12
|
+
let(:controller_name) { 'home_controller' }
|
13
|
+
let(:action_name) { 'index' }
|
14
|
+
let(:state_params) { { 'view_variables' => view_variables, 'controller_name' => controller_name, 'action_name' => action_name } }
|
15
|
+
let(:view_variables) do
|
16
|
+
{
|
17
|
+
users: encrypt([
|
18
|
+
{ name: 'eran', age: '20' },
|
19
|
+
'120'
|
20
|
+
]),
|
21
|
+
primitive: encrypt('120'),
|
22
|
+
hash: encrypt({
|
23
|
+
array: [1, 2, 3],
|
24
|
+
primitive: '120'
|
25
|
+
})
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
let!(:connection) { stub_connection }
|
30
|
+
let!(:connection_uuid) { '92dbabc7-60af-4658-9cc5-277846d1f813' }
|
31
|
+
let!(:subscription) { subscribe identifier: connection_uuid }
|
32
|
+
|
33
|
+
before { subscription.singleton_class.class_variable_set(:@@pools_subjects, Set.new) }
|
34
|
+
|
35
|
+
describe '#params' do
|
36
|
+
describe ':identifier' do
|
37
|
+
context 'when connection_uuid == 92dbabc7-60af-4658-9cc5-277846d1f813' do
|
38
|
+
subject { subscription.params[:identifier] }
|
39
|
+
it { is_expected.to eq(connection_uuid) }
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
describe 'streams' do
|
45
|
+
context 'when connection_uuid == 92dbabc7-60af-4658-9cc5-277846d1f813' do
|
46
|
+
subject { streams }
|
47
|
+
it { is_expected.to include("commander_#{ connection_uuid }") }
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#initialize_state' do
|
52
|
+
let!(:initialize_state) { subscription.initialize_state(state_params) }
|
53
|
+
let(:redis_state) { redis.get("commander_#{ connection_uuid }") }
|
54
|
+
|
55
|
+
subject { subscription.state }
|
56
|
+
|
57
|
+
it { is_expected.to be_a(Fie::State) }
|
58
|
+
it { expect(redis_state).to_not be_blank }
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#unsubscribed' do
|
62
|
+
before { subscription.unsubscribed }
|
63
|
+
subject { redis.get("commander_#{ connection_uuid }") }
|
64
|
+
|
65
|
+
it('deletes state') { is_expected.to be_blank }
|
66
|
+
end
|
2
67
|
|
3
|
-
|
68
|
+
describe '#initialize_pools' do
|
69
|
+
subject { subscription.initialize_pools }
|
70
|
+
|
71
|
+
context 'when subjects are :chat and :notifications' do
|
72
|
+
before { subscription.singleton_class.class_variable_set :@@pools_subjects, Set.new([:chat, :notifications]) }
|
73
|
+
|
74
|
+
it do
|
75
|
+
expect { subject }
|
76
|
+
.to have_broadcasted_to("commander_#{ connection_uuid }")
|
77
|
+
.with command: 'subscribe_to_pools', parameters: { subjects: ['chat', 'notifications']}
|
78
|
+
end
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
describe '#publish' do
|
83
|
+
let(:pool_subject) { :chat }
|
84
|
+
let(:object) { Object.new }
|
85
|
+
|
86
|
+
before { expect(Fie::Pools).to receive(:publish_lazy).with(pool_subject, object, connection_uuid) }
|
87
|
+
|
88
|
+
it { subscription.publish(pool_subject, object) }
|
89
|
+
end
|
90
|
+
|
91
|
+
describe '#state' do
|
92
|
+
before { subscription.initialize_state state_params }
|
93
|
+
|
94
|
+
let(:redis_state) { Marshal.load redis.get("commander_#{ connection_uuid }") }
|
95
|
+
subject { subscription.state.attributes }
|
96
|
+
|
97
|
+
it { is_expected.to eq(redis_state.attributes) }
|
98
|
+
end
|
99
|
+
|
100
|
+
describe '#state=' do
|
101
|
+
let(:state_object) do
|
102
|
+
Fie::State.new \
|
103
|
+
view_variables: view_variables,
|
104
|
+
controller_name: controller_name,
|
105
|
+
action_name: action_name,
|
106
|
+
uuid: connection_uuid
|
107
|
+
end
|
108
|
+
|
109
|
+
before { subscription.state = state_object }
|
110
|
+
|
111
|
+
it 'is expected to modify the state to the state object provided' do
|
112
|
+
expect(subscription.state.attributes).to eq(state_object.attributes)
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
describe '#modify_state_using_changelog' do
|
117
|
+
let(:objects_changelog) { { key: 'value' } }
|
118
|
+
let(:params) { { 'objects_changelog' => objects_changelog } }
|
119
|
+
|
120
|
+
before { expect_any_instance_of(Fie::State).to receive(:update_object_using_changelog).with(objects_changelog) }
|
121
|
+
|
122
|
+
it { subscription.modify_state_using_changelog(params) }
|
123
|
+
end
|
124
|
+
|
125
|
+
describe '#execute_js_function' do
|
126
|
+
let(:function_name) { 'console.log' }
|
127
|
+
let(:arguments) { ['print this in console.'] }
|
128
|
+
|
129
|
+
subject { subscription.execute_js_function(function_name, *arguments) }
|
130
|
+
|
131
|
+
it do
|
132
|
+
expect { subject }
|
133
|
+
.to have_broadcasted_to("commander_#{ connection_uuid }")
|
134
|
+
.with command: 'execute_function', parameters: { name: function_name, arguments: arguments }
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
138
|
+
describe '.commander_name' do
|
139
|
+
subject { Fie::Commander.commander_name(connection_uuid) }
|
140
|
+
it { is_expected.to eq("commander_#{ connection_uuid }") }
|
141
|
+
end
|
142
|
+
|
143
|
+
describe '.pool' do
|
144
|
+
before do
|
145
|
+
subscription.singleton_class.pool :chat do
|
146
|
+
puts @connection_uuid
|
147
|
+
puts @published_object
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe 'created callback' do
|
152
|
+
let(:object) { 123 }
|
153
|
+
let(:dumped_object) { Marshal.dump object }
|
154
|
+
subject { subscription.pool_chat_callback(object: dumped_object) }
|
155
|
+
|
156
|
+
it 'is expected to output @connection_uuid and @published_object' do
|
157
|
+
expect(STDOUT).to receive(:puts).with(connection_uuid)
|
158
|
+
expect(STDOUT).to receive(:puts).with(object)
|
159
|
+
subject
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
describe 'new method' do
|
165
|
+
let(:caller) { { 'value' => '15', 'id' => 'id', 'class' => 'class' } }
|
166
|
+
|
167
|
+
before do
|
168
|
+
subscription.define_singleton_method(:new_method) do |arg1:, arg2:|
|
169
|
+
puts @caller
|
170
|
+
puts @controller_name
|
171
|
+
puts @action_name
|
172
|
+
puts @connection_uuid
|
173
|
+
puts state.attributes
|
174
|
+
end
|
175
|
+
|
176
|
+
subscription.singleton_class.method_added(:new_method)
|
177
|
+
end
|
178
|
+
|
179
|
+
let(:new_method_parameters) do
|
180
|
+
{
|
181
|
+
'caller' => caller,
|
182
|
+
'controller_name' => controller_name,
|
183
|
+
'action_name' => action_name,
|
184
|
+
'arg1' => 123,
|
185
|
+
'arg2' => 123
|
186
|
+
}
|
187
|
+
end
|
188
|
+
|
189
|
+
it 'should contain @caller, @controller_name, @action_name, and @connection_uuid instance variables and state method when called' do
|
190
|
+
expect(STDOUT).to receive(:puts).with(caller.symbolize_keys)
|
191
|
+
expect(STDOUT).to receive(:puts).with(controller_name)
|
192
|
+
expect(STDOUT).to receive(:puts).with(action_name)
|
193
|
+
expect(STDOUT).to receive(:puts).with(connection_uuid)
|
194
|
+
expect(STDOUT).to receive(:puts).with(subscription.state.attributes)
|
195
|
+
|
196
|
+
subscription.new_method(new_method_parameters)
|
197
|
+
end
|
198
|
+
end
|
199
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
RSpec.describe Fie::Pools, type: :channel do
|
2
|
+
context 'when subject == "chat"' do
|
3
|
+
let(:pool_subject) { 'chat' }
|
4
|
+
|
5
|
+
describe 'subscription' do
|
6
|
+
subject { subscribe identifier: pool_subject }
|
7
|
+
it { is_expected.to_not be_blank }
|
8
|
+
it { is_expected.to be_a(Fie::Pools) }
|
9
|
+
end
|
10
|
+
|
11
|
+
describe '.pool_name' do
|
12
|
+
subject { Fie::Pools.pool_name(pool_subject) }
|
13
|
+
it { is_expected.to eq("pool_#{ pool_subject }") }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '.publish_lazy' do
|
17
|
+
context 'when sender_uuid is "92dbabc7-60af-4658-9cc5-277846d1f813" && object is 123' do
|
18
|
+
let(:sender_uuid) { '92dbabc7-60af-4658-9cc5-277846d1f813' }
|
19
|
+
let(:object) { 123 }
|
20
|
+
|
21
|
+
subject { Fie::Pools.publish_lazy(pool_subject, object, sender_uuid) }
|
22
|
+
|
23
|
+
it do
|
24
|
+
expect { subject }
|
25
|
+
.to have_broadcasted_to("commander_#{ sender_uuid }")
|
26
|
+
.with command: 'publish_to_pool_lazy', parameters: { subject: pool_subject, object: Marshal.dump(object) }
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe '.publish' do
|
32
|
+
context 'when object == 123' do
|
33
|
+
let(:object) { 123 }
|
34
|
+
|
35
|
+
context 'when sender is not specified' do
|
36
|
+
let(:sender_uuid) { nil }
|
37
|
+
|
38
|
+
subject { Fie::Pools.publish(pool_subject, object, sender_uuid: sender_uuid) }
|
39
|
+
|
40
|
+
it do
|
41
|
+
expect { subject }
|
42
|
+
.to have_broadcasted_to("pool_#{ pool_subject }")
|
43
|
+
.with command: 'publish_to_pool', parameters: { subject: pool_subject, object: Marshal.dump(object), sender_uuid: sender_uuid }
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context 'when sender is specified' do
|
48
|
+
let(:sender_uuid) { '92dbabc7-60af-4658-9cc5-277846d1f813' }
|
49
|
+
|
50
|
+
subject { Fie::Pools.publish(pool_subject, object, sender_uuid: sender_uuid) }
|
51
|
+
|
52
|
+
it do
|
53
|
+
expect { subject }
|
54
|
+
.to have_broadcasted_to("pool_#{ pool_subject }")
|
55
|
+
.with command: 'publish_to_pool', parameters: { subject: pool_subject, object: Marshal.dump(object), sender_uuid: sender_uuid }
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
data/spec/fie/state_spec.rb
CHANGED
@@ -57,7 +57,7 @@ RSpec.describe Fie::State do
|
|
57
57
|
it { is_expected.to eq(state.attributes.to_json) }
|
58
58
|
end
|
59
59
|
|
60
|
-
describe 'permeate' do
|
60
|
+
describe '#permeate' do
|
61
61
|
it 'should render an html template which is then sent over action cable' do
|
62
62
|
expect(ApplicationController).to receive(:render).with(
|
63
63
|
"#{ controller_name }/#{ action_name }",
|
@@ -76,7 +76,7 @@ RSpec.describe Fie::State do
|
|
76
76
|
end
|
77
77
|
end
|
78
78
|
|
79
|
-
describe '
|
79
|
+
describe '#hash' do
|
80
80
|
before { expect(state).to receive(:permeate) }
|
81
81
|
|
82
82
|
context 'when setting value' do
|
@@ -91,7 +91,7 @@ RSpec.describe Fie::State do
|
|
91
91
|
it { expect { delete_value }.to change { state.hash.count }.by(-1) }
|
92
92
|
end
|
93
93
|
|
94
|
-
describe 'primitive' do
|
94
|
+
describe '#primitive' do
|
95
95
|
context 'when setting value' do
|
96
96
|
subject { state.hash[:primitive] }
|
97
97
|
let!(:change_hash_value) { state.hash[:primitive] = 'value' }
|
@@ -101,7 +101,7 @@ RSpec.describe Fie::State do
|
|
101
101
|
end
|
102
102
|
end
|
103
103
|
|
104
|
-
describe '
|
104
|
+
describe '#users' do
|
105
105
|
before { expect(state).to receive(:permeate) }
|
106
106
|
|
107
107
|
context 'when setting value' do
|
@@ -119,7 +119,7 @@ RSpec.describe Fie::State do
|
|
119
119
|
it { is_expected.to eq('value') }
|
120
120
|
end
|
121
121
|
|
122
|
-
describe 'name
|
122
|
+
describe '#name' do
|
123
123
|
context 'when setting value' do
|
124
124
|
subject { state.users[0][:name] }
|
125
125
|
let!(:change_hash_value) { state.users[0][:name] = 'value' }
|
@@ -148,8 +148,8 @@ RSpec.describe Fie::State do
|
|
148
148
|
end
|
149
149
|
end
|
150
150
|
|
151
|
-
describe 'attributes' do
|
152
|
-
describe 'users' do
|
151
|
+
describe '#attributes' do
|
152
|
+
describe '#users' do
|
153
153
|
subject { state.attributes['users'] }
|
154
154
|
|
155
155
|
it { is_expected.to include a_hash_including(name: 'eran', age: '20') }
|
@@ -157,17 +157,31 @@ RSpec.describe Fie::State do
|
|
157
157
|
it { is_expected.to include '120' }
|
158
158
|
end
|
159
159
|
|
160
|
-
describe 'primitive' do
|
160
|
+
describe '#primitive' do
|
161
161
|
subject { state.attributes['primitive'] }
|
162
162
|
it { is_expected.to eq('120') }
|
163
163
|
end
|
164
164
|
|
165
|
-
describe 'hash' do
|
165
|
+
describe '#hash' do
|
166
166
|
subject { state.attributes['hash'] }
|
167
167
|
|
168
168
|
it { is_expected.to include(array: [1, 2, 3]) }
|
169
169
|
it { is_expected.to include(primitive: '120') }
|
170
170
|
end
|
171
171
|
end
|
172
|
+
|
173
|
+
|
174
|
+
describe '#inspect' do
|
175
|
+
subject { state.inspect }
|
176
|
+
|
177
|
+
it { is_expected.to include(state.to_s[0..-2]) }
|
178
|
+
it { is_expected.to include("users:") }
|
179
|
+
it { is_expected.to include(state.users.inspect) }
|
180
|
+
it { is_expected.to include("primitive:") }
|
181
|
+
it { is_expected.to include(state.primitive.inspect) }
|
182
|
+
it { is_expected.to include("hash:") }
|
183
|
+
it { is_expected.to include(state.hash.inspect) }
|
184
|
+
it { is_expected.to include('>') }
|
185
|
+
end
|
172
186
|
end
|
173
187
|
end
|
data/spec/rails_helper.rb
CHANGED
@@ -1,8 +1,13 @@
|
|
1
1
|
# This file is copied to spec/ when you run 'rails generate rspec:install'
|
2
2
|
require 'spec_helper'
|
3
3
|
|
4
|
+
require 'coveralls'
|
5
|
+
Coveralls.wear!
|
6
|
+
|
4
7
|
ENV['RAILS_ENV'] ||= 'test'
|
5
8
|
require File.expand_path('../../config/environment', __FILE__)
|
9
|
+
require 'action_cable/testing/rspec'
|
10
|
+
require 'pry-rails'
|
6
11
|
# Prevent database truncation if the environment is production
|
7
12
|
abort("The Rails environment is running in production mode!") if Rails.env.production?
|
8
13
|
require 'rspec/rails'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fie
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Eran Peer
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2018-06-
|
11
|
+
date: 2018-06-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -130,6 +130,66 @@ dependencies:
|
|
130
130
|
- - ">="
|
131
131
|
- !ruby/object:Gem::Version
|
132
132
|
version: 1.0.0
|
133
|
+
- !ruby/object:Gem::Dependency
|
134
|
+
name: action-cable-testing
|
135
|
+
requirement: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - "~>"
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: 0.3.1
|
140
|
+
- - ">="
|
141
|
+
- !ruby/object:Gem::Version
|
142
|
+
version: 0.3.1
|
143
|
+
type: :development
|
144
|
+
prerelease: false
|
145
|
+
version_requirements: !ruby/object:Gem::Requirement
|
146
|
+
requirements:
|
147
|
+
- - "~>"
|
148
|
+
- !ruby/object:Gem::Version
|
149
|
+
version: 0.3.1
|
150
|
+
- - ">="
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: 0.3.1
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: coveralls
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: 0.8.21
|
160
|
+
- - ">="
|
161
|
+
- !ruby/object:Gem::Version
|
162
|
+
version: 0.8.21
|
163
|
+
type: :development
|
164
|
+
prerelease: false
|
165
|
+
version_requirements: !ruby/object:Gem::Requirement
|
166
|
+
requirements:
|
167
|
+
- - "~>"
|
168
|
+
- !ruby/object:Gem::Version
|
169
|
+
version: 0.8.21
|
170
|
+
- - ">="
|
171
|
+
- !ruby/object:Gem::Version
|
172
|
+
version: 0.8.21
|
173
|
+
- !ruby/object:Gem::Dependency
|
174
|
+
name: pry-rails
|
175
|
+
requirement: !ruby/object:Gem::Requirement
|
176
|
+
requirements:
|
177
|
+
- - "~>"
|
178
|
+
- !ruby/object:Gem::Version
|
179
|
+
version: 0.3.6
|
180
|
+
- - ">="
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: 0.3.6
|
183
|
+
type: :development
|
184
|
+
prerelease: false
|
185
|
+
version_requirements: !ruby/object:Gem::Requirement
|
186
|
+
requirements:
|
187
|
+
- - "~>"
|
188
|
+
- !ruby/object:Gem::Version
|
189
|
+
version: 0.3.6
|
190
|
+
- - ">="
|
191
|
+
- !ruby/object:Gem::Version
|
192
|
+
version: 0.3.6
|
133
193
|
- !ruby/object:Gem::Dependency
|
134
194
|
name: redis
|
135
195
|
requirement: !ruby/object:Gem::Requirement
|
@@ -223,7 +283,9 @@ files:
|
|
223
283
|
- lib/opal/fie/native/timeout.rb
|
224
284
|
- lib/opal/fie/pool.rb
|
225
285
|
- lib/opal/fie/util.rb
|
286
|
+
- spec/fie/changelog_spec.rb
|
226
287
|
- spec/fie/commander_spec.rb
|
288
|
+
- spec/fie/pools_spec.rb
|
227
289
|
- spec/fie/state_spec.rb
|
228
290
|
- spec/rails_helper.rb
|
229
291
|
- spec/spec_helper.rb
|
@@ -248,9 +310,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
248
310
|
version: '0'
|
249
311
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
250
312
|
requirements:
|
251
|
-
- - "
|
313
|
+
- - ">="
|
252
314
|
- !ruby/object:Gem::Version
|
253
|
-
version:
|
315
|
+
version: '0'
|
254
316
|
requirements: []
|
255
317
|
rubyforge_project:
|
256
318
|
rubygems_version: 2.5.2.1
|
@@ -259,7 +321,9 @@ specification_version: 4
|
|
259
321
|
summary: Fie is a Rails-centric frontend framework running over a permanent WebSocket
|
260
322
|
connection.
|
261
323
|
test_files:
|
324
|
+
- spec/fie/changelog_spec.rb
|
262
325
|
- spec/fie/commander_spec.rb
|
326
|
+
- spec/fie/pools_spec.rb
|
263
327
|
- spec/fie/state_spec.rb
|
264
328
|
- spec/rails_helper.rb
|
265
329
|
- spec/spec_helper.rb
|