contao 0.3.1

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/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --format progress
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in contao.gemspec
4
+ gemspec
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2012 Wael Nasreddine
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,29 @@
1
+ # Contao
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'contao'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install contao
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Added some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require "bundler/gem_tasks"
4
+
5
+ # Require RSpec tasks
6
+ require 'rspec/core/rake_task'
7
+ RSpec::Core::RakeTask.new(:spec)
8
+
9
+ # The default task is tests
10
+ task :default => :spec
data/contao.gemspec ADDED
@@ -0,0 +1,33 @@
1
+ # -*- encoding: utf-8 -*-
2
+ require File.expand_path('../lib/contao/version', __FILE__)
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.authors = ["Wael Nasreddine"]
6
+ gem.email = ["wael.nasreddine@gmail.com"]
7
+ gem.description = %q{Contao Integration with Compass, Sass, Coffee-script, Rake, Guard with asset pre-compiler and asset-manifest generator}
8
+ gem.summary = gem.description
9
+ gem.homepage = ""
10
+
11
+ gem.files = `git ls-files`.split($\)
12
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
+ gem.name = "contao"
15
+ gem.require_paths = ["lib"]
16
+ gem.version = Contao::VERSION
17
+
18
+ # Runtime dependencies
19
+ gem.add_dependency 'rake'
20
+ gem.add_dependency 'compass'
21
+ gem.add_dependency 'oily_png'
22
+ gem.add_dependency 'uglifier'
23
+ gem.add_dependency 'activesupport'
24
+ gem.add_dependency 'guard'
25
+ gem.add_dependency 'json'
26
+ gem.add_dependency 'parseconfig'
27
+ gem.add_dependency 'highline'
28
+ gem.add_dependency 'coffee-script'
29
+
30
+ # Development dependencies
31
+ gem.add_development_dependency 'rspec'
32
+ gem.add_development_dependency 'fakefs'
33
+ end
@@ -0,0 +1,66 @@
1
+ module TechnoGate
2
+ module Contao
3
+ class Application < OpenStruct
4
+ include Singleton
5
+
6
+ def initialize
7
+ super
8
+ self.config = OpenStruct.new
9
+ end
10
+
11
+ def self.configure(&block)
12
+ instance.instance_eval(&block)
13
+ end
14
+
15
+ def self.config
16
+ instance.config
17
+ end
18
+
19
+ def linkify
20
+ exhaustive_list_of_files_to_link(
21
+ Contao.expandify(Application.config.contao_path),
22
+ Contao.expandify(Application.config.contao_public_path)
23
+ ).each do |list|
24
+ FileUtils.ln_s list[0], list[1]
25
+ end
26
+ end
27
+
28
+ def self.linkify
29
+ instance.linkify
30
+ end
31
+
32
+ def self.load_tasks
33
+ Dir["#{File.expand_path '../tasks', __FILE__}/**/*.rake"].each {|f| load f}
34
+ end
35
+
36
+ def name
37
+ File.basename TechnoGate::Contao.root
38
+ end
39
+
40
+ def self.name
41
+ instance.name
42
+ end
43
+
44
+ protected
45
+
46
+ # Return an array of arrays of files to link
47
+ #
48
+ # @param [String] Absolute path to folder from which to link
49
+ # @param [String] Absolute path to folder to which to link
50
+ # @return [Array]
51
+ def exhaustive_list_of_files_to_link(from, to)
52
+ files = []
53
+ Dir["#{from}/*"].each do |f|
54
+ file = "#{to}/#{File.basename f}"
55
+ if File.exists? file
56
+ exhaustive_list_of_files_to_link(f, file).each { |f| files << f }
57
+ else
58
+ files << [f, file]
59
+ end
60
+ end
61
+
62
+ files
63
+ end
64
+ end
65
+ end
66
+ end
@@ -0,0 +1,50 @@
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 compiled_javascript_path.to_s if File.exists?(compiled_javascript_path)
15
+
16
+ super
17
+ end
18
+
19
+ protected
20
+
21
+ # Compile assets
22
+ #
23
+ # This method compiled coffeescripts from
24
+ # Application.config.javascripts_path into
25
+ # Contao.root.join('tmp/compiled_javascript')
26
+ def compile_assets
27
+ Application.config.javascripts_path.each do |src_path|
28
+ Dir["#{Contao.expandify(src_path)}/**/*.coffee"].sort.each do |file|
29
+ dest = compute_destination_filename(src_path, file)
30
+ FileUtils.mkdir_p File.dirname(dest)
31
+ File.open(dest, 'w') do |f|
32
+ f.write ::CoffeeScript.compile(File.read(file))
33
+ end
34
+ end
35
+ end
36
+ end
37
+
38
+ def compute_destination_filename(src_path, file)
39
+ dest = "#{compiled_javascript_path}/#{src_path.gsub('/', '_')}/"
40
+ dest << file.gsub(/.*#{Regexp.escape src_path}\//, '').gsub(/\.coffee$/, '')
41
+ dest << '.js' unless File.extname(dest) == '.js'
42
+ dest
43
+ end
44
+
45
+ def compiled_javascript_path
46
+ Contao.expandify("tmp/compiled_javascript")
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,104 @@
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
+ # Prepare folders
43
+ def prepare_folders
44
+ FileUtils.mkdir_p assets_public_path
45
+ end
46
+
47
+ def compile_assets
48
+ end
49
+
50
+ def create_hashed_assets
51
+ end
52
+
53
+ def notify
54
+ klass_name = self.class.to_s.split('::').last
55
+
56
+ Notifier.notify("#{klass_name.underscore.humanize} finished successfully.", title: klass_name)
57
+ end
58
+
59
+ # Create a diges for a given file
60
+ #
61
+ # This method creates a digested file for a given file path
62
+ #
63
+ # @param [Pathname | String] file_path
64
+ def create_digest_for_file(file_path)
65
+ digest = Digest::MD5.hexdigest File.read(file_path)
66
+ digested_file_path = "#{file_path.to_s.chomp(File.extname(file_path))}-#{digest}#{File.extname(file_path)}"
67
+ FileUtils.cp file_path, digested_file_path
68
+
69
+ digested_file_path
70
+ end
71
+
72
+ # This method generates a manifest of all generated files
73
+ # so it can be parsed and processed by the PHP application
74
+ #
75
+ # This method is expected to be overridden
76
+ def generate_manifest
77
+ end
78
+
79
+ def generate_manifest_for(key, extension)
80
+ manifest = JSON.parse(File.read(@manifest_path)) rescue {}
81
+ manifest[key] = []
82
+
83
+ all_files = Dir["#{assets_public_path}/**/*.#{extension}"]
84
+ digested_files = all_files.select {|f| f =~ /^.+-[0-9a-f]{32}\.#{extension}$/}
85
+ non_digested_files = all_files - digested_files
86
+
87
+ if Contao.env == :production
88
+ files = digested_files
89
+ else
90
+ files = non_digested_files
91
+ end
92
+
93
+ files.each do |file|
94
+ file.slice! "#{assets_public_path}/"
95
+ manifest[key] << file
96
+ end
97
+
98
+ File.open(@manifest_path, 'w') do |f|
99
+ f.write(manifest.to_json)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
@@ -0,0 +1,62 @@
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
+ # Compile assets
16
+ #
17
+ # This method compiles javascripts from
18
+ # Application.config.javascripts_path into
19
+ # Application.config.assets_public_path/application.js and it uglifies
20
+ # only if the environment is equal to :production
21
+ def compile_assets
22
+ tmp_app_js = Contao.root.join('tmp/application.js')
23
+ FileUtils.mkdir_p File.dirname(tmp_app_js)
24
+
25
+ File.open(tmp_app_js, 'w') do |compressed|
26
+ javascripts_path.each do |src_path|
27
+ Dir["#{Contao.expandify(src_path)}/**/*.js"].sort.each do |f|
28
+ if TechnoGate::Contao.env == :production
29
+ compressed.write(Uglifier.new.compile(File.read(f)))
30
+ else
31
+ compressed.write("// #{f}\n")
32
+ compressed.write(File.read(f))
33
+ compressed.write("\n")
34
+ end
35
+ end
36
+ end
37
+ end
38
+
39
+ FileUtils.mv tmp_app_js, application_js_path
40
+ end
41
+
42
+ def javascripts_path
43
+ Application.config.javascripts_path.map do |path|
44
+ ["tmp/compiled_javascript/#{path.gsub('/', '_')}", path]
45
+ end.flatten
46
+ end
47
+
48
+ # This function creates a hashed version of the assets
49
+ def create_hashed_assets
50
+ create_digest_for_file(Contao.expandify(Contao::Application.config.assets_public_path).join("application.js"))
51
+ end
52
+
53
+ def application_js_path
54
+ Contao.expandify(Application.config.assets_public_path).join("application.js")
55
+ end
56
+
57
+ def generate_manifest
58
+ generate_manifest_for("javascripts", "js")
59
+ end
60
+ end
61
+ end
62
+ end
@@ -0,0 +1,24 @@
1
+ require 'singleton'
2
+ require 'guard'
3
+
4
+ module TechnoGate
5
+ module Contao
6
+ class Notifier
7
+ include Singleton
8
+
9
+ def notify(message, options = {})
10
+ if ::Guard::UI.send(:color_enabled?)
11
+ message = "\e[0;34mContao>>\e[0m \e[0;32m#{message}\e[0m"
12
+ else
13
+ message = "Contao>> #{message}"
14
+ end
15
+
16
+ ::Guard::UI.info(message, options)
17
+ end
18
+
19
+ def self.notify(*args, &block)
20
+ instance.notify(*args, &block)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,45 @@
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 compile_assets
26
+ @updater ||= Compass::Commands::UpdateProject.new(
27
+ Contao.root,
28
+ configuration_file: Contao.root.join('config', 'compass.rb')
29
+ )
30
+
31
+ @updater.execute
32
+ end
33
+
34
+ def create_hashed_assets
35
+ Dir["#{Contao.expandify(Contao::Application.config.assets_public_path)}/**/*.css"].each do |file|
36
+ create_digest_for_file Pathname(file).expand_path
37
+ end
38
+ end
39
+
40
+ def generate_manifest
41
+ generate_manifest_for("stylesheets", "css")
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,23 @@
1
+ namespace :assets do
2
+ desc "Compile javascript"
3
+ task :javascript do
4
+ TechnoGate::Contao::CoffeescriptCompiler.compile
5
+ TechnoGate::Contao::CoffeescriptCompiler.compile
6
+ TechnoGate::Contao::JavascriptCompiler.compile
7
+ end
8
+
9
+ desc "Compile stylesheet"
10
+ task :stylesheet do
11
+ TechnoGate::Contao::StylesheetCompiler.compile
12
+ end
13
+
14
+ desc "Clean assets"
15
+ task :clean do
16
+ TechnoGate::Contao::StylesheetCompiler.clean
17
+ TechnoGate::Contao::CoffeescriptCompiler.clean
18
+ TechnoGate::Contao::JavascriptCompiler.clean
19
+ end
20
+
21
+ desc "Precompile assets"
22
+ task :precompile => [:clean, :stylesheet, :javascript]
23
+ end
@@ -0,0 +1,101 @@
1
+ require 'highline'
2
+
3
+ def ask(what, options = {})
4
+ default = options[:default]
5
+ validate = options[:validate] || /(y(es)?)|(no?)|(a(bort)?|\n)/i
6
+ echo = (options[:echo].nil?) ? true : options[:echo]
7
+
8
+ ui = HighLine.new
9
+ ui.ask("#{what}? ") do |q|
10
+ q.overwrite = false
11
+ q.default = default
12
+ q.validate = validate
13
+ q.responses[:not_valid] = what
14
+ unless echo
15
+ q.echo = "*"
16
+ end
17
+ end
18
+ end
19
+
20
+ namespace :contao do
21
+ desc "Link all contao files"
22
+ task :bootstrap do
23
+ public = TechnoGate::Contao.expandify(TechnoGate::Contao::Application.config.contao_public_path)
24
+
25
+ TechnoGate::Contao::Application.linkify
26
+
27
+ FileUtils.mkdir_p public.join('system/logs')
28
+ File.open(public.join('sitemap.xml'), 'w') {|f| f.write ''}
29
+
30
+ Rake::Task['contao:fix_permissions'].invoke
31
+ Rake::Task['contao:generate_localconfig'].invoke
32
+ Rake::Task['contao:generate_htaccess'].invoke
33
+ Rake::Task['assets:precompile'].invoke
34
+
35
+ TechnoGate::Contao::Notifier.notify("The contao folder has been bootstraped, Good Luck.", title: "Contao Bootstrap")
36
+ end
37
+
38
+ desc "Fix permissions"
39
+ task :fix_permissions do
40
+ require 'fileutils'
41
+
42
+ public = TechnoGate::Contao.expandify(TechnoGate::Contao::Application.config.contao_public_path)
43
+ paths = [
44
+ 'system/html',
45
+ 'system/logs',
46
+ 'system/scripts',
47
+ 'system/tmp',
48
+ 'system/cache',
49
+ ].map {|p| public.join p}.reject {|p| !File.exists? p}
50
+
51
+ FileUtils.chmod 0777, paths
52
+
53
+ Dir["#{public}/system/modules/efg/**/*"].each do |f|
54
+ if File.directory?(f)
55
+ FileUtils.chmod 0777, f
56
+ else
57
+ FileUtils.chmod 0666, f
58
+ end
59
+ end
60
+
61
+ FileUtils.chmod 0666, public.join('sitemap.xml')
62
+
63
+ TechnoGate::Contao::Notifier.notify("The contao folder's permissions has been fixed.", title: "Contao Bootstrap")
64
+ end
65
+
66
+ desc "Generate the localconfig.php"
67
+ task :generate_localconfig do
68
+ require 'parseconfig'
69
+
70
+ my_cnf_path = File.expand_path("#{ENV['HOME']}/.my.cnf")
71
+ localconfig_template = TechnoGate::Contao.expandify('config/examples/localconfig.php.erb')
72
+ localconfig_path = TechnoGate::Contao.expandify(TechnoGate::Contao::Application.config.contao_public_path).join('system/config/localconfig.php')
73
+
74
+ if File.exists?(my_cnf_path)
75
+ my_cnf = ParseConfig.new(my_cnf_path)
76
+ mysql_host = my_cnf.params['client']['host']
77
+ mysql_user = my_cnf.params['client']['user']
78
+ mysql_password = my_cnf.params['client']['password']
79
+ else
80
+ puts "Please add these details to #{my_cnf_path}"
81
+ mysql_host = ask("What host is mysql running on", default: 'localhost', validate: /.+/)
82
+ mysql_user = ask("What user to use with mysql", validate: /.+/)
83
+ mysql_password = ask("What is the user's password", validate: /.+/, echo: false)
84
+ end
85
+ mysql_database = TechnoGate::Contao::Application.name
86
+ contao_env = TechnoGate::Contao.env
87
+
88
+ localconfig = ERB.new(File.read(localconfig_template)).result(binding)
89
+ File.open(localconfig_path, 'w') {|f| f.write localconfig }
90
+
91
+ TechnoGate::Contao::Notifier.notify("The configuration file localconfig.php was generated successfully.", title: "Contao Bootstrap")
92
+ end
93
+
94
+ desc "Generate the htaccess file"
95
+ task :generate_htaccess do
96
+ public = TechnoGate::Contao.expandify(TechnoGate::Contao::Application.config.contao_public_path)
97
+ FileUtils.cp public.join('.htaccess.default'), public.join('.htaccess')
98
+
99
+ TechnoGate::Contao::Notifier.notify("The .htaccess was successfully generated.", title: "Contao Bootstrap")
100
+ end
101
+ end
@@ -0,0 +1,8 @@
1
+ begin
2
+ require 'jasmine'
3
+ load 'jasmine/tasks/jasmine.rake'
4
+ rescue LoadError
5
+ task :jasmine do
6
+ abort "Jasmine is not available. In order to run jasmine, you must: (sudo) gem install jasmine"
7
+ end
8
+ end
@@ -0,0 +1,13 @@
1
+ # Taken from RefineryCMD
2
+ # https://github.com/resolve/refinerycms/blob/master/core/lib/tasks/refinery.rake
3
+ desc 'Removes trailing whitespace across the entire application.'
4
+ task :whitespace do
5
+ require 'rbconfig'
6
+ if RbConfig::CONFIG['host_os'] =~ /linux/
7
+ sh %{find . -name '*.*rb' -o -name '*.*php' -o -name '*.*coffee' -o -name '*.*sass' -exec sed -i 's/\t/ /g' {} \\; -exec sed -i 's/ *$//g' {} \\; }
8
+ elsif RbConfig::CONFIG['host_os'] =~ /darwin/
9
+ sh %{find . -name '*.*rb' -o -name '*.*php' -o -name '*.*coffee' -o -name '*.*sass' -exec sed -i '' 's/\t/ /g' {} \\; -exec sed -i '' 's/ *$//g' {} \\; }
10
+ else
11
+ puts "This doesn't work on systems other than OSX or Linux. Please use a custom whitespace tool for your platform '#{RbConfig::CONFIG["host_os"]}'."
12
+ end
13
+ end
@@ -0,0 +1,3 @@
1
+ module Contao
2
+ VERSION = '0.3.1'
3
+ end