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 |