contao 0.4.2 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/contao.gemspec +2 -8
- data/lib/contao.rb +1 -54
- data/lib/contao/application.rb +13 -23
- data/lib/contao/commands/help.rb +1 -1
- data/lib/contao/generators/base.rb +1 -3
- data/lib/contao/notifier.rb +3 -3
- data/lib/contao/railtie.rb +11 -0
- data/lib/contao/ui.rb +219 -0
- data/lib/contao/version.rb +1 -1
- data/lib/{contao/tasks → tasks}/contao.rake +18 -19
- data/lib/{contao/tasks → tasks}/whitespace.rake +0 -0
- data/spec/lib/contao/application_spec.rb +6 -8
- data/spec/lib/contao/notifier_spec.rb +15 -15
- data/spec/spec_helper.rb +6 -14
- data/spec/support/filesystem_mock.rb +40 -11
- data/spec/support/stub_rails.rb +29 -0
- metadata +12 -128
- data/lib/contao/coffeescript_compiler.rb +0 -58
- data/lib/contao/compiler.rb +0 -128
- data/lib/contao/javascript_compiler.rb +0 -77
- data/lib/contao/stylesheet_compiler.rb +0 -56
- data/lib/contao/tasks/assets.rake +0 -22
- data/lib/contao/tasks/jasmine.rake +0 -8
- data/lib/guard/assets.rb +0 -117
- data/lib/monkey_patches.rb +0 -1
- data/lib/monkey_patches/compass/urls.rb +0 -81
- data/spec/lib/contao/coffeescript_compiler_spec.rb +0 -85
- data/spec/lib/contao/javascript_compiler_spec.rb +0 -91
- data/spec/lib/contao/stylesheet_compiler_spec.rb +0 -117
- data/spec/lib/contao_spec.rb +0 -62
- data/spec/lib/guard/assets_spec.rb +0 -220
- data/spec/support/compiler_shared_examples.rb +0 -292
- data/spec/support/config_shared_examples.rb +0 -29
@@ -1,58 +0,0 @@
|
|
1
|
-
require 'coffee_script'
|
2
|
-
require 'contao/compiler'
|
3
|
-
require 'fileutils'
|
4
|
-
|
5
|
-
module TechnoGate
|
6
|
-
module Contao
|
7
|
-
class CoffeescriptCompiler < Compiler
|
8
|
-
|
9
|
-
def initialize(options = {})
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
|
-
def clean
|
14
|
-
FileUtils.rm_rf output_path.to_s if File.exists?(output_path)
|
15
|
-
|
16
|
-
super
|
17
|
-
end
|
18
|
-
|
19
|
-
protected
|
20
|
-
|
21
|
-
def input_from_config_path
|
22
|
-
Application.config.javascripts_path
|
23
|
-
end
|
24
|
-
|
25
|
-
def output_from_config_path
|
26
|
-
Contao.expandify("tmp/compiled_javascript")
|
27
|
-
end
|
28
|
-
|
29
|
-
def compiler_name
|
30
|
-
:coffeescript
|
31
|
-
end
|
32
|
-
|
33
|
-
# Compile assets
|
34
|
-
#
|
35
|
-
# This method compiled coffeescripts from
|
36
|
-
# Application.config.javascripts_path into
|
37
|
-
# Contao.root.join('tmp/compiled_javascript')
|
38
|
-
def compile_assets
|
39
|
-
input_path.each do |src_path|
|
40
|
-
Dir["#{Contao.expandify(src_path)}/**/*.coffee"].sort.each do |file|
|
41
|
-
dest = compute_destination_filename(src_path, file)
|
42
|
-
FileUtils.mkdir_p File.dirname(dest)
|
43
|
-
File.open(dest, 'w') do |f|
|
44
|
-
f.write ::CoffeeScript.compile(File.read(file))
|
45
|
-
end
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
|
50
|
-
def compute_destination_filename(src_path, file)
|
51
|
-
dest = "#{output_path}/#{src_path.gsub('/', '_')}/"
|
52
|
-
dest << file.gsub(/.*#{Regexp.escape src_path}\//, '').gsub(/\.coffee$/, '')
|
53
|
-
dest << '.js' unless File.extname(dest) == '.js'
|
54
|
-
dest
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
data/lib/contao/compiler.rb
DELETED
@@ -1,128 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/string/inflections'
|
2
|
-
require 'json'
|
3
|
-
|
4
|
-
module TechnoGate
|
5
|
-
module Contao
|
6
|
-
class Compiler
|
7
|
-
attr_accessor :options
|
8
|
-
|
9
|
-
def initialize(options = {})
|
10
|
-
@options = options
|
11
|
-
@manifest_path = assets_public_path.join('manifest.json')
|
12
|
-
end
|
13
|
-
|
14
|
-
# Compile assets
|
15
|
-
def compile
|
16
|
-
prepare_folders
|
17
|
-
compile_assets
|
18
|
-
create_hashed_assets if Contao.env == :production
|
19
|
-
generate_manifest
|
20
|
-
notify
|
21
|
-
|
22
|
-
self
|
23
|
-
end
|
24
|
-
|
25
|
-
def self.compile
|
26
|
-
new.compile
|
27
|
-
end
|
28
|
-
|
29
|
-
def clean
|
30
|
-
FileUtils.rm_rf Contao.expandify(Application.config.assets_public_path)
|
31
|
-
end
|
32
|
-
|
33
|
-
def self.clean
|
34
|
-
new.clean
|
35
|
-
end
|
36
|
-
|
37
|
-
protected
|
38
|
-
def assets_public_path
|
39
|
-
Contao.expandify(Contao::Application.config.assets_public_path)
|
40
|
-
end
|
41
|
-
|
42
|
-
def input_from_config_path
|
43
|
-
raise "Child class must define this"
|
44
|
-
end
|
45
|
-
|
46
|
-
def input_from_options
|
47
|
-
@options[:input][compiler_name] rescue nil
|
48
|
-
end
|
49
|
-
|
50
|
-
def input_path
|
51
|
-
input_from_options || input_from_config_path
|
52
|
-
end
|
53
|
-
|
54
|
-
def output_from_config_path
|
55
|
-
raise "Child class must define this"
|
56
|
-
end
|
57
|
-
|
58
|
-
def output_from_options
|
59
|
-
@options[:output][compiler_name] rescue nil
|
60
|
-
end
|
61
|
-
|
62
|
-
def output_path
|
63
|
-
output_from_options || output_from_config_path
|
64
|
-
end
|
65
|
-
|
66
|
-
# Prepare folders
|
67
|
-
def prepare_folders
|
68
|
-
FileUtils.mkdir_p assets_public_path
|
69
|
-
end
|
70
|
-
|
71
|
-
def compile_assets
|
72
|
-
end
|
73
|
-
|
74
|
-
def create_hashed_assets
|
75
|
-
end
|
76
|
-
|
77
|
-
def notify
|
78
|
-
klass_name = self.class.to_s.split('::').last
|
79
|
-
|
80
|
-
Notifier.notify("#{klass_name.underscore.humanize} finished successfully.", title: klass_name)
|
81
|
-
end
|
82
|
-
|
83
|
-
# Create a diges for a given file
|
84
|
-
#
|
85
|
-
# This method creates a digested file for a given file path
|
86
|
-
#
|
87
|
-
# @param [Pathname | String] file_path
|
88
|
-
def create_digest_for_file(file_path)
|
89
|
-
digest = Digest::MD5.hexdigest File.read(file_path)
|
90
|
-
digested_file_path = "#{file_path.to_s.chomp(File.extname(file_path))}-#{digest}#{File.extname(file_path)}"
|
91
|
-
FileUtils.cp file_path, digested_file_path
|
92
|
-
|
93
|
-
digested_file_path
|
94
|
-
end
|
95
|
-
|
96
|
-
# This method generates a manifest of all generated files
|
97
|
-
# so it can be parsed and processed by the PHP application
|
98
|
-
#
|
99
|
-
# This method is expected to be overridden
|
100
|
-
def generate_manifest
|
101
|
-
end
|
102
|
-
|
103
|
-
def generate_manifest_for(key, extension)
|
104
|
-
manifest = JSON.parse(File.read(@manifest_path)) rescue {}
|
105
|
-
manifest[key] = []
|
106
|
-
|
107
|
-
all_files = Dir["#{assets_public_path}/**/*.#{extension}"]
|
108
|
-
digested_files = all_files.select {|f| f =~ /^.+-[0-9a-f]{32}\.#{extension}$/}
|
109
|
-
non_digested_files = all_files - digested_files
|
110
|
-
|
111
|
-
if Contao.env == :production
|
112
|
-
files = digested_files
|
113
|
-
else
|
114
|
-
files = non_digested_files
|
115
|
-
end
|
116
|
-
|
117
|
-
files.each do |file|
|
118
|
-
file.slice! "#{assets_public_path}/"
|
119
|
-
manifest[key] << file
|
120
|
-
end
|
121
|
-
|
122
|
-
File.open(@manifest_path, 'w') do |f|
|
123
|
-
f.write(manifest.to_json)
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
127
|
-
end
|
128
|
-
end
|
@@ -1,77 +0,0 @@
|
|
1
|
-
require 'contao/compiler'
|
2
|
-
require 'fileutils'
|
3
|
-
require 'uglifier'
|
4
|
-
|
5
|
-
module TechnoGate
|
6
|
-
module Contao
|
7
|
-
class JavascriptCompiler < Compiler
|
8
|
-
|
9
|
-
def initialize(options = {})
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
|
-
protected
|
14
|
-
|
15
|
-
def compiler_name
|
16
|
-
:javascript
|
17
|
-
end
|
18
|
-
|
19
|
-
def input_from_config_path
|
20
|
-
Application.config.javascripts_path
|
21
|
-
end
|
22
|
-
|
23
|
-
def output_from_config_path
|
24
|
-
Contao.expandify(Application.config.assets_public_path)
|
25
|
-
end
|
26
|
-
|
27
|
-
# Compile assets
|
28
|
-
#
|
29
|
-
# This method compiles javascripts from
|
30
|
-
# Application.config.javascripts_path into
|
31
|
-
# Application.config.assets_public_path/application.js and it uglifies
|
32
|
-
# only if the environment is equal to :production
|
33
|
-
def compile_assets
|
34
|
-
tmp_app_js = Contao.root.join('tmp/application.js')
|
35
|
-
FileUtils.mkdir_p File.dirname(tmp_app_js)
|
36
|
-
|
37
|
-
File.open(tmp_app_js, 'w') do |compressed|
|
38
|
-
javascripts_path.each do |src_path|
|
39
|
-
Dir["#{Contao.expandify(src_path)}/**/*.js"].sort.each do |f|
|
40
|
-
if TechnoGate::Contao.env == :production
|
41
|
-
compressed.write(Uglifier.new.compile(File.read(f)))
|
42
|
-
else
|
43
|
-
compressed.write("// #{f}\n")
|
44
|
-
compressed.write(File.read(f))
|
45
|
-
compressed.write("\n")
|
46
|
-
end
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
FileUtils.mv tmp_app_js, application_js_path
|
52
|
-
end
|
53
|
-
|
54
|
-
# Generate source folders give the exact source and the folder
|
55
|
-
# under tmp/compiled_javascript on which CoffeeScript compiler
|
56
|
-
# adds javascript files to.
|
57
|
-
def javascripts_path
|
58
|
-
input_path.map do |path|
|
59
|
-
["tmp/compiled_javascript/#{path.gsub('/', '_')}", path]
|
60
|
-
end.flatten
|
61
|
-
end
|
62
|
-
|
63
|
-
# This function creates a hashed version of the assets
|
64
|
-
def create_hashed_assets
|
65
|
-
create_digest_for_file(Contao.expandify(Contao::Application.config.assets_public_path).join("application.js"))
|
66
|
-
end
|
67
|
-
|
68
|
-
def application_js_path
|
69
|
-
Pathname(output_from_config_path).join("application.js")
|
70
|
-
end
|
71
|
-
|
72
|
-
def generate_manifest
|
73
|
-
generate_manifest_for("javascripts", "js")
|
74
|
-
end
|
75
|
-
end
|
76
|
-
end
|
77
|
-
end
|
@@ -1,56 +0,0 @@
|
|
1
|
-
require 'contao/compiler'
|
2
|
-
require 'compass'
|
3
|
-
require 'compass/commands'
|
4
|
-
|
5
|
-
module TechnoGate
|
6
|
-
module Contao
|
7
|
-
class StylesheetCompiler < Compiler
|
8
|
-
|
9
|
-
def initialize(options = {})
|
10
|
-
super
|
11
|
-
end
|
12
|
-
|
13
|
-
def clean
|
14
|
-
@cleaner ||= Compass::Commands::CleanProject.new(
|
15
|
-
Contao.root,
|
16
|
-
configuration_file: Contao.root.join('config', 'compass.rb')
|
17
|
-
)
|
18
|
-
|
19
|
-
@cleaner.execute
|
20
|
-
|
21
|
-
super
|
22
|
-
end
|
23
|
-
|
24
|
-
protected
|
25
|
-
def compiler_name
|
26
|
-
:stylesheet
|
27
|
-
end
|
28
|
-
|
29
|
-
# This class can't be told where to get assets from or where to compile to
|
30
|
-
# unless I figure out how to configure the UpdateProject without a file
|
31
|
-
def input_from_config_path
|
32
|
-
end
|
33
|
-
def output_from_config_path
|
34
|
-
end
|
35
|
-
|
36
|
-
def compile_assets
|
37
|
-
@updater ||= Compass::Commands::UpdateProject.new(
|
38
|
-
Contao.root,
|
39
|
-
configuration_file: Contao.root.join('config', 'compass.rb')
|
40
|
-
)
|
41
|
-
|
42
|
-
@updater.execute
|
43
|
-
end
|
44
|
-
|
45
|
-
def create_hashed_assets
|
46
|
-
Dir["#{Contao.expandify(Contao::Application.config.assets_public_path)}/**/*.css"].each do |file|
|
47
|
-
create_digest_for_file Pathname(file).expand_path
|
48
|
-
end
|
49
|
-
end
|
50
|
-
|
51
|
-
def generate_manifest
|
52
|
-
generate_manifest_for("stylesheets", "css")
|
53
|
-
end
|
54
|
-
end
|
55
|
-
end
|
56
|
-
end
|
@@ -1,22 +0,0 @@
|
|
1
|
-
namespace :assets do
|
2
|
-
desc "Compile javascript"
|
3
|
-
task :javascript do
|
4
|
-
TechnoGate::Contao::CoffeescriptCompiler.compile
|
5
|
-
TechnoGate::Contao::JavascriptCompiler.compile
|
6
|
-
end
|
7
|
-
|
8
|
-
desc "Compile stylesheet"
|
9
|
-
task :stylesheet do
|
10
|
-
TechnoGate::Contao::StylesheetCompiler.compile
|
11
|
-
end
|
12
|
-
|
13
|
-
desc "Clean assets"
|
14
|
-
task :clean do
|
15
|
-
TechnoGate::Contao::StylesheetCompiler.clean
|
16
|
-
TechnoGate::Contao::CoffeescriptCompiler.clean
|
17
|
-
TechnoGate::Contao::JavascriptCompiler.clean
|
18
|
-
end
|
19
|
-
|
20
|
-
desc "Precompile assets"
|
21
|
-
task :precompile => [:clean, :stylesheet, :javascript]
|
22
|
-
end
|
data/lib/guard/assets.rb
DELETED
@@ -1,117 +0,0 @@
|
|
1
|
-
require 'guard'
|
2
|
-
require 'guard/guard'
|
3
|
-
require 'active_support/core_ext/string/inflections'
|
4
|
-
require 'active_support/core_ext/object/try'
|
5
|
-
|
6
|
-
module Guard
|
7
|
-
class Assets < ::Guard::Guard
|
8
|
-
# Initialize a Guard.
|
9
|
-
# @param [Array<Guard::Watcher>] watchers the Guard file watchers
|
10
|
-
# @param [Hash] options the custom Guard options
|
11
|
-
def initialize(watchers = [], options = {})
|
12
|
-
super
|
13
|
-
|
14
|
-
@options = options
|
15
|
-
@compilers = instantiate_compilers
|
16
|
-
end
|
17
|
-
|
18
|
-
# Call once when Guard starts. Please override initialize method to init stuff.
|
19
|
-
# @raise [:task_has_failed] when start has failed
|
20
|
-
def start
|
21
|
-
run_all
|
22
|
-
end
|
23
|
-
|
24
|
-
# Called when just `enter` is pressed
|
25
|
-
# This method should be principally used for long action like running all specs/tests/...
|
26
|
-
# @raise [:task_has_failed] when run_all has failed
|
27
|
-
def run_all
|
28
|
-
@compilers.each do |compiler|
|
29
|
-
compiler.clean
|
30
|
-
end
|
31
|
-
|
32
|
-
call_compilers
|
33
|
-
end
|
34
|
-
|
35
|
-
# Called on file(s) modifications that the Guard watches.
|
36
|
-
# @param [Array<String>] paths the changes files or paths
|
37
|
-
# @raise [:task_has_failed] when run_on_changes has failed
|
38
|
-
def run_on_changes(paths)
|
39
|
-
compile(paths)
|
40
|
-
end
|
41
|
-
|
42
|
-
# Called on file(s) deletions that the Guard watches.
|
43
|
-
# @param [Array<String>] paths the deleted files or paths
|
44
|
-
# @raise [:task_has_failed] when run_on_changes has failed
|
45
|
-
def run_on_removals(paths)
|
46
|
-
compile(paths)
|
47
|
-
end
|
48
|
-
|
49
|
-
protected
|
50
|
-
def instantiate_compilers
|
51
|
-
@options.merge!(compilers: [:stylesheet, :coffeescript, :javascript]) unless @options[:compilers]
|
52
|
-
|
53
|
-
sort_compilers(@options[:compilers]).map(&:to_s).map do |compiler|
|
54
|
-
self.instance_variable_set(
|
55
|
-
"@#{compiler}_compiler",
|
56
|
-
"::TechnoGate::Contao::#{compiler.camelize}Compiler".constantize.new(@options)
|
57
|
-
)
|
58
|
-
|
59
|
-
self.instance_variable_get "@#{compiler}_compiler"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def sort_compilers(unsorted_compilers)
|
64
|
-
compilers = []
|
65
|
-
compilers << :stylesheet if unsorted_compilers.include? :stylesheet
|
66
|
-
compilers << :coffeescript if unsorted_compilers.include? :coffeescript
|
67
|
-
compilers << :javascript if unsorted_compilers.include? :javascript
|
68
|
-
|
69
|
-
compilers
|
70
|
-
end
|
71
|
-
|
72
|
-
def compile(paths)
|
73
|
-
coffeescript = javascript = stylesheet = false
|
74
|
-
|
75
|
-
paths.each do |path|
|
76
|
-
coffeescript = true if !coffeescript && is_coffeescript?(path)
|
77
|
-
javascript = true if !javascript && is_javascript?(path)
|
78
|
-
stylesheet = true if !stylesheet && is_stylesheet?(path)
|
79
|
-
end
|
80
|
-
|
81
|
-
compilers = @compilers.clone
|
82
|
-
compilers.delete(:stylesheet) unless stylesheet
|
83
|
-
compilers.delete(:javascript) unless javascript
|
84
|
-
compilers.delete(:coffeescript) unless coffeescript
|
85
|
-
|
86
|
-
call_compilers compilers
|
87
|
-
end
|
88
|
-
|
89
|
-
def call_compilers(compilers = @compilers)
|
90
|
-
compilers.each do |compiler|
|
91
|
-
compiler.compile
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def is_coffeescript?(path)
|
96
|
-
file_in_path?(path, TechnoGate::Contao::Application.config.javascripts_path) && File.extname(path) == '.coffee'
|
97
|
-
end
|
98
|
-
|
99
|
-
def is_javascript?(path)
|
100
|
-
file_in_path?(path, TechnoGate::Contao::Application.config.javascripts_path) && File.extname(path) == '.js'
|
101
|
-
end
|
102
|
-
|
103
|
-
def is_stylesheet?(path)
|
104
|
-
file_in_path?(path, TechnoGate::Contao::Application.config.stylesheets_path)
|
105
|
-
end
|
106
|
-
|
107
|
-
def file_in_path?(file, paths)
|
108
|
-
paths = [paths] if paths.is_a?(String)
|
109
|
-
|
110
|
-
paths.each do |path|
|
111
|
-
return true if file.start_with?(path)
|
112
|
-
end
|
113
|
-
|
114
|
-
false
|
115
|
-
end
|
116
|
-
end
|
117
|
-
end
|