Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: opal/opal
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: 9ed5401718c5^
Choose a base ref
...
head repository: opal/opal
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: 8c18b42f759f
Choose a head ref
  • 5 commits
  • 10 files changed
  • 1 contributor

Commits on Sep 30, 2014

  1. Copy the full SHA
    9ed5401 View commit details
  2. Copy the full SHA
    791c64d View commit details
  3. Copy the full SHA
    f481eed View commit details
  4. Copy the full SHA
    0530528 View commit details
  5. Copy the full SHA
    8c18b42 View commit details
24 changes: 17 additions & 7 deletions lib/opal/builder.rb
Original file line number Diff line number Diff line change
@@ -32,8 +32,9 @@ def build(path, options = {})
end

def build_str source, filename, options = {}
asset = processor_for(source, filename, options)
requires = preload + asset.requires
path = path_reader.expand(filename).to_s unless stub?(filename)
asset = processor_for(source, filename, path, options)
requires = preload + asset.requires + tree_requires(asset, path)
requires.map { |r| process_require(r, options) }
processed << asset
self
@@ -61,11 +62,18 @@ def source_map

private

def processor_for(source, filename, options)
unless stub?(filename)
full_filename = path_reader.expand(filename).to_s
processor = processors.find { |p| p.match? full_filename }
def tree_requires(asset, path)
asset.required_trees.flat_map do |tree|
base = File.expand_path(File.dirname(path))
expanded = File.expand_path File.join(base, tree, '*.rb')
Dir[expanded].map do |file|
file.gsub(/(\.js)?(\.(?:rb|opal))/, '')[(base.size+1)..-1]
end
end
end

def processor_for(source, filename, path, options)
processor = processors.find { |p| p.match? path }
processor ||= default_processor
return processor.new(source, filename, compiler_options.merge(options))
end
@@ -77,7 +85,9 @@ def process_require(filename, options)

source = stub?(filename) ? '' : path_reader.read(filename)
raise ArgumentError, "can't find file: #{filename.inspect}" if source.nil?
asset = processor_for(source, filename, options.merge(requirable: true))

path = path_reader.expand(filename).to_s unless stub?(filename)
asset = processor_for(source, filename, path, options.merge(requirable: true))
process_requires(asset, options)
processed << asset
end
7 changes: 6 additions & 1 deletion lib/opal/builder_processors.rb
Original file line number Diff line number Diff line change
@@ -13,8 +13,9 @@ def self.inherited(processor)
def initialize(source, filename, options = {})
@source, @filename, @options = source, filename, options
@requires = []
@required_trees = []
end
attr_reader :source, :filename, :options, :requires
attr_reader :source, :filename, :options, :requires, :required_trees

def to_s
source.to_s
@@ -68,6 +69,10 @@ def requires
compiled.requires
end

def required_trees
compiled.required_trees
end

def compiler_class
::Opal::Compiler
end
6 changes: 6 additions & 0 deletions lib/opal/compiler.rb
Original file line number Diff line number Diff line change
@@ -211,6 +211,12 @@ def requires
@requires ||= []
end

# An array of trees required in this file
# (typically by calling #require_tree)
def required_trees
@required_trees ||= []
end

# The last sexps in method bodies, for example, need to be returned
# in the compiled javascript. Due to syntax differences between
# javascript any ruby, some sexps need to be handled specially. For
10 changes: 10 additions & 0 deletions lib/opal/nodes/call.rb
Original file line number Diff line number Diff line change
@@ -186,6 +186,16 @@ def compile_default?
end
end

add_special :require_tree do
compile_default!
arg = arglist[1]
if arg[0] == :str
dir = File.dirname(compiler.file)
compiler.required_trees << arg[1]
end
push fragment('')
end

add_special :block_given? do
push compiler.handle_block_given_call @sexp
end
5 changes: 5 additions & 0 deletions spec/lib/builder_processors_spec.rb
Original file line number Diff line number Diff line change
@@ -18,5 +18,10 @@
expect(processor.to_s).not_to include('Opal.modules[')
end
end

it 'fills required_trees' do
processor = described_class.new('require_tree "./pippo"', '-e')
expect(processor.required_trees).to eq(['./pippo'])
end
end

9 changes: 9 additions & 0 deletions spec/lib/builder_spec.rb
Original file line number Diff line number Diff line change
@@ -10,6 +10,15 @@
expect(builder.build('opal').to_s).to match('(Opal);')
end

it 'respect #require_tree calls' do
begin
Opal.append_path(File.expand_path('../fixtures/', __FILE__))
expect(builder.build('require_tree_test').to_s).to match('required_file1')
ensure
Opal.instance_variable_set('@paths', nil)
end
end

describe ':stubs' do
let(:options) { {stubs: ['foo']} }

10 changes: 10 additions & 0 deletions spec/lib/compiler_spec.rb
Original file line number Diff line number Diff line change
@@ -175,6 +175,16 @@
expect(compiler.requires).to eq([__FILE__])
end
end

describe '#require_tree' do
require 'pathname'
let(:file) { Pathname(__FILE__).join('../fixtures/require_tree_test.rb') }

it 'parses and resolve #require argument' do
compiler = compiler_for(file.read)
expect(compiler.required_trees).to eq(['./required_tree_test'])
end
end
end

def expect_compiled(*args)
2 changes: 1 addition & 1 deletion spec/lib/fixtures/require_tree_test.rb
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
#=require_tree ./required_tree_test
require_tree './required_tree_test'

puts 5
3 changes: 3 additions & 0 deletions spec/lib/fixtures/sprockets_require_tree_test.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
#=require_tree ./required_tree_test

puts 5
10 changes: 9 additions & 1 deletion spec/lib/sprockets/environment_spec.rb
Original file line number Diff line number Diff line change
@@ -12,8 +12,16 @@
expect(env[logical_path+'.js'].source).to include('$puts(')
end

describe 'require_tree sprockets directive' do
it 'is still supported' do
source = env['sprockets_require_tree_test'].source
expect(source).to include('required_file1')
expect(source).to include('required_file2')
end
end

describe 'require_tree helper' do
it 'does something' do
it 'is handled by the processor' do
source = env['require_tree_test'].source
expect(source).to include('required_file1')
expect(source).to include('required_file2')