contao 0.4.0 → 0.4.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.
@@ -0,0 +1,13 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.2
4
+ - 1.9.3
5
+ - rbx-19mode
6
+ - jruby-19mode
7
+ matrix:
8
+ allow_failures:
9
+ - rvm: rbx-19mode # We have some failing specs we need to take care of
10
+ - rvm: jruby-19mode # This is more complicated as we need the oily_ong gem but it doesn't work for Jruby
11
+ notifications:
12
+ recipients:
13
+ - wael.nasreddine@gmail.com
data/README.md CHANGED
@@ -1,24 +1,113 @@
1
1
  # Contao
2
2
 
3
- TODO: Write a gem description
3
+ Welcome to Contao!
4
+ [![Build
5
+ Status](https://secure.travis-ci.org/TechnoGate/contao.png?branch=master)](http://travis-ci.org/TechnoGate/contao)
6
+ [![Gemnasium](https://gemnasium.com/TechnoGate/contao.png)](https://gemnasium.com/TechnoGate/contao)
4
7
 
5
- ## Installation
8
+ This gem will help you to quickly generate an application using [Contao
9
+ CMS](http://www.contao.org/en/) which has pre-built support for Sass,
10
+ Compass, CoffeeScript, Jasmine and Capistrano.
11
+
12
+ It also feature hashed assets served by the [Contao Assets
13
+ extension](https://github.com/TechnoGate/contao_assets), which allows you
14
+ to have an md5 appended to each of your assets URL on the production
15
+ site.
16
+
17
+ The integration with Capistrano allows you to quickly deploy, copy
18
+ assets, import database and even upload media such as images and PDFs
19
+ all from the command line using Capistrano.
20
+
21
+ ## Pre-requisites
22
+
23
+ Before installing the gem, you need to make you are running on a Ruby
24
+ version 1.9.2 or greater as this Gem and most of it's dependencies do
25
+ not support Ruby 1.8, to check the version you are running, uee the
26
+ following command:
6
27
 
7
- Add this line to your application's Gemfile:
28
+ ```bash
29
+ ruby --version
30
+ ```
8
31
 
9
- gem 'contao'
32
+ If you're running a ruby version below 1.9, please install a 1.9 version
33
+ by following the guide at the [Rbenv
34
+ Installer](https://github.com/fesplugas/rbenv-installer) project.
10
35
 
11
- And then execute:
36
+ ## Installation
12
37
 
13
- $ bundle
38
+ Install contao with the following command
14
39
 
15
- Or install it yourself as:
40
+ ```ruby
41
+ gem install contao
42
+ ```
16
43
 
17
- $ gem install contao
44
+ Don't forget to run `rbenv rehash` if you are using
45
+ **[rbenv](https://github.com/sstephenson/rbenv)** as this gem provides
46
+ an executable.
18
47
 
19
48
  ## Usage
20
49
 
21
- TODO: Write usage instructions here
50
+ ### Generating a config file
51
+
52
+ To start using contao, you need to generate a config file, issue the
53
+ command
54
+
55
+ ```bash
56
+ contao generate config
57
+ ```
58
+
59
+ and follow the on-screen instructions.
60
+
61
+ ### Generate a new project
62
+
63
+ Generating a new project is very easy, just use the following command:
64
+
65
+ ```bash
66
+ contao new /path/to/my_project
67
+ ```
68
+
69
+ This command will generate an application called `my\_project` in the
70
+ folder `/path/to`, the application name is very important as it defaults
71
+ to the name of your database, check the [Database name](#database-name)
72
+ section below for more information.
73
+
74
+ ### Initialising the project
75
+
76
+ Once the project generator has completed, cd into the newsly created
77
+ project and bootstrap contao by running
78
+
79
+ ```bash
80
+ bundle exec rake contao:bootstrap
81
+ ```
82
+
83
+ Now visit `/contao/install.php` or just visit the website and you should
84
+ be redirected to the Installation script, from here on it is the usual
85
+ Contao installation procedure, please check [Contao's user
86
+ guide](http://www.contao.org/en/installing-contao.html#install-tool) for
87
+ detailed information
88
+
89
+ ### Work on the project
90
+
91
+ To be able to develop with this version of Contao, you first need to
92
+ understand how it actually works.
93
+
94
+ TODO: Continue this section
95
+
96
+ ## Database name
97
+
98
+ Locally, the database name is the same as the application name, so if
99
+ you named your project is named **my_project**, the database name will be
100
+ named **my_project**.
101
+
102
+ On the server, Capistrano will append the environment on which the
103
+ deployment occured (check the deployment section below for more
104
+ information) to the application name, so if your project is named
105
+ **my_project** and you are deployment to the staging environment, the
106
+ database name would default to **my_project_staging**
107
+
108
+ ## Deploying
109
+
110
+ TODO: Write this section
22
111
 
23
112
  ## Contributing
24
113
 
@@ -27,3 +116,44 @@ TODO: Write usage instructions here
27
116
  3. Commit your changes (`git commit -am 'Added some feature'`)
28
117
  4. Push to the branch (`git push origin my-new-feature`)
29
118
  5. Create new Pull Request
119
+
120
+ Or
121
+
122
+ [![Click here to lend your support to: Open Source Projects and make a donation at www.pledgie.com!](http://pledgie.com/campaigns/16123.png?skin_name=chrome)](http://www.pledgie.com/campaigns/16123)
123
+
124
+ ## Contact
125
+
126
+ For bugs and feature request, please use __Github issues__, for other
127
+ requests, you may use:
128
+
129
+ - [Google Groups](http://groups.google.com/group/janus-vimius)
130
+ - [Github private message](https://github.com/inbox/new/eMxyzptlk)
131
+ - Email: [contact@technogate.fr](mailto:contact@technogate.fr)
132
+
133
+ Don't forget to follow me on [Github](https://github.com/eMxyzptlk) and
134
+ [Twitter](https://twitter.com/eMxyzptlk) for news and updates.
135
+
136
+ ## License
137
+
138
+ ### This code is free to use under the terms of the MIT license.
139
+
140
+ Copyright (c) 2011 TechnoGate <support@technogate.fr>
141
+
142
+ Permission is hereby granted, free of charge, to any person obtaining
143
+ a copy of this software and associated documentation files (the
144
+ "Software"), to deal in the Software without restriction, including
145
+ without limitation the rights to use, copy, modify, merge, publish,
146
+ distribute, sublicense, and/or sell copies of the Software, and to
147
+ permit persons to whom the Software is furnished to do so, subject to
148
+ the following conditions:
149
+
150
+ The above copyright notice and this permission notice shall be included
151
+ in all copies or substantial portions of the Software.
152
+
153
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
154
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
155
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
156
+ IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
157
+ CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
158
+ TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
159
+ SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -2,19 +2,33 @@
2
2
  require File.expand_path('../lib/contao/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
- gem.authors = ["Wael Nasreddine"]
6
- gem.email = ["wael.nasreddine@gmail.com"]
5
+ gem.authors = ['Wael Nasreddine']
6
+ gem.email = ['wael.nasreddine@gmail.com']
7
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
8
+ gem.summary = <<-EOS
9
+ This gem will help you to quickly generate an application using Contao
10
+ CMS which has pre-built support for Sass, Compass, CoffeeScript, Jasmine
11
+ and Capistrano.
12
+
13
+ It also feature hashed assets served by the Contao Assets extension,
14
+ which allows you to have an md5 appended to each of your assets URL on
15
+ the production site.
16
+
17
+ The integration with Capistrano allows you to quickly deploy, copy
18
+ assets, import database and even upload media such as images and PDFs
19
+ all from the command line using Capistrano.
20
+ EOS
9
21
  gem.homepage = ""
22
+ gem.required_ruby_version = Gem::Requirement.new('>= 1.9.2')
10
23
 
11
24
  gem.files = `git ls-files`.split($\)
12
25
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
13
26
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
- gem.name = "contao"
15
- gem.require_paths = ["lib"]
27
+ gem.name = 'contao'
28
+ gem.require_paths = ['lib']
16
29
  gem.version = Contao::VERSION
17
30
 
31
+
18
32
  # Runtime dependencies
19
33
  gem.add_dependency 'rake'
20
34
  gem.add_dependency 'compass'
@@ -1,5 +1,5 @@
1
1
  require 'contao/version'
2
- require 'core_ext/object'
2
+ require 'contao/core_ext/object'
3
3
  require 'singleton'
4
4
  require 'ostruct'
5
5
 
@@ -1,4 +1,7 @@
1
1
  require 'yaml'
2
+ require 'ostruct'
3
+ require 'singleton'
4
+ require 'contao/core_ext/object'
2
5
 
3
6
  module TechnoGate
4
7
  module Contao
@@ -49,7 +52,7 @@ module TechnoGate
49
52
  {
50
53
  'install_password' => '',
51
54
  'encryption_key' => '',
52
- 'admin_email' => 'wael@technogate.fr',
55
+ 'admin_email' => 'admin@example.com',
53
56
  'time_zone' => 'Europe/Paris',
54
57
  'mysql' => {
55
58
  'host' => 'localhost',
@@ -9,6 +9,20 @@ case ARGV[0]
9
9
  when 'new'
10
10
  require 'contao/generators/application'
11
11
  TechnoGate::Contao::Generators::Application.new(path: ARGV[1]).generate
12
+ when 'generate'
13
+ case ARGV[1]
14
+ when 'config'
15
+ require 'contao/generators/config'
16
+ begin
17
+ TechnoGate::Contao::Generators::Config.new.generate
18
+ rescue TechnoGate::Contao::Generators::Config::AlreadyExists
19
+ require 'contao/notifier'
20
+ TechnoGate::Contao::Notifier.error "The configuration file exists and cannot be overwritten", title: "Config Generator"
21
+ end
22
+ else
23
+ require 'contao/commands/help'
24
+ print_help
25
+ end
12
26
  else
13
27
  require 'contao/commands/help'
14
28
  print_help
@@ -2,16 +2,21 @@ def print_help
2
2
  puts <<-EOH.gsub(/ [ ]+/, ' ')
3
3
  Welcome to Contao!
4
4
 
5
- This gem will help you to quickly generate an application using contao
6
- that has pre-built support for Sass, Compass, CoffeeScript, Jasmine and
7
- Capistrano.
5
+ This gem will help you to quickly generate an application using Contao
6
+ CMS which has pre-built support for Sass, Compass, CoffeeScript, Jasmine
7
+ and Capistrano.
8
8
 
9
- It also feature hashed assets served by the Contao Assets extension, this
10
- allows you to have an md5 appended to each of your assets file name
9
+ It also feature hashed assets served by the Contao Assets extension,
10
+ which allows you to have an md5 appended to each of your assets URL on
11
+ the production site.
12
+
13
+ The integration with Capistrano allows you to quickly deploy, copy
14
+ assets, import database and even upload media such as images and PDFs
15
+ all from the command line using Capistrano.
11
16
 
12
17
  To generate a new project, use the following command:
13
18
 
14
- $ contao new /path/to/application
19
+ $ contao new /path/to/application
15
20
 
16
21
  The generated application will be created at /path/to/application and the
17
22
  application name would be set to the last component in the path, in this
@@ -0,0 +1,33 @@
1
+ require 'contao/generators/base'
2
+ require 'contao/application'
3
+ require 'contao/notifier'
4
+ require 'fileutils'
5
+
6
+ module TechnoGate
7
+ module Contao
8
+ module Generators
9
+ class Config < Base
10
+ class AlreadyExists < RuntimeError; end
11
+
12
+ def generate
13
+ raise AlreadyExists if File.exists?(global_config_path)
14
+
15
+ FileUtils.mkdir_p File.dirname(global_config_path)
16
+ File.open global_config_path, 'w' do |config|
17
+ config.write YAML.dump(Contao::Application.default_global_config)
18
+ end
19
+
20
+ message = <<-EOS.gsub(/ [ ]+/, '').gsub("\n", ' ').chop
21
+ The configuration file has been created at ~/.contao/config.yml,
22
+ you need to edit this file before working with contao
23
+ EOS
24
+ Notifier.notify message, title: 'Config Generator'
25
+ end
26
+
27
+ def global_config_path
28
+ Contao::Application.instance.global_config_path
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,38 +1,35 @@
1
- require 'singleton'
2
1
  require 'guard'
3
2
 
4
3
  module TechnoGate
5
4
  module Contao
6
- class Notifier
7
- include Singleton
5
+ module Notifier
6
+ extend self
8
7
 
9
8
  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
9
+ say(message, options.merge(color: 32))
10
+ end
15
11
 
16
- ::Guard::UI.info(message, options)
12
+ def warn(message, options = {})
13
+ say(message, options.merge(color: 33))
17
14
  end
18
15
 
19
- def self.notify(*args, &block)
20
- instance.notify(*args, &block)
16
+ def error(message, options = {})
17
+ say(message, options.merge(color: 31))
21
18
  end
22
19
 
23
- def warn(message, options = {})
20
+ protected
21
+
22
+ def say(message, options = {})
23
+ color = options.delete(:color)
24
+
24
25
  if ::Guard::UI.send(:color_enabled?)
25
- message = "\e[0;34mContao>>\e[0m \e[0;33m#{message}\e[0m"
26
+ message = "\e[0;34mContao>>\e[0m \e[0;#{color}m#{message}\e[0m"
26
27
  else
27
28
  message = "Contao>> #{message}"
28
29
  end
29
30
 
30
31
  ::Guard::UI.info(message, options)
31
32
  end
32
-
33
- def self.warn(*args, &block)
34
- instance.warn(*args, &block)
35
- end
36
33
  end
37
34
  end
38
35
  end
@@ -27,11 +27,11 @@ namespace :contao do
27
27
  FileUtils.mkdir_p public.join('system/logs')
28
28
  File.open(public.join('sitemap.xml'), 'w') {|f| f.write ''}
29
29
 
30
- Rake::Task['contao:fix_permissions'].invoke
31
30
  Rake::Task['contao:generate_localconfig'].invoke
32
31
  Rake::Task['contao:generate_htaccess'].invoke
33
32
  Rake::Task['contao:apply_patches'].invoke
34
33
  Rake::Task['assets:precompile'].invoke
34
+ Rake::Task['contao:fix_permissions'].invoke
35
35
 
36
36
  TechnoGate::Contao::Notifier.notify("The contao folder has been bootstraped, Good Luck.", title: "Contao Bootstrap")
37
37
  end
@@ -64,10 +64,13 @@ namespace :contao do
64
64
  'system/scripts',
65
65
  'system/tmp',
66
66
  'system/cache',
67
+ 'system/config',
67
68
  ].map {|p| public.join p}.reject {|p| !File.exists? p}
68
69
 
69
70
  FileUtils.chmod 0777, paths
70
71
 
72
+ FileUtils.chmod 0666, Dir["#{public}/system/config/**/*.php"]
73
+
71
74
  Dir["#{public}/system/modules/efg/**/*"].each do |f|
72
75
  if File.directory?(f)
73
76
  FileUtils.chmod 0777, f
@@ -1,3 +1,3 @@
1
1
  module Contao
2
- VERSION = '0.4.0'
2
+ VERSION = '0.4.1'
3
3
  end
@@ -0,0 +1,67 @@
1
+ require 'spec_helper'
2
+ require 'contao/generators/config'
3
+
4
+ module TechnoGate
5
+ module Contao
6
+ module Generators
7
+ describe Config do
8
+ let(:klass) { Config }
9
+ subject {
10
+ Config.new path: @path
11
+ }
12
+
13
+ before :each do
14
+ @path = '/root/my_awesome_project'
15
+ @config_path = "#{ENV['HOME']}/.contao/config.yml"
16
+ Notifier.stub :notify
17
+ end
18
+
19
+ it_should_behave_like "Generator"
20
+
21
+ describe '#generate', :fakefs do
22
+ before :each do
23
+ stub_filesystem!
24
+ FileUtils.rm_rf File.dirname(@config_path)
25
+ end
26
+
27
+ it "should create ~/.contao" do
28
+ subject.generate
29
+
30
+ File.exists?(File.dirname(@config_path)).should be_true
31
+ end
32
+
33
+ it "the config file should exists" do
34
+ subject.generate
35
+
36
+ File.exists?(@config_path).should be_true
37
+ end
38
+
39
+ it "should generate the config file" do
40
+ subject.generate
41
+
42
+ File.read("#{ENV['HOME']}/.contao/config.yml").should ==
43
+ YAML.dump(Contao::Application.default_global_config)
44
+ end
45
+
46
+ it "should call the Notifier" do
47
+ message = <<-EOS.gsub(/ [ ]+/, '').gsub("\n", ' ').chop
48
+ The configuration file has been created at ~/.contao/config.yml,
49
+ you need to edit this file before working with contao
50
+ EOS
51
+ Notifier.should_receive(:notify).with(message, title: 'Config Generator').once
52
+
53
+ subject.generate
54
+ end
55
+
56
+ it "should raise ConfigAlreadyExists if the config already exists" do
57
+ subject.generate
58
+
59
+ expect do
60
+ subject.generate
61
+ end.to raise_error(Config::AlreadyExists)
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -3,11 +3,6 @@ require 'spec_helper'
3
3
  module TechnoGate
4
4
  module Contao
5
5
  describe Notifier do
6
- subject { Notifier.instance }
7
- let(:klass) { Notifier }
8
-
9
- it_should_behave_like "Singleton"
10
-
11
6
  describe '#notify' do
12
7
  before :each do
13
8
  @message = "Hello"
@@ -40,9 +35,9 @@ module TechnoGate
40
35
  end
41
36
 
42
37
  it "should be accessible at class level" do
43
- klass.any_instance.should_receive(:notify).with(@message, @options)
38
+ subject.should_receive(:notify).with(@message, @options)
44
39
 
45
- klass.notify(@message, @options)
40
+ subject.notify(@message, @options)
46
41
  end
47
42
  end
48
43
 
@@ -78,9 +73,47 @@ module TechnoGate
78
73
  end
79
74
 
80
75
  it "should be accessible at class level" do
81
- klass.any_instance.should_receive(:warn).with(@message, @options)
76
+ subject.should_receive(:warn).with(@message, @options)
77
+
78
+ subject.warn(@message, @options)
79
+ end
80
+ end
81
+
82
+ describe '#error' do
83
+ before :each do
84
+ @message = "Hello"
85
+ @output = "Contao>> #{@message}"
86
+ @colored_output = "\e[0;34mContao>>\e[0m \e[0;31m#{@message}\e[0m"
87
+ @options = {title: "Hello, World!"}
88
+
89
+ ::Guard::UI.stub(:color_enabled?).and_return(false)
90
+ end
91
+
92
+ it {should respond_to :error}
93
+
94
+ it "should call guard ui" do
95
+ ::Guard::UI.should_receive(:info).with(@output, {})
96
+
97
+ subject.error(@message)
98
+ end
99
+
100
+ it "should send whatever options passed to the info method" do
101
+ ::Guard::UI.should_receive(:info).with(@output, @options)
102
+
103
+ subject.error(@message, @options)
104
+ end
105
+
106
+ it "should use colors if enabled" do
107
+ ::Guard::UI.should_receive(:color_enabled?).once.and_return(true)
108
+ ::Guard::UI.should_receive(:info).with(@colored_output, @options)
109
+
110
+ subject.error(@message, @options)
111
+ end
112
+
113
+ it "should be accessible at class level" do
114
+ subject.should_receive(:error).with(@message, @options)
82
115
 
83
- klass.warn(@message, @options)
116
+ subject.error(@message, @options)
84
117
  end
85
118
  end
86
119
  end
@@ -33,10 +33,8 @@ module TechnoGate
33
33
  end
34
34
 
35
35
  it "should set the @@root" do
36
- mock("root").tap do |root|
37
- subject.root = root
38
- subject.class_variable_get(:@@root).should == Pathname.new(root).expand_path
39
- end
36
+ subject.root = '~/Desktop'
37
+ subject.class_variable_get(:@@root).should == Pathname.new('~/Desktop').expand_path
40
38
  end
41
39
  end
42
40
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: contao
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -214,6 +214,7 @@ extra_rdoc_files: []
214
214
  files:
215
215
  - .gitignore
216
216
  - .rspec
217
+ - .travis.yml
217
218
  - Gemfile
218
219
  - LICENSE
219
220
  - README.md
@@ -227,8 +228,10 @@ files:
227
228
  - lib/contao/commands/application.rb
228
229
  - lib/contao/commands/help.rb
229
230
  - lib/contao/compiler.rb
231
+ - lib/contao/core_ext/object.rb
230
232
  - lib/contao/generators/application.rb
231
233
  - lib/contao/generators/base.rb
234
+ - lib/contao/generators/config.rb
232
235
  - lib/contao/javascript_compiler.rb
233
236
  - lib/contao/notifier.rb
234
237
  - lib/contao/stylesheet_compiler.rb
@@ -239,7 +242,6 @@ files:
239
242
  - lib/contao/tasks/whitespace.rake
240
243
  - lib/contao/version.rb
241
244
  - lib/contao_patches/development/development_htaccess.patch
242
- - lib/core_ext/object.rb
243
245
  - lib/guard/assets.rb
244
246
  - lib/monkey_patches.rb
245
247
  - lib/monkey_patches/compass/urls.rb
@@ -247,6 +249,7 @@ files:
247
249
  - spec/lib/contao/coffeescript_compiler_spec.rb
248
250
  - spec/lib/contao/generators/application_spec.rb
249
251
  - spec/lib/contao/generators/base_spec.rb
252
+ - spec/lib/contao/generators/config_spec.rb
250
253
  - spec/lib/contao/javascript_compiler_spec.rb
251
254
  - spec/lib/contao/notifier_spec.rb
252
255
  - spec/lib/contao/stylesheet_compiler_spec.rb
@@ -269,10 +272,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
269
272
  requirements:
270
273
  - - ! '>='
271
274
  - !ruby/object:Gem::Version
272
- version: '0'
273
- segments:
274
- - 0
275
- hash: 4578868734635956444
275
+ version: 1.9.2
276
276
  required_rubygems_version: !ruby/object:Gem::Requirement
277
277
  none: false
278
278
  requirements:
@@ -281,19 +281,24 @@ required_rubygems_version: !ruby/object:Gem::Requirement
281
281
  version: '0'
282
282
  segments:
283
283
  - 0
284
- hash: 4578868734635956444
284
+ hash: -2428308955429716338
285
285
  requirements: []
286
286
  rubyforge_project:
287
287
  rubygems_version: 1.8.24
288
288
  signing_key:
289
289
  specification_version: 3
290
- summary: Contao Integration with Compass, Sass, Coffee-script, Rake, Guard with asset
291
- pre-compiler and asset-manifest generator
290
+ summary: This gem will help you to quickly generate an application using Contao CMS
291
+ which has pre-built support for Sass, Compass, CoffeeScript, Jasmine and Capistrano. It
292
+ also feature hashed assets served by the Contao Assets extension, which allows you
293
+ to have an md5 appended to each of your assets URL on the production site. The
294
+ integration with Capistrano allows you to quickly deploy, copy assets, import database
295
+ and even upload media such as images and PDFs all from the command line using Capistrano.
292
296
  test_files:
293
297
  - spec/lib/contao/application_spec.rb
294
298
  - spec/lib/contao/coffeescript_compiler_spec.rb
295
299
  - spec/lib/contao/generators/application_spec.rb
296
300
  - spec/lib/contao/generators/base_spec.rb
301
+ - spec/lib/contao/generators/config_spec.rb
297
302
  - spec/lib/contao/javascript_compiler_spec.rb
298
303
  - spec/lib/contao/notifier_spec.rb
299
304
  - spec/lib/contao/stylesheet_compiler_spec.rb