Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 0 additions & 61 deletions lib/jbuilder/dependency_tracker.rb

This file was deleted.

73 changes: 73 additions & 0 deletions lib/jbuilder/jbuilder_dependency_tracker.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
class Jbuilder::DependencyTracker
EXPLICIT_DEPENDENCY = /# Template Dependency: (\S+)/

# Matches:
# json.partial! "messages/message"
# json.partial!('messages/message')
#
DIRECT_RENDERS = /
\w+\.partial! # json.partial!
\(?\s* # optional parenthesis
(['"])([^'"]+)\1 # quoted value
/x

# Matches:
# json.partial! partial: "comments/comment"
# json.comments @post.comments, partial: "comments/comment", as: :comment
# json.array! @posts, partial: "posts/post", as: :post
# = render partial: "account"
#
INDIRECT_RENDERS = /
(?::partial\s*=>|partial:) # partial: or :partial =>
\s* # optional whitespace
(['"])([^'"]+)\1 # quoted value
/x

def self.call(name, template, view_paths = nil)
new(name, template, view_paths).dependencies
end

def initialize(name, template, view_paths = nil)
@name, @template, @view_paths = name, template, view_paths
end

def dependencies
direct_dependencies + indirect_dependencies + explicit_dependencies
end

private

attr_reader :name, :template

def direct_dependencies
source.scan(DIRECT_RENDERS).map(&:second)
end

def indirect_dependencies
source.scan(INDIRECT_RENDERS).map(&:second)
end

def explicit_dependencies
dependencies = source.scan(EXPLICIT_DEPENDENCY).flatten.uniq

wildcards, explicits = dependencies.partition { |dependency| dependency.end_with?("/*") }

(explicits + resolve_directories(wildcards)).uniq
end

def resolve_directories(wildcard_dependencies)
return [] unless @view_paths
return [] if wildcard_dependencies.empty?

# Remove trailing "/*"
prefixes = wildcard_dependencies.map { |query| query[0..-3] }

@view_paths.flat_map(&:all_template_paths).uniq.filter_map { |path|
path.to_s if prefixes.include?(path.prefix)
}.sort
end

def source
template.source
end
end
3 changes: 1 addition & 2 deletions test/jbuilder_dependency_tracker_test.rb
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
require 'test_helper'
require 'jbuilder/dependency_tracker'

require 'jbuilder/jbuilder_dependency_tracker'

class FakeTemplate
attr_reader :source, :handler
Expand Down