rbexy 0.1.5 → 0.3.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/.gitignore +3 -1
- data/Gemfile.lock +1 -1
- data/README.md +10 -0
- data/docker-compose.yml +12 -0
- data/lib/rbexy/component.rb +18 -46
- data/lib/rbexy/component_providers/namespaced_rbexy_provider.rb +20 -0
- data/lib/rbexy/component_providers/rbexy_provider.rb +0 -2
- data/lib/rbexy/component_providers/view_component_provider.rb +0 -2
- data/lib/rbexy/configuration.rb +1 -0
- data/lib/rbexy/nodes.rb +6 -3
- data/lib/rbexy/output_buffer.rb +4 -2
- data/lib/rbexy/rails.rb +2 -1
- data/lib/rbexy/rails/component_template_resolver.rb +35 -0
- data/lib/rbexy/rails/controller_helper.rb +20 -0
- data/lib/rbexy/rails/engine.rb +3 -0
- data/lib/rbexy/runtime.rb +11 -1
- data/lib/rbexy/version.rb +1 -1
- metadata +5 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: deef1d8ce0aa71474ace3e813e28df01736d209b043734b7d83f7bb214a8eb5a
|
4
|
+
data.tar.gz: 31c8f2258bd54bab4a5f31cebcaf510f965b812fb7aca526098bb18878a41ce3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b11967dff6d336fc3360b731ec6178b255b43e5c502580185541361c7ca3b9df41b5cf1f5c408c7cb1b2719722ff237f687d3bcf0f472b07edbb6137317655ec
|
7
|
+
data.tar.gz: 4f5238c70548687dc966d4a440a424176619f2255fb00f0a0508a21cf6642f888c7070016efba63e0c18f54c47bfe4873612f843b1058560cfc6bb951d378aff
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -375,6 +375,16 @@ Rbexy.configure do |config|
|
|
375
375
|
end
|
376
376
|
```
|
377
377
|
|
378
|
+
Or in Rails you can customize the component provider just for a controller:
|
379
|
+
|
380
|
+
```ruby
|
381
|
+
class ThingsController < ApplicationController
|
382
|
+
def rbexy_component_provider
|
383
|
+
MyComponentProvider.new
|
384
|
+
end
|
385
|
+
end
|
386
|
+
```
|
387
|
+
|
378
388
|
See `lib/rbexy/component_providers/` for example implementations.
|
379
389
|
|
380
390
|
## Usage outside of Rails
|
data/docker-compose.yml
CHANGED
@@ -6,6 +6,7 @@ volumes:
|
|
6
6
|
services:
|
7
7
|
rbexy:
|
8
8
|
build: .
|
9
|
+
image: rbexy
|
9
10
|
volumes:
|
10
11
|
- .:/app
|
11
12
|
- bundle:/usr/local/bundle
|
@@ -13,3 +14,14 @@ services:
|
|
13
14
|
- $HOME/.gitconfig:/root/.gitconfig:ro
|
14
15
|
- $HOME/.gem/credentials:/root/.gem/credentials
|
15
16
|
working_dir: /app
|
17
|
+
dummy:
|
18
|
+
image: rbexy
|
19
|
+
volumes:
|
20
|
+
- .:/app
|
21
|
+
- bundle:/usr/local/bundle
|
22
|
+
working_dir: /app/spec/dummy/
|
23
|
+
command: ./start.sh
|
24
|
+
ports:
|
25
|
+
- 3000:3000
|
26
|
+
environment:
|
27
|
+
- RAILS_LOG_STDOUT=1
|
data/lib/rbexy/component.rb
CHANGED
@@ -1,22 +1,20 @@
|
|
1
1
|
require "action_view"
|
2
|
+
require "active_support/core_ext/class/attribute"
|
2
3
|
|
3
4
|
module Rbexy
|
4
5
|
class Component < ActionView::Base
|
5
|
-
class
|
6
|
-
def
|
7
|
-
|
8
|
-
value = key == :locale ? [context.locale] : context.send(key)
|
9
|
-
details_hash[key] = value
|
10
|
-
end
|
6
|
+
class TemplatePath < String
|
7
|
+
def to_s
|
8
|
+
self
|
11
9
|
end
|
10
|
+
end
|
12
11
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
end
|
12
|
+
def self.component_name
|
13
|
+
name.underscore
|
14
|
+
end
|
15
|
+
|
16
|
+
def component_name
|
17
|
+
self.class.component_name
|
20
18
|
end
|
21
19
|
|
22
20
|
def initialize(view_context, **props)
|
@@ -37,20 +35,18 @@ module Rbexy
|
|
37
35
|
def setup(**props); end
|
38
36
|
|
39
37
|
def render(&block)
|
40
|
-
@content = nil
|
41
38
|
@content_block = block_given? ? block : nil
|
42
39
|
call
|
43
40
|
end
|
44
41
|
|
45
42
|
def call
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
restore_lookup_context
|
43
|
+
path = TemplatePath.new(component_name)
|
44
|
+
template = view_context.lookup_context.find(path)
|
45
|
+
template.render(self, {})
|
50
46
|
end
|
51
47
|
|
52
48
|
def content
|
53
|
-
|
49
|
+
content_block ? view_context.capture(self, &content_block) : ""
|
54
50
|
end
|
55
51
|
|
56
52
|
def create_context(name, value)
|
@@ -64,37 +60,13 @@ module Rbexy
|
|
64
60
|
raise(ContextNotFound, "no parent context `#{name}`")
|
65
61
|
end
|
66
62
|
|
67
|
-
def
|
68
|
-
|
69
|
-
end
|
70
|
-
|
71
|
-
def component_name
|
72
|
-
self.class.name.underscore
|
63
|
+
def compiled_method_container
|
64
|
+
Rbexy::Component
|
73
65
|
end
|
74
66
|
|
75
67
|
private
|
76
68
|
|
77
|
-
attr_reader :view_context, :content_block
|
78
|
-
|
79
|
-
def replace_lookup_context
|
80
|
-
return if view_renderer.lookup_context.is_a? Rbexy::Component::LookupContext
|
81
|
-
@old_lookup_context = view_renderer.lookup_context
|
82
|
-
view_renderer.lookup_context = build_lookup_context(old_lookup_context)
|
83
|
-
end
|
84
|
-
|
85
|
-
def restore_lookup_context
|
86
|
-
return unless old_lookup_context
|
87
|
-
view_renderer.lookup_context = old_lookup_context
|
88
|
-
@old_lookup_context = nil
|
89
|
-
end
|
90
|
-
|
91
|
-
def build_lookup_context(existing_context)
|
92
|
-
paths = existing_context.view_paths.dup.unshift(
|
93
|
-
*Rbexy.configuration.template_paths.map { |p| ActionView::OptimizedFileSystemResolver.new(p) }
|
94
|
-
)
|
95
|
-
|
96
|
-
LookupContext.new(paths, LookupContext.details_hash(existing_context))
|
97
|
-
end
|
69
|
+
attr_reader :view_context, :content_block
|
98
70
|
|
99
71
|
def method_missing(meth, *args, &block)
|
100
72
|
if view_context.respond_to?(meth)
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Rbexy
|
2
|
+
module ComponentProviders
|
3
|
+
class NamespacedRbexyProvider < Rbexy::ComponentProviders::RbexyProvider
|
4
|
+
attr_reader :namespaces
|
5
|
+
|
6
|
+
def initialize(*namespaces)
|
7
|
+
@namespaces = namespaces
|
8
|
+
end
|
9
|
+
|
10
|
+
def find(name)
|
11
|
+
namespaces.each do |namespace|
|
12
|
+
result = super("#{namespace}::#{name}")
|
13
|
+
return result if result != nil
|
14
|
+
end
|
15
|
+
|
16
|
+
super
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/rbexy/configuration.rb
CHANGED
data/lib/rbexy/nodes.rb
CHANGED
@@ -85,11 +85,14 @@ module Rbexy
|
|
85
85
|
base_tag
|
86
86
|
end
|
87
87
|
|
88
|
+
context_open = Rbexy.configuration.enable_context ? "rbexy_context.push({});" : nil
|
89
|
+
context_close = Rbexy.configuration.enable_context ? "rbexy_context.pop;" : nil
|
90
|
+
|
88
91
|
[
|
89
92
|
"Rbexy::OutputBuffer.new.tap { |output|",
|
90
|
-
|
91
|
-
"output << (#{tag});",
|
92
|
-
|
93
|
+
context_open,
|
94
|
+
"output << (#{tag}).html_safe;",
|
95
|
+
context_close,
|
93
96
|
"}.html_safe"
|
94
97
|
].join(" ")
|
95
98
|
end
|
data/lib/rbexy/output_buffer.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
|
+
require "active_support/core_ext/string/output_safety"
|
2
|
+
|
1
3
|
module Rbexy
|
2
|
-
class OutputBuffer <
|
4
|
+
class OutputBuffer < ActiveSupport::SafeBuffer
|
3
5
|
def <<(content)
|
4
|
-
value = content.is_a?(Array) ? content.join : content
|
6
|
+
value = content.is_a?(Array) ? content.join.html_safe : content
|
5
7
|
super([nil, false].include?(value) ? "" : value.to_s)
|
6
8
|
end
|
7
9
|
end
|
data/lib/rbexy/rails.rb
CHANGED
@@ -2,7 +2,8 @@ module Rbexy
|
|
2
2
|
autoload :Component, "rbexy/component"
|
3
3
|
|
4
4
|
module Rails
|
5
|
-
autoload :TemplateHandler, "rbexy/rails/template_handler"
|
6
5
|
autoload :Engine, "rbexy/rails/engine"
|
6
|
+
autoload :ControllerHelper, "rbexy/rails/controller_helper"
|
7
|
+
autoload :ComponentTemplateResolver, "rbexy/rails/component_template_resolver"
|
7
8
|
end
|
8
9
|
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "action_view"
|
2
|
+
|
3
|
+
module Rbexy
|
4
|
+
module Rails
|
5
|
+
class ComponentTemplateResolver < ActionView::FileSystemResolver
|
6
|
+
# Rails 6 requires us to override `_find_all` in order to hook
|
7
|
+
def _find_all(name, prefix, partial, details, key, locals)
|
8
|
+
find_templates(name, prefix, partial, details, locals)
|
9
|
+
end
|
10
|
+
|
11
|
+
# Rails 5 only requires `find_templates` (which tbh is the proper way
|
12
|
+
# to implement subclasses of ActionView::Resolver)
|
13
|
+
def find_templates(name, prefix, partial, details, locals = [])
|
14
|
+
return [] unless name.is_a? Rbexy::Component::TemplatePath
|
15
|
+
|
16
|
+
templates_path = File.join(@path, prefix, name)
|
17
|
+
extensions = details[:handlers].join(",")
|
18
|
+
|
19
|
+
Dir["#{templates_path}.*{#{extensions}}"].map do |template_path|
|
20
|
+
source = File.binread(template_path)
|
21
|
+
handler = ActionView::Template.handler_for_extension(File.extname(template_path)[1..-1])
|
22
|
+
virtual_path = ["rbexy_component", prefix, name].join("/")
|
23
|
+
|
24
|
+
ActionView::Template.new(
|
25
|
+
source,
|
26
|
+
template_path,
|
27
|
+
handler,
|
28
|
+
locals: [],
|
29
|
+
virtual_path: virtual_path
|
30
|
+
)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require "active_support/concern"
|
2
|
+
|
3
|
+
module Rbexy
|
4
|
+
module Rails
|
5
|
+
module ControllerHelper
|
6
|
+
extend ActiveSupport::Concern
|
7
|
+
|
8
|
+
def rbexy_component_provider; end
|
9
|
+
|
10
|
+
class_methods do
|
11
|
+
def inherited(klass)
|
12
|
+
super
|
13
|
+
Rbexy.configuration.template_paths.each do |path|
|
14
|
+
prepend_view_path(Rbexy::Rails::ComponentTemplateResolver.new(path))
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/lib/rbexy/rails/engine.rb
CHANGED
@@ -12,6 +12,8 @@ module Rbexy
|
|
12
12
|
|
13
13
|
ActiveSupport.on_load :action_controller_base do
|
14
14
|
helper Rbexy::ViewContextHelper
|
15
|
+
helper_method :rbexy_component_provider
|
16
|
+
include ControllerHelper
|
15
17
|
end
|
16
18
|
|
17
19
|
if defined?(ViewComponent)
|
@@ -22,6 +24,7 @@ module Rbexy
|
|
22
24
|
require "rbexy/component_providers/rbexy_provider"
|
23
25
|
config.component_provider = Rbexy::ComponentProviders::RbexyProvider.new
|
24
26
|
config.template_paths << ::Rails.root.join("app", "components")
|
27
|
+
config.enable_context = true
|
25
28
|
end
|
26
29
|
end
|
27
30
|
end
|
data/lib/rbexy/runtime.rb
CHANGED
@@ -11,7 +11,11 @@ module Rbexy
|
|
11
11
|
|
12
12
|
DefaultTagBuilder = ActionView::Helpers::TagHelper::TagBuilder
|
13
13
|
|
14
|
-
def self.create_tag_builder(context, provider =
|
14
|
+
def self.create_tag_builder(context, provider = nil)
|
15
|
+
provider = provider ||
|
16
|
+
provider_from_context(context) ||
|
17
|
+
Rbexy.configuration.component_provider
|
18
|
+
|
15
19
|
if provider
|
16
20
|
ComponentTagBuilder.new(context, provider)
|
17
21
|
else
|
@@ -19,6 +23,12 @@ module Rbexy
|
|
19
23
|
end
|
20
24
|
end
|
21
25
|
|
26
|
+
def self.provider_from_context(context)
|
27
|
+
if context.respond_to?(:rbexy_component_provider)
|
28
|
+
context.rbexy_component_provider
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
22
32
|
def initialize(component_provider = nil)
|
23
33
|
@rbexy_tag = self.class.create_tag_builder(self, component_provider)
|
24
34
|
end
|
data/lib/rbexy/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rbexy
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nick Giancola
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-10-
|
11
|
+
date: 2020-10-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -224,6 +224,7 @@ files:
|
|
224
224
|
- example.rb
|
225
225
|
- lib/rbexy.rb
|
226
226
|
- lib/rbexy/component.rb
|
227
|
+
- lib/rbexy/component_providers/namespaced_rbexy_provider.rb
|
227
228
|
- lib/rbexy/component_providers/rbexy_provider.rb
|
228
229
|
- lib/rbexy/component_providers/view_component_provider.rb
|
229
230
|
- lib/rbexy/component_tag_builder.rb
|
@@ -234,6 +235,8 @@ files:
|
|
234
235
|
- lib/rbexy/output_buffer.rb
|
235
236
|
- lib/rbexy/parser.rb
|
236
237
|
- lib/rbexy/rails.rb
|
238
|
+
- lib/rbexy/rails/component_template_resolver.rb
|
239
|
+
- lib/rbexy/rails/controller_helper.rb
|
237
240
|
- lib/rbexy/rails/engine.rb
|
238
241
|
- lib/rbexy/runtime.rb
|
239
242
|
- lib/rbexy/version.rb
|