pinkman 0.9.9.9.9 → 0.9.9.9.10

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
  SHA256:
3
- metadata.gz: 52f046bfc67c43eb0162e23062de3c6a286f1c740ce0e7cb7e3eb0d67a43646a
4
- data.tar.gz: b952d2a6962e886eee3186d3a71cebaa5e6a728c5afb0ada3abf4d61b81774b7
3
+ metadata.gz: 2578f7ed00a7dbdeb84024113b941e578ce5df966cb3835637879aca2adaae1e
4
+ data.tar.gz: c04a023cf880c0ff3e4618fb778330f2da7f141a06703bb69d3c0ef1a05512a1
5
5
  SHA512:
6
- metadata.gz: 04e12687c844dea1204df405065ddfb286b1a98527fe1c42e07bdc3294b8934088d588e1e4d421507a309ceacef7065243dc00a15ea6234a3f3eafce6de87f6b
7
- data.tar.gz: ce64f0726d92c4d267ac876729a7e44c824d778bb1cc0b1e7a1ba6c8777d32d2ac475e17b581fbf6a03d4918150a7e0a850cb507015e472988d35596d2d5a452
6
+ metadata.gz: 88f823fd6b206c0bf6027f3cc2ce89deb8da96f7e3d413d5039eb5e20b33c2fc5197d3c00a4b3040414cbbf3ed5a1b9dc99d1dcb7637818d3408eef46e937f63
7
+ data.tar.gz: 014dcc79ec52d9fd9ee2b1a9b5bdb01389c182c853224409a6160aeffacc53001e93b7475eac6a9b4d3c8b685f7fafcd41c923a32f600c114689a053aea1d2d9
@@ -291,7 +291,9 @@ class window.PinkmanController extends window.PinkmanObject
291
291
  throw 'Callback not found.'
292
292
  params = if (typeof opt == 'object' and opt['params']?) then opt['params'] else new Object
293
293
  params.channel = channel
294
- params.room = opt.room if $p.isObject(opt) and opt.room?
294
+ if $p.isObject(opt)
295
+ params.room = opt.room if opt.room?
296
+ params.filter_by = (opt.filter_by or opt.filterBy ) if (opt.filterBy? or opt.filter_by?)
295
297
  Pinkman.cable.subscriptions.create params, received: callback
296
298
 
297
299
  scrolling: (callback) ->
@@ -0,0 +1,48 @@
1
+ require 'pinkman/broadcaster'
2
+
3
+ class PinkmanChannel < ActionCable::Channel::Base
4
+
5
+ def self.model
6
+ @model || self.to_s.gsub('Channel','').constantize
7
+ end
8
+
9
+ def self.model= model
10
+ @model = model
11
+ end
12
+
13
+ def self.rooms
14
+ @rooms ||= []
15
+ end
16
+
17
+ def self.broadcast scope
18
+ broadcasting = Pinkman::Broadcaster.new(scope: scope, model: model)
19
+ if block_given?
20
+ yield(broadcasting)
21
+ if broadcasting.save
22
+ broadcasting
23
+ else
24
+ raise "Pinkman: Error trying to broadcasting to #{broadcasting.room}."
25
+ end
26
+ else
27
+ raise 'PinkmanChannel.broadcast: no block given'
28
+ end
29
+ end
30
+
31
+ def model
32
+ self.class.model
33
+ end
34
+
35
+ def subscribed
36
+ stream
37
+ end
38
+
39
+ def unsubscribed
40
+ stop_all_streams
41
+ end
42
+
43
+ def stream
44
+ Pinkman::Broadcaster.stream(self,current_scope,params)
45
+ end
46
+
47
+
48
+ end
@@ -16,13 +16,18 @@ module Pinkman
16
16
  class_name.camelize
17
17
  end
18
18
 
19
+ def room_name
20
+ model_name.tableize
21
+ end
22
+
19
23
  def channel_name
20
24
  model_name + 'Channel'
21
25
  end
22
26
 
23
27
  def file_name
24
28
  class_name.underscore + "_channel.rb"
25
- end
29
+ end
30
+ alias filename file_name
26
31
 
27
32
  end
28
33
  end
@@ -1,10 +1,45 @@
1
1
  class <%= channel_name %> < PinkmanChannel
2
2
 
3
- def subscribed
4
- stream_from(room) if <%= model_name %>.allow_streaming?(room,scope)
5
- end
6
-
7
- def unsubscribed
3
+ # TO DO: use connection/params to determine the current scope
4
+ def current_scope
5
+ :public
8
6
  end
9
7
 
8
+ # broadcast :public do |config|
9
+ # config.room :<%= room_name %>
10
+ # end
11
+
12
+ # --- Quick Broadcast Guide
13
+
14
+ # Start a broadcast here to transmit <%= model_name %>.
15
+
16
+ # Who consumes the transmission?
17
+ # Everyone that subscribes to <%= channel_name %> and have a current_scope that is broadcasting something.
18
+
19
+ # What gets broadcasted?
20
+ # Every instance of <%= model_name %> that gets created, updated or destroyed
21
+ # is broadcasted as json of the passed scope.
22
+
23
+ # Optionally, you can use filter_by to restrict
24
+ # the transmission to a particular group of records.
25
+
26
+ # --- Usage
27
+
28
+ # -- js/coffe - client:
29
+ # App.controller 'any-controller', ->
30
+ # @main = ->
31
+ #
32
+ # @subscribe '<%= channel_name %>',
33
+ # room: '<%= room_name %>'
34
+ # filter_by: 123
35
+
36
+ # -- ruby / server: here (<%= filename %>)
37
+ # broadcast :public do |config|
38
+ # config.room :<%= room_name %>
39
+ #
40
+ # config.filter_by :attribute
41
+ # # Only records that got `attribute == 123` will be broadcasted.
42
+ #
43
+ # end
44
+
10
45
  end
@@ -0,0 +1,119 @@
1
+ require 'digest'
2
+
3
+ class Pinkman::Broadcaster
4
+
5
+ include ActiveModel::Validations
6
+
7
+ attr_accessor :model, :scope, :record
8
+ validates :model, :room, :scope, presence: true
9
+
10
+
11
+ def initialize options
12
+ self.scope = options[:scope]
13
+ self.model = options[:model]
14
+ true
15
+ end
16
+
17
+ def self.broadcasters
18
+ @broadcasters ||= {}
19
+ end
20
+
21
+ def self.broadcast room, scope, action, record
22
+ ActionCable.server.broadcast(room_name_from_record(room,record), {action: action, data: record.json_hash(scope)})
23
+ end
24
+
25
+ def self.stream channel, scope, params
26
+ if params[:room].present?
27
+ broadcaster = broadcasters[params[:room].to_sym]
28
+ if broadcaster.present? and broadcaster.scope == scope
29
+ channel.stream_from(room_name_from_params(broadcaster,params))
30
+ else
31
+ raise "Insuficient permissions or room '#{params[:room]}' not found."
32
+ end
33
+ else
34
+ raise 'Room not specified through client.'
35
+ end
36
+ end
37
+
38
+ def self.room_name_from_params broadcaster, params
39
+ if params[:filter_by].is_a? String
40
+ broadcaster.encrypt(broadcaster.room,params[:filter_by])
41
+ elsif params[:filter_by].is_a? Array
42
+ broadcaster.encrypt(broadcaster.room, params[:filter_by].join(' '))
43
+ else
44
+ broadcaster.room
45
+ end
46
+ end
47
+
48
+ def self.room_name_from_record room_name, record
49
+ broadcaster = broadcasters[room_name.to_sym]
50
+ if broadcaster
51
+ broadcaster.room_name(record)
52
+ else
53
+ raise "#{room_name} not found/declared"
54
+ end
55
+ end
56
+
57
+ def room room_name=nil
58
+ if room_name.present?
59
+ @room = room_name
60
+ else
61
+ @room
62
+ end
63
+ end
64
+
65
+ def filter_by *args
66
+ if args.any?
67
+ @filter_by = args
68
+ else
69
+ @filter_by ||= []
70
+ end
71
+ end
72
+
73
+ def save
74
+ valid? and (self.class.broadcasters[room.to_sym] = self) and set_callbacks
75
+ end
76
+
77
+ def get_record params
78
+ if filter_by.any? and params[:filter_by].present?
79
+ where_hash = {}
80
+ filter_by.each_with_index {|attribute,i| where_hash[attribute] = params[:filter_by][i] }
81
+ model.where(where_hash).first if model.where(where_hash).any?
82
+ end
83
+ end
84
+
85
+ def encrypt_room_name(record)
86
+ passphrase = filter_by.map { |attribute| record.send(attribute) }.join(' ')
87
+ encrypt(room,passphrase)
88
+ end
89
+
90
+ def encrypt room_name, passphrase
91
+ md5(room_name.to_s + 'pinkroom' + passphrase)
92
+ end
93
+
94
+ def room_name(record=nil)
95
+ (record.present? and filter_by.any?) ? encrypt_room_name(record) : room
96
+ end
97
+
98
+ def md5 val
99
+ Digest::MD5.hexdigest(val)
100
+ end
101
+
102
+ def set_callbacks
103
+ if valid?
104
+ ['create','update','destroy'].each do |action|
105
+ current_room = room
106
+ current_scope = scope
107
+ method_name = "broadcast_#{action}_to_#{room}".to_sym
108
+ unless model.instance_methods.include?(method_name)
109
+ model.define_method method_name do
110
+ Pinkman::Broadcaster.broadcast(current_room, current_scope, action, self)
111
+ end
112
+ model.send("after_#{action}".to_sym, method_name)
113
+ end
114
+ end
115
+ true
116
+ end
117
+ end
118
+
119
+ end
@@ -1,3 +1,3 @@
1
1
  module Pinkman
2
- VERSION = "0.9.9.9.9"
2
+ VERSION = "0.9.9.9.10"
3
3
  end
data/lib/pinkman.rb CHANGED
@@ -5,6 +5,7 @@ require 'pinkman/serializer'
5
5
  require 'pinkman/views_helpers'
6
6
  require 'pinkman/form_helper'
7
7
  require 'pinkman/version'
8
+ require 'pinkman/broadcaster'
8
9
 
9
10
  module Pinkman
10
11
 
@@ -39,23 +40,6 @@ module Pinkman
39
40
  # Extending ActiveRecord
40
41
  ActiveRecord::Base.singleton_class.class_eval do
41
42
 
42
- # Real time
43
- def broadcast_to room, scope
44
- @broadcasting_to ||= {}
45
- @broadcasting_to[room] = scope
46
- ['create','update','destroy'].each do |action|
47
- send("after_#{action}".to_sym, "broadcast_#{action}_#{room}".to_sym)
48
- define_method "broadcast_#{action}_#{room}" do
49
- ActionCable.server.broadcast room, {action: action, data: json_hash(scope)}
50
- end
51
- end
52
- end
53
-
54
- def allow_streaming? room, scope
55
- @broadcasting_to.is_a?(Hash) and @broadcasting_to[room] == scope
56
- end
57
-
58
-
59
43
  # Serializer
60
44
  def serializer= value
61
45
  @serializer = value
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pinkman
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.9.9.9
4
+ version: 0.9.9.9.10
5
5
  platform: ruby
6
6
  authors:
7
7
  - Agilso Oliveira
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-04-12 00:00:00.000000000 Z
11
+ date: 2018-04-16 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -222,6 +222,7 @@ files:
222
222
  - app/assets/stylesheets/pinkman/sector.scss
223
223
  - app/assets/stylesheets/pinkman/tables.scss
224
224
  - app/assets/stylesheets/pinkman/typo.scss
225
+ - app/channels/pinkman_channel.rb
225
226
  - app/controllers/pinkman/pinkman_controller.rb
226
227
  - app/helpers/pinkman/pinkman_helper.rb
227
228
  - app/views/pinkman/_error_for.html.slim
@@ -242,7 +243,6 @@ files:
242
243
  - lib/generators/pinkman/install_generator.rb
243
244
  - lib/generators/pinkman/model_generator.rb
244
245
  - lib/generators/pinkman/page_generator.rb
245
- - lib/generators/pinkman/pinkman_channel_generator.rb
246
246
  - lib/generators/pinkman/resource_generator.rb
247
247
  - lib/generators/pinkman/route_generator.rb
248
248
  - lib/generators/pinkman/route_resource_generator.rb
@@ -267,10 +267,10 @@ files:
267
267
  - lib/generators/pinkman/templates/pink_template.html.erb.erb
268
268
  - lib/generators/pinkman/templates/pink_template.html.haml.erb
269
269
  - lib/generators/pinkman/templates/pink_template.html.slim.erb
270
- - lib/generators/pinkman/templates/pinkman_channel.rb
271
270
  - lib/generators/pinkman/templates/serializer.rb.erb
272
271
  - lib/pinkman.rb
273
272
  - lib/pinkman/base_helper.rb
273
+ - lib/pinkman/broadcaster.rb
274
274
  - lib/pinkman/form_helper.rb
275
275
  - lib/pinkman/form_helper/form_helpers.rb
276
276
  - lib/pinkman/serializer.rb
@@ -1,12 +0,0 @@
1
- require 'rails/generators/base'
2
-
3
- module Pinkman
4
- class PinkmanChannelGenerator < ::Rails::Generators::Base
5
- source_root File.expand_path('../templates', __FILE__)
6
-
7
- def copy_pinkman_channel_file
8
- template "pinkman_channel.rb", "app/channels/pinkman_channel.rb"
9
- end
10
-
11
- end
12
- end
@@ -1,16 +0,0 @@
1
- class PinkmanChannel < ApplicationCable::Channel
2
-
3
- # TO DO
4
- def scope
5
- :public
6
- end
7
-
8
- def room
9
- if params[:room].present?
10
- params[:room].to_sym
11
- else
12
- raise ArgumentError, 'Pinkman: Room not specified.'
13
- end
14
- end
15
-
16
- end