futurism 0.1.4 → 0.3.3

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: 92467463ea6f80379a1dc26c85afe18564cd5cf2c6b92be207fe68d74f50b674
4
- data.tar.gz: 7e5934d6194107a7d3b7ba39af4f38f0731ba8caa67fb706afeac5220ae46d85
3
+ metadata.gz: '09ba45b906e8c0f223e8da6793131f6eb96acad018116c32584d033392f1fe3b'
4
+ data.tar.gz: 178166e14d83fab48dcb6296d7dc9b412762ca228e201d5d97e7c70c08d1d1e1
5
5
  SHA512:
6
- metadata.gz: a6514295bff471bc75f02186eb0446166a14d4dfdf1993b481ce6f0df737b863a90c33d4eef5ae09b0ad5007d66fb4dda9639debdedfc3a6ce6cc0613a9d0c29
7
- data.tar.gz: 5aedb6c88925314d27a46d933b243113006be0b49d0f20fb91d4b767426deecbc73ce78d99e3148e09ca2a8219bf61a510f12dc57d0c6d846e6149a85301e852
6
+ metadata.gz: 29c7a409b86e1e29eac2feadc4e01d2042071e8daa196849bc676d400b2d59f4b4b7548fd4c3c76d45a262cb0f57b80adc0bde56812a2bcbc394eefd56f50c1c
7
+ data.tar.gz: f85ea36325a9a4aecb63a0c8a47636db1cf4e7573907e558cb46203bfbcd87b583d52efd78b2c6bffe20040a44e4cbad9cd4bf269741a7d011966d427518ec55
data/README.md CHANGED
@@ -1,10 +1,15 @@
1
1
  # Futurism
2
2
  [![Twitter follow](https://img.shields.io/twitter/follow/julian_rubisch?style=social)](https://twitter.com/julian_rubisch)
3
3
  <!-- ALL-CONTRIBUTORS-BADGE:START - Do not remove or modify this section -->
4
- [![All Contributors](https://img.shields.io/badge/all_contributors-5-orange.svg?style=flat-square)](#contributors-)
4
+ [![All Contributors](https://img.shields.io/badge/all_contributors-10-orange.svg?style=flat-square)](#contributors-)
5
5
  <!-- ALL-CONTRIBUTORS-BADGE:END -->
6
6
  Lazy-load Rails partials via CableReady
7
7
 
8
+ :rotating_light: *Futurism is still in pre-1.0 state. As much as I hope to keep the API backwards-compatible, I cannot guarantee it* :rotating_light:
9
+
10
+ <img src="https://user-images.githubusercontent.com/4352208/88374198-9e6f3500-cd99-11ea-804b-0216ed320eff.jpg" alt="birmingham-museums-trust-GrvC6MI-z4w-unsplash" width="50%" align="center"/>
11
+ <span>Photo by <a href="https://unsplash.com/@birminghammuseumstrust?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Birmingham Museums Trust</a> on <a href="https://unsplash.com/s/photos/futurism?utm_source=unsplash&amp;utm_medium=referral&amp;utm_content=creditCopyText">Unsplash</a></span>
12
+
8
13
  ## Facts
9
14
  - only one dependency: CableReady
10
15
  - bundle size (without CableReady) is around [~1.04kB](https://bundlephobia.com/result?p=@minthesize/futurism@0.1.3)
@@ -23,7 +28,9 @@ Lazy-load Rails partials via CableReady
23
28
  with a helper in your template
24
29
 
25
30
  ```erb
26
- <%= futurize @posts %>
31
+ <%= futurize @posts, extends: :div do %>
32
+ <!-- placeholder -->
33
+ <% end %>
27
34
  ```
28
35
 
29
36
  custom `<futurism-element>`s (in the form of a `<div>` or a `<tr is="futurism-table-row">` are rendered. Those custom elements have an `IntersectionObserver` attached that will send a signed global id to an ActionCable channel (`FuturismChannel`) which will then replace the placeholders with the actual resource partial.
@@ -40,7 +47,21 @@ You can pass the placeholder as a block:
40
47
 
41
48
  ![aa601dec1930151f71dbf0d6b02b61c9](https://user-images.githubusercontent.com/4352208/87131629-f768a480-c294-11ea-89a9-ea0a76ee06ef.gif)
42
49
 
43
- ### Partial Path
50
+ ## API
51
+
52
+ Currently there are two ways to call `futurize`, designed to wrap `render`'s behavior:
53
+
54
+ ### Resource
55
+
56
+ You can pass a single `ActiveRecord` or an `ActiveRecord::Relation` to `futurize`, just as you would call `render`:
57
+
58
+ ```erb
59
+ <%= futurize @posts, extends: :tr do %>
60
+ <td class="placeholder"></td>
61
+ <% end %>
62
+ ```
63
+
64
+ #### Partial Path
44
65
 
45
66
  Remember that you can override the partial path in you models, like so:
46
67
 
@@ -54,6 +75,56 @@ end
54
75
 
55
76
  That way you get maximal flexibility when just specifying a single resource.
56
77
 
78
+ ### Explicit Partial
79
+
80
+ Call `futurize` with a `partial` keyword:
81
+
82
+ ```erb
83
+ <%= futurize partial: "items/card", locals: {card: @card}, extends: :div do %>
84
+ <div class="spinner"></div>
85
+ <% end %>
86
+ ```
87
+
88
+ You can also use the shorthand syntax:
89
+
90
+ ```erb
91
+ <%= futurize "items/card", card: @card, extends: :div do %>
92
+ <div class="spinner"></div>
93
+ <% end %>
94
+ ```
95
+
96
+ #### Collections
97
+
98
+ Collection rendering is also possible:
99
+
100
+ ```erb
101
+ <%= futurize partial: "items/card", collection: @cards, extends: :div do %>
102
+ <div class="spinner"></div>
103
+ <% end %>
104
+ ```
105
+
106
+ ### HTML Options
107
+
108
+ You can pass a hash of attribute/value pairs which will be mixed into the HTML markup for the placeholder element. This is important for layouts that require elements to have dimensionality. For example, many scripts calculate size based on element height and width. This option ensures that your elements have integrity, even if they are gone before you see them.
109
+
110
+ ```erb
111
+ <%= futurize @posts, extends: :tr, html_options: {style: "width: 50px; height: 50px;"} do %>
112
+ <td class="placeholder"></td>
113
+ <% end %>
114
+ ```
115
+
116
+ This will output the following:
117
+
118
+ ```html
119
+ <tr style="width: 50px; height: 50px;">
120
+ <td class="placeholder"></td>
121
+ </tr>
122
+ ```
123
+
124
+ ## Events
125
+
126
+ Once your futurize element has been rendered, the `futurize:appeared` custom event will be called.
127
+
57
128
  ## Installation
58
129
  Add this line to your application's Gemfile:
59
130
 
@@ -72,19 +143,19 @@ To copy over the javascript files to your application, run
72
143
  $ bin/rails futurism:install
73
144
  ```
74
145
 
75
- ** ! Note that the installer will run `yarn install @minthesize/futurism` for you ! **
146
+ **! Note that the installer will run `yarn add @minthesize/futurism` for you !**
76
147
 
77
148
  ### Manual Installation
78
149
  After `bundle`, install the Javascript library:
79
150
 
80
151
  ```bash
81
- $ bin/yarn install @minthesize/futurism
152
+ $ bin/yarn add @minthesize/futurism
82
153
  ```
83
154
 
84
155
  In your `app/javascript/channels/index.js`, add the following
85
156
 
86
157
  ```js
87
- import * as Futurism
158
+ import * as Futurism from '@minthesize/futurism''
88
159
 
89
160
  import consumer from './consumer'
90
161
 
@@ -111,6 +182,13 @@ Thanks goes to these wonderful people ([emoji key](https://allcontributors.org/d
111
182
  <td align="center"><a href="https://ParamagicDev.github.io/portfolio"><img src="https://avatars2.githubusercontent.com/u/26425882?v=4" width="100px;" alt=""/><br /><sub><b>Konnor Rogers</b></sub></a><br /><a href="https://github.com/julianrubisch/futurism/commits?author=ParamagicDev" title="Code">💻</a></td>
112
183
  <td align="center"><a href="https://www.andrewm.codes"><img src="https://avatars1.githubusercontent.com/u/18423853?v=4" width="100px;" alt=""/><br /><sub><b>Andrew Mason</b></sub></a><br /><a href="#maintenance-andrewmcodes" title="Maintenance">🚧</a></td>
113
184
  <td align="center"><a href="http://gorails.com"><img src="https://avatars1.githubusercontent.com/u/67093?v=4" width="100px;" alt=""/><br /><sub><b>Chris Oliver</b></sub></a><br /><a href="https://github.com/julianrubisch/futurism/commits?author=excid3" title="Code">💻</a> <a href="https://github.com/julianrubisch/futurism/pulls?q=is%3Apr+reviewed-by%3Aexcid3" title="Reviewed Pull Requests">👀</a></td>
185
+ <td align="center"><a href="https://github.com/leastbad"><img src="https://avatars2.githubusercontent.com/u/38150464?v=4" width="100px;" alt=""/><br /><sub><b>leastbad</b></sub></a><br /><a href="https://github.com/julianrubisch/futurism/commits?author=leastbad" title="Code">💻</a></td>
186
+ <td align="center"><a href="http://code.digimonkey.com"><img src="https://avatars0.githubusercontent.com/u/74207?v=4" width="100px;" alt=""/><br /><sub><b>M. E. Patterson</b></sub></a><br /><a href="https://github.com/julianrubisch/futurism/issues?q=author%3Amepatterson" title="Bug reports">🐛</a></td>
187
+ </tr>
188
+ <tr>
189
+ <td align="center"><a href="http://fractaledmind.com"><img src="https://avatars3.githubusercontent.com/u/5077225?v=4" width="100px;" alt=""/><br /><sub><b>Stephen Margheim</b></sub></a><br /><a href="https://github.com/julianrubisch/futurism/commits?author=fractaledmind" title="Code">💻</a></td>
190
+ <td align="center"><a href="http://hass.codes"><img src="https://avatars2.githubusercontent.com/u/1064205?v=4" width="100px;" alt=""/><br /><sub><b>Hassanin Ahmed</b></sub></a><br /><a href="https://github.com/julianrubisch/futurism/commits?author=sas1ni69" title="Code">💻</a></td>
191
+ <td align="center"><a href="https://marcoroth.dev"><img src="https://avatars2.githubusercontent.com/u/6411752?v=4" width="100px;" alt=""/><br /><sub><b>Marco Roth</b></sub></a><br /><a href="https://github.com/julianrubisch/futurism/commits?author=marcoroth" title="Code">💻</a></td>
114
192
  </tr>
115
193
  </table>
116
194
 
@@ -6,6 +6,10 @@ require "futurism/channel"
6
6
  require "futurism/helpers"
7
7
 
8
8
  module Futurism
9
+ extend ActiveSupport::Autoload
10
+
11
+ autoload :Helpers, "futurism/helpers"
12
+
9
13
  ActiveSupport.on_load(:action_view) {
10
14
  include Futurism::Helpers
11
15
  }
@@ -7,13 +7,16 @@ module Futurism
7
7
  end
8
8
 
9
9
  def receive(data)
10
- resources = data["sgids"].map { |sgid|
11
- [sgid, GlobalID::Locator.locate_signed(sgid)]
10
+ resources = data["signed_params"].map { |signed_params|
11
+ [signed_params, Rails.application.message_verifier("futurism").verify(signed_params)]
12
12
  }
13
13
 
14
- resources.each do |sgid, resource|
14
+ new_env = connection.env.merge(ApplicationController.renderer.instance_variable_get(:@env))
15
+ ApplicationController.renderer.instance_variable_set(:@env, new_env)
16
+
17
+ resources.each do |signed_params, resource|
15
18
  cable_ready["Futurism::Channel"].outer_html(
16
- selector: "[data-sgid='#{sgid}']",
19
+ selector: "[data-signed-params='#{signed_params}']",
17
20
  html: ApplicationController.render(resource)
18
21
  )
19
22
  end
@@ -1,22 +1,26 @@
1
- class FuturismChannel < ApplicationCable::Channel
2
- include CableReady::Broadcaster
1
+ module Futurism
2
+ class Channel < ActionCable::Channel::Base
3
+ include CableReady::Broadcaster
3
4
 
4
- def subscribed
5
- stream_from "FuturismChannel"
6
- end
5
+ def subscribed
6
+ stream_from "Futurism::Channel"
7
+ end
7
8
 
8
- def receive(data)
9
- resources = data["sgids"].map { |sgid|
10
- [sgid, GlobalID::Locator.locate_signed(sgid)]
11
- }
9
+ def receive(data)
10
+ resources = data["signed_params"].map { |signed_params|
11
+ [signed_params, Rails.application.message_verifier("futurism").verify(signed_params)]
12
+ }
12
13
 
13
- resources.each do |sgid, resource|
14
- cable_ready["FuturismChannel"].outer_html(
15
- selector: "[data-sgid='#{sgid}']",
16
- html: ApplicationController.render(resource)
17
- )
18
- end
14
+ ApplicationController.renderer.instance_variable_set(:@env, connection.env)
19
15
 
20
- cable_ready.broadcast
16
+ resources.each do |signed_params, resource|
17
+ cable_ready["Futurism::Channel"].outer_html(
18
+ selector: "[data-signed-params='#{signed_params}']",
19
+ html: ApplicationController.render(resource)
20
+ )
21
+ end
22
+
23
+ cable_ready.broadcast
24
+ end
21
25
  end
22
26
  end
@@ -1,15 +1,51 @@
1
1
  module Futurism
2
2
  module Helpers
3
- def futurize(records, extends:, &block)
3
+ def futurize(records_or_string = nil, extends:, **options, &block)
4
4
  placeholder = capture(&block)
5
+
6
+ if records_or_string.is_a?(ActiveRecord::Base) || records_or_string.is_a?(ActiveRecord::Relation)
7
+ futurize_active_record(records_or_string, extends: extends, placeholder: placeholder, **options)
8
+ elsif records_or_string.is_a?(String)
9
+ futurize_with_options(extends: extends, partial: records_or_string, locals: options, placeholder: placeholder)
10
+ else
11
+ futurize_with_options(extends: extends, placeholder: placeholder, **options)
12
+ end
13
+ end
14
+
15
+ def futurize_with_options(extends:, placeholder:, **options)
16
+ collection = options.delete(:collection)
17
+ if collection.nil?
18
+ render_element(extends: extends, placeholder: placeholder, options: options)
19
+ else
20
+ collection_class_name = collection.klass.name
21
+ as = options.delete(:as) || collection_class_name.downcase
22
+ collection.map { |record|
23
+ render_element(extends: extends, placeholder: placeholder, options: options.deep_merge(locals: {as.to_sym => record}))
24
+ }.join.html_safe
25
+ end
26
+ end
27
+
28
+ def futurize_active_record(records, extends:, placeholder:, **options)
5
29
  Array(records).map { |record|
6
- case extends
7
- when :tr
8
- content_tag :tr, placeholder, data: {sgid: record.to_sgid.to_s}, is: "futurism-table-row"
9
- else
10
- content_tag :"futurism-element", placeholder, data: {sgid: record.to_sgid.to_s}
11
- end
30
+ render_element(extends: extends, placeholder: placeholder, options: options.merge(model: record))
12
31
  }.join.html_safe
13
32
  end
33
+
34
+ def render_element(extends:, options:, placeholder:)
35
+ html_options = options.delete(:html_options) || {}
36
+ model_or_options = options.delete(:model) || options
37
+ case extends
38
+ when :li
39
+ content_tag :li, placeholder, {data: {signed_params: futurism_signed_params(model_or_options)}, is: "futurism-li"}.merge(html_options)
40
+ when :tr
41
+ content_tag :tr, placeholder, {data: {signed_params: futurism_signed_params(model_or_options)}, is: "futurism-table-row"}.merge(html_options)
42
+ else
43
+ content_tag :"futurism-element", placeholder, {data: {signed_params: futurism_signed_params(model_or_options)}}.merge(html_options)
44
+ end
45
+ end
46
+
47
+ def futurism_signed_params(params)
48
+ Rails.application.message_verifier("futurism").generate(params)
49
+ end
14
50
  end
15
51
  end
@@ -1,3 +1,3 @@
1
1
  module Futurism
2
- VERSION = "0.1.4"
2
+ VERSION = "0.3.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: futurism
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.3.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Julian Rubisch
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-07-18 00:00:00.000000000 Z
11
+ date: 2020-07-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: 0.12.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: nokogiri
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
55
69
  - !ruby/object:Gem::Dependency
56
70
  name: standardrb
57
71
  requirement: !ruby/object:Gem::Requirement