contao 0.4.2 → 0.5.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|