Class: ViewComponent::Compiler
- Inherits:
-
Object
- Object
- ViewComponent::Compiler
- Defined in:
- lib/view_component/compiler.rb
Constant Summary collapse
- DEVELOPMENT_MODE =
Compiler mode. Can be either:
-
development (a blocking mode which ensures thread safety when redefining the ‘call` method for components,
default in Rails development and test mode)
-
production (a non-blocking mode, default in Rails production mode)
-
:development
- PRODUCTION_MODE =
:production
Instance Attribute Summary collapse
-
#__vc_compiler_lock ⇒ Object
readonly
Lock required to be obtained before compiling the component.
Instance Method Summary collapse
- #compile(raise_errors: false, force: false) ⇒ Object
- #compiled? ⇒ Boolean
- #development? ⇒ Boolean
-
#initialize(component_class) ⇒ Compiler
constructor
A new instance of Compiler.
- #reset_render_template_for ⇒ Object
- #with_lock(&block) ⇒ Object
Constructor Details
#initialize(component_class) ⇒ Compiler
Returns a new instance of Compiler.
17 18 19 20 |
# File 'lib/view_component/compiler.rb', line 17 def initialize(component_class) @component_class = component_class @__vc_compiler_lock = Monitor.new end |
Instance Attribute Details
#__vc_compiler_lock ⇒ Object (readonly)
Lock required to be obtained before compiling the component
6 7 8 |
# File 'lib/view_component/compiler.rb', line 6 def __vc_compiler_lock @__vc_compiler_lock end |
Instance Method Details
#compile(raise_errors: false, force: false) ⇒ Object
30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
# File 'lib/view_component/compiler.rb', line 30 def compile(raise_errors: false, force: false) return if compiled? && !force return if component_class == ViewComponent::Base with_lock do subclass_instance_methods = component_class.instance_methods(false) if subclass_instance_methods.include?(:with_content) && raise_errors raise ViewComponent::ComponentError.new( "#{component_class} implements a reserved method, `#with_content`.\n\n" \ "To fix this issue, change the name of the method." ) end if template_errors.present? raise ViewComponent::TemplateError.new(template_errors) if raise_errors return false end if subclass_instance_methods.include?(:before_render_check) ViewComponent::Deprecation.warn( "`#before_render_check` will be removed in v3.0.0.\n\n" \ "To fix this issue, use `#before_render` instead." ) end if raise_errors component_class.validate_initialization_parameters! component_class.validate_collection_parameter! end templates.each do |template| # Remove existing compiled template methods, # as Ruby warns when redefining a method. method_name = call_method_name(template[:variant]) if component_class.instance_methods(false).include?(method_name.to_sym) component_class.send(:remove_method, method_name.to_sym) end component_class.class_eval <<-RUBY, template[:path], 0 def #{method_name} #{compiled_template(template[:path])} end RUBY end define_render_template_for component_class.build_i18n_backend component_class._after_compile CompileCache.register(component_class) end end |
#compiled? ⇒ Boolean
22 23 24 |
# File 'lib/view_component/compiler.rb', line 22 def compiled? CompileCache.compiled?(component_class) end |
#development? ⇒ Boolean
26 27 28 |
# File 'lib/view_component/compiler.rb', line 26 def development? self.class.mode == DEVELOPMENT_MODE end |
#reset_render_template_for ⇒ Object
95 96 97 98 99 |
# File 'lib/view_component/compiler.rb', line 95 def reset_render_template_for if component_class.instance_methods(false).include?(:render_template_for) component_class.send(:remove_method, :render_template_for) end end |
#with_lock(&block) ⇒ Object
87 88 89 90 91 92 93 |
# File 'lib/view_component/compiler.rb', line 87 def with_lock(&block) if development? __vc_compiler_lock.synchronize(&block) else block.call end end |