Class: Antoinette::Weaver

Inherits:
Object
  • Object
show all
Defined in:
lib/antoinette/services/weaver.rb

Defined Under Namespace

Classes: Bundle

Instance Method Summary collapse

Constructor Details

#initialize(elm_analyzer: ElmAppUsageAnalyzer.new, partial_resolver: PartialResolver.new, layout_resolver: LayoutResolver.new, custom_view_paths: []) ⇒ Weaver

Returns a new instance of Weaver.



10
11
12
13
14
15
16
17
18
19
20
# File 'lib/antoinette/services/weaver.rb', line 10

def initialize(
  elm_analyzer: ElmAppUsageAnalyzer.new,
  partial_resolver: PartialResolver.new,
  layout_resolver: LayoutResolver.new,
  custom_view_paths: []
)
  @elm_analyzer = elm_analyzer
  @partial_resolver = partial_resolver
  @layout_resolver = layout_resolver
  @custom_view_paths = custom_view_paths
end

Instance Method Details

#bundles ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/antoinette/services/weaver.rb', line 22

def bundles
  @bundles ||= begin
    result = []
    @elm_analyzer.mappings.each do |page_apps, templates|
      resolved = resolve_templates_from_partials(templates)
      groups = resolved.group_by { |t| @layout_resolver.apps_for(t) }
      groups.each do |layout_apps, group_templates|
        merged = (page_apps + layout_apps).uniq.sort
        result << Bundle.new(Haikunator.haikunate, merged, group_templates.sort)
      end
    end
    result.sort_by { |b| -b.elm_apps.count }
  end
end

#generate_json ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
# File 'lib/antoinette/services/weaver.rb', line 37

def generate_json
  output = {bundles: bundles.map do |bundle|
    {
      name: bundle.name,
      elm_apps: bundle.elm_apps,
      templates: bundle.templates
    }
  end}
  output[:custom_view_paths] = @custom_view_paths if @custom_view_paths.any?
  JSON.pretty_generate(output)
end

#resolve_templates_from_partials(templates) ⇒ Object



49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/antoinette/services/weaver.rb', line 49

def resolve_templates_from_partials(templates)
  templates.flat_map do |template|
    if template.start_with?("_") || template.include?("/_")
      partial_path = template.sub(%r{^app/views/}, "")
      @partial_resolver.resolve(partial_path).map do |parent|
        "app/views/#{parent}"
      end
    else
      template
    end
  end.uniq
end