rbexy 0.3.1 → 1.0.0

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: e21e51ccf4a683d3f4c26ef53af86382de7fd9b26e3db2a0790fdf6d7e3df800
4
- data.tar.gz: f956dd52d3e20229df1290269f17fe28a7cd352cfa4b2c5649ede1f38f8bb9dd
3
+ metadata.gz: 20306c3d1c288a652a8a9d4d455c9378a22165ef7c07240e234159794cd02d18
4
+ data.tar.gz: 4c8e6b19cd8f47744aba8e2850fbc73425678252628a7c6c46e31abf66937e97
5
5
  SHA512:
6
- metadata.gz: e792baa90cab354b588425c5a5851c5c23372c7cafcdb34e65d79bdd8a75b7271668dd02867a4987f6687ee704d4f8d63201e5192cb49a9fa27377610968fb07
7
- data.tar.gz: 3d022540841d61746e14b909c70e3e7e769c78e6d03bbc5ca87dd6f611043a197309e83ab068a903089a201f88f7941edd5c1effc68497bb156ec203da2814bc
6
+ metadata.gz: 70920c8f7a9da04edccbe8de30b6b12ad10e9bfe3d6a4657d412e74cad1f23c705c3bd213c81d15859b18457917f4dd5672030fd4d0072dd06bbf894c2d8eb15
7
+ data.tar.gz: 0aa89cce16b4011a91b2ffeb89472ec687b40bcd9f97f061dd85e7f01507fe034e4b3388fb14da066921c98846187f3c77b154b3d1d03b145716a7e50e9a4657
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rbexy (0.3.1)
4
+ rbexy (1.0.0)
5
5
  actionview (>= 5.0, < 7.0)
6
6
  activesupport (>= 5.0, < 7.0)
7
7
  railties (>= 5.0, < 7.0)
@@ -201,7 +201,7 @@ PLATFORMS
201
201
  DEPENDENCIES
202
202
  guard-rspec (~> 4.7, >= 4.7.3)
203
203
  pry-byebug
204
- rails (>= 5.0, < 7.0)
204
+ rails (>= 6.0, < 7.0)
205
205
  rake
206
206
  rbexy!
207
207
  rspec (~> 3.9)
data/README.md CHANGED
@@ -48,6 +48,8 @@ Add it to your Gemfile and `bundle install`:
48
48
  gem "rbexy"
49
49
  ```
50
50
 
51
+ _From 1.0 onward, we only support Rails 6. If you're using Rails 5, use the 0.x releases._
52
+
51
53
  In `config/application.rb`:
52
54
 
53
55
  ```ruby
@@ -6,7 +6,6 @@ module Rbexy
6
6
  autoload :Nodes, "rbexy/nodes"
7
7
  autoload :Runtime, "rbexy/runtime"
8
8
  autoload :HashMash, "rbexy/hash_mash"
9
- autoload :OutputBuffer, "rbexy/output_buffer"
10
9
  autoload :ComponentTagBuilder, "rbexy/component_tag_builder"
11
10
  autoload :ViewContextHelper, "rbexy/view_context_helper"
12
11
  autoload :Configuration, "rbexy/configuration"
@@ -3,6 +3,8 @@ require "active_support/core_ext/class/attribute"
3
3
 
4
4
  module Rbexy
5
5
  class Component < ActionView::Base
6
+ autoload :BacktraceCleaner, "rbexy/component/backtrace_cleaner"
7
+
6
8
  class TemplatePath < String
7
9
  def to_s
8
10
  self
@@ -43,10 +45,13 @@ module Rbexy
43
45
  path = TemplatePath.new(component_name)
44
46
  template = view_context.lookup_context.find(path)
45
47
  template.render(self, {})
48
+ rescue ActionView::Template::Error => error
49
+ error.set_backtrace clean_template_backtrace(error.backtrace)
50
+ raise error
46
51
  end
47
52
 
48
53
  def content
49
- content_block ? view_context.capture(self, &content_block) : ""
54
+ content_block ? content_block.call : ""
50
55
  end
51
56
 
52
57
  def create_context(name, value)
@@ -75,5 +80,10 @@ module Rbexy
75
80
  super
76
81
  end
77
82
  end
83
+
84
+ def clean_template_backtrace(backtrace)
85
+ return backtrace if Rbexy.configuration.debug
86
+ BacktraceCleaner.new(backtrace).call
87
+ end
78
88
  end
79
89
  end
@@ -0,0 +1,59 @@
1
+ module Rbexy
2
+ class Component
3
+ class BacktraceCleaner
4
+ attr_reader :backtrace
5
+
6
+ def initialize(backtrace)
7
+ @backtrace = backtrace
8
+ @found_templates = {}
9
+ end
10
+
11
+ def call
12
+ backtrace
13
+ .reject(&method(:internal_implementation_detail?))
14
+ .map(&method(:strip_rbx_internals_block_mention))
15
+ end
16
+
17
+ private
18
+
19
+ attr_reader :found_templates
20
+
21
+ def internal_implementation_detail?(line)
22
+ if template = template_name_if_rbx_internals(line)
23
+ redundant_internal_block?(line, template)
24
+ else
25
+ internal_method_call?(line)
26
+ end
27
+ end
28
+
29
+ def internal_method_call?(line)
30
+ line =~ /lib\/rbexy\/.*\.rb/ ||
31
+ line =~ /lib\/action_view\/.*\.rb/ ||
32
+ line =~ /lib\/active_support\/notifications\.rb/
33
+ end
34
+
35
+ def redundant_internal_block?(line, template)
36
+ if found_templates[template]
37
+ true
38
+ else
39
+ found_templates[template] = true
40
+ false
41
+ end
42
+ end
43
+
44
+ def strip_rbx_internals_block_mention(line)
45
+ if template_name_if_rbx_internals(line)
46
+ line.gsub(/block (\(\d+ levels\))? ?in /, "")
47
+ else
48
+ line
49
+ end
50
+ end
51
+
52
+ def template_name_if_rbx_internals(line)
53
+ if /\/(?<template>[^\/]*)\.rbx:\d+:in `(block |_)/ =~ line
54
+ template
55
+ end
56
+ end
57
+ end
58
+ end
59
+ end
@@ -3,6 +3,7 @@ module Rbexy
3
3
  attr_accessor :component_provider
4
4
  attr_accessor :template_paths
5
5
  attr_accessor :enable_context
6
+ attr_accessor :debug
6
7
 
7
8
  def template_paths
8
9
  @template_paths ||= []
@@ -237,7 +237,6 @@ module Rbexy
237
237
  end
238
238
 
239
239
  def potential_expression_inner_tag
240
- # binding.pry
241
240
  if self.curr_expr =~ Patterns.expression_internal_tag_prefixes
242
241
  tokens << [:EXPRESSION_BODY, curr_expr]
243
242
  self.curr_expr = ""
@@ -18,11 +18,7 @@ module Rbexy
18
18
  end
19
19
 
20
20
  def compile
21
- [
22
- "Rbexy::OutputBuffer.new.tap { |output|",
23
- children.map(&:compile).map { |c| "output << (#{c})"}.join(";"),
24
- "}.html_safe"
25
- ].join(" ")
21
+ "#{children.map(&:compile).map { |c| "@output_buffer << rbexy_prep_output(#{c})"}.join(";")};@output_buffer"
26
22
  end
27
23
  end
28
24
 
@@ -75,26 +71,24 @@ module Rbexy
75
71
  base_tag = "rbexy_tag.#{Util.safe_tag_name(name)}(#{compile_members})"
76
72
  tag = if children.length > 0
77
73
  [
78
- "#{base_tag} {",
79
- "Rbexy::OutputBuffer.new.tap { |output|",
80
- children.map(&:compile).map { |c| "output << (#{c})"}.join(";"),
81
- "}.html_safe",
82
- "}"
83
- ].join(" ")
74
+ "#{base_tag} { capture {",
75
+ children.map(&:compile).map { |c| "@output_buffer << rbexy_prep_output(#{c})" }.join(";"),
76
+ "} }"
77
+ ].join
84
78
  else
85
79
  base_tag
86
- end
87
-
88
- context_open = Rbexy.configuration.enable_context ? "rbexy_context.push({});" : nil
89
- context_close = Rbexy.configuration.enable_context ? "rbexy_context.pop;" : nil
80
+ end + ".html_safe"
90
81
 
91
- [
92
- "Rbexy::OutputBuffer.new.tap { |output|",
93
- context_open,
94
- "output << (#{tag}).html_safe;",
95
- context_close,
96
- "}.html_safe"
97
- ].join(" ")
82
+ if Rbexy.configuration.enable_context
83
+ [
84
+ "(",
85
+ "rbexy_context.push({});",
86
+ "#{tag}.tap { rbexy_context.pop }",
87
+ ")"
88
+ ].join
89
+ else
90
+ tag
91
+ end
98
92
  end
99
93
 
100
94
  def compile_members
@@ -34,6 +34,7 @@ module Rbexy
34
34
  end
35
35
 
36
36
  def evaluate(code)
37
+ @output_buffer = ActionView::OutputBuffer.new
37
38
  instance_eval(code)
38
39
  rescue => e
39
40
  e.set_backtrace(e.backtrace.map { |l| l.gsub("(eval)", "(rbx template string)") })
@@ -1,3 +1,3 @@
1
1
  module Rbexy
2
- VERSION = "0.3.1"
2
+ VERSION = "1.0.0"
3
3
  end
@@ -7,5 +7,13 @@ module Rbexy
7
7
  def rbexy_context
8
8
  @rbexy_context ||= [{}]
9
9
  end
10
+
11
+ def rbexy_prep_output(*content)
12
+ return if content.length == 0
13
+ content = content.first
14
+
15
+ value = content.is_a?(Array) ? content.join.html_safe : content
16
+ [nil, false].include?(value) ? "" : value.to_s
17
+ end
10
18
  end
11
19
  end
@@ -29,7 +29,7 @@ Gem::Specification.new do |spec|
29
29
  spec.add_dependency "actionview", ">= 5.0", "< 7.0"
30
30
  spec.add_dependency "railties", ">= 5.0", "< 7.0"
31
31
 
32
- spec.add_development_dependency "rails", ">= 5.0", "< 7.0"
32
+ spec.add_development_dependency "rails", ">= 6.0", "< 7.0"
33
33
  spec.add_development_dependency "rspec", "~> 3.9"
34
34
  spec.add_development_dependency "guard-rspec", "~> 4.7", ">= 4.7.3"
35
35
  spec.add_development_dependency "rspec-rails", "~> 4.0", ">= 4.0.1"
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.3.1
4
+ version: 1.0.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-29 00:00:00.000000000 Z
11
+ date: 2020-11-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -76,7 +76,7 @@ dependencies:
76
76
  requirements:
77
77
  - - ">="
78
78
  - !ruby/object:Gem::Version
79
- version: '5.0'
79
+ version: '6.0'
80
80
  - - "<"
81
81
  - !ruby/object:Gem::Version
82
82
  version: '7.0'
@@ -86,7 +86,7 @@ dependencies:
86
86
  requirements:
87
87
  - - ">="
88
88
  - !ruby/object:Gem::Version
89
- version: '5.0'
89
+ version: '6.0'
90
90
  - - "<"
91
91
  - !ruby/object:Gem::Version
92
92
  version: '7.0'
@@ -224,6 +224,7 @@ files:
224
224
  - example.rb
225
225
  - lib/rbexy.rb
226
226
  - lib/rbexy/component.rb
227
+ - lib/rbexy/component/backtrace_cleaner.rb
227
228
  - lib/rbexy/component_providers/namespaced_rbexy_provider.rb
228
229
  - lib/rbexy/component_providers/rbexy_provider.rb
229
230
  - lib/rbexy/component_providers/view_component_provider.rb
@@ -232,7 +233,6 @@ files:
232
233
  - lib/rbexy/hash_mash.rb
233
234
  - lib/rbexy/lexer.rb
234
235
  - lib/rbexy/nodes.rb
235
- - lib/rbexy/output_buffer.rb
236
236
  - lib/rbexy/parser.rb
237
237
  - lib/rbexy/rails.rb
238
238
  - lib/rbexy/rails/component_template_resolver.rb
@@ -1,10 +0,0 @@
1
- require "active_support/core_ext/string/output_safety"
2
-
3
- module Rbexy
4
- class OutputBuffer < ActiveSupport::SafeBuffer
5
- def <<(content)
6
- value = content.is_a?(Array) ? content.join.html_safe : content
7
- super([nil, false].include?(value) ? "" : value.to_s)
8
- end
9
- end
10
- end