blueberry_rails 0.3.4 → 0.3.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +43 -0
  3. data/lib/blueberry_rails/app_builder.rb +53 -15
  4. data/lib/blueberry_rails/generators/app_generator.rb +30 -17
  5. data/lib/blueberry_rails/version.rb +2 -2
  6. data/spec/blueberry_rails_spec.rb +18 -3
  7. data/spec/support/blueberry_rails_helpers.rb +10 -2
  8. data/templates/Gemfile_custom.erb +15 -2
  9. data/templates/{README.md → README.md.erb} +2 -2
  10. data/templates/{gitignore_custom → gitignore_custom.erb} +4 -1
  11. data/templates/gulp/application.js.coffee +11 -0
  12. data/templates/gulp/application.sass +10 -0
  13. data/templates/gulp/config.coffee +47 -0
  14. data/templates/gulp/global.coffee +3 -0
  15. data/templates/gulp/global.sass +8 -0
  16. data/templates/gulp/gulp_helper.rb +16 -0
  17. data/templates/gulp/gulpfile.js +20 -0
  18. data/templates/gulp/message.coffee +1 -0
  19. data/templates/gulp/package.json +53 -0
  20. data/templates/gulp/rev_manifest.rb +5 -0
  21. data/templates/gulp/tasks/browserSync.coffee +6 -0
  22. data/templates/gulp/tasks/browserify.coffee +50 -0
  23. data/templates/gulp/tasks/build.coffee +25 -0
  24. data/templates/gulp/tasks/clean.coffee +6 -0
  25. data/templates/gulp/tasks/default.coffee +3 -0
  26. data/templates/gulp/tasks/fontIcons/generateIconSass.coffee +23 -0
  27. data/templates/gulp/tasks/fontIcons/index.coffee +9 -0
  28. data/templates/gulp/tasks/fontIcons/template.sass +33 -0
  29. data/templates/gulp/tasks/images.coffee +12 -0
  30. data/templates/gulp/tasks/rev/index.coffee +12 -0
  31. data/templates/gulp/tasks/rev/rev-assets.coffee +11 -0
  32. data/templates/gulp/tasks/rev/rev-font-workaround.coffee +49 -0
  33. data/templates/gulp/tasks/sass.coffee +24 -0
  34. data/templates/gulp/tasks/watch.coffee +14 -0
  35. data/templates/gulp/tasks/watchify.coffee +6 -0
  36. data/templates/gulp/util/bundleLogger.coffee +23 -0
  37. data/templates/gulp/util/handleErrors.coffee +11 -0
  38. data/templates/spec_helper.rb +1 -0
  39. metadata +33 -6
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aef7a2456317efb5451806b0ee5131c606bc6a16
4
- data.tar.gz: 1d993bdf5adb37aa9c33cb06967725328ea39c95
3
+ metadata.gz: 720e38eaad71e9e817151d5467b60e1828164130
4
+ data.tar.gz: 5ce3b00ee48fab83f4bf1902eb4411f57a262b5c
5
5
  SHA512:
6
- metadata.gz: 1893a6a91d753c54e265380bfc9bb18192813cc9127253c429f3d7431bf8b1cd4e919a83099a308e4723dd88a8f2726ac2d8d1e1886474904accd862a91d3b46
7
- data.tar.gz: 77f130fa5224c4cd00a71add39c96b1aa5ccaaec9bcc986b4ed6b6ee6398644a64d4ad11078f146d0986239ad9bdc7c9aced4f223e0a35d309177fcd3fd28fd2
6
+ metadata.gz: f9d218811b40d36d6e701028d749666f387aba9f7841db98bbe1ef06c5b28d74e60e902217574902b147ff05a3e8dc0f22df05e7e49268613150b681c7379832
7
+ data.tar.gz: 0945a97e587b73ddcc5be38420eeea6b19d6cae4d6a3b1b5f684cc2eec1de869a088ecbbbd1c0db5ee082ddbd1e72433bac0ac336f0b0b9d8e7449059ce14438
data/README.md CHANGED
@@ -26,6 +26,10 @@ Devise model
26
26
 
27
27
  --devise_model User
28
28
 
29
+ Use Gulp instead of Asset Pipeline
30
+
31
+ --gulp
32
+
29
33
  ## Gems
30
34
 
31
35
  Blueberry Rails template contains following gems by default:
@@ -46,6 +50,45 @@ Testing related:
46
50
  * [Factory Girl](https://github.com/rspec/rspec-rails) as a fixtures replacement
47
51
  * [Rspec](https://github.com/rspec/rspec-rails)
48
52
 
53
+ ## Gulp
54
+
55
+ Based on [Gulp on Rails: Replacing the Asset Pipeline](http://viget.com/extend/gulp-rails-asset-pipeline) and [corresponding GitHub repository](https://github.com/vigetlabs/gulp-rails-pipeline).
56
+
57
+ $ blueberry_rails newproject --gulp
58
+ $ npm install
59
+
60
+ Default Gulp task, compiles stylesheets/javascripts and starts BrowserSync (for frontend dev)
61
+
62
+ $ gulp
63
+
64
+ Compile all assets w/o BrowserSync (for backend dev)
65
+
66
+ $ gulp development
67
+
68
+ Generate production ready assets (including fingerprinting)
69
+
70
+ $ gulp build
71
+
72
+ Start BrowserSync
73
+
74
+ $ gulp watch
75
+
76
+ Optimize image size
77
+
78
+ $ gulp images
79
+
80
+ Generate font icons from SVGs
81
+
82
+ $ gulp fontIcons
83
+
84
+ Add fingerprints to assets
85
+
86
+ $ gulp rev
87
+
88
+ Remove all assets
89
+
90
+ $ gulp clean
91
+
49
92
  ## Other great stuff
50
93
 
51
94
  * Do not secret token in the repo - load it via ENV variable
@@ -4,11 +4,11 @@ module BlueberryRails
4
4
  include BlueberryRails::ActionHelpers
5
5
 
6
6
  def readme
7
- copy_file 'README.md', 'README.md'
7
+ template 'README.md.erb', 'README.md'
8
8
  end
9
9
 
10
10
  def gitignore
11
- copy_file 'gitignore_custom', '.gitignore'
11
+ template 'gitignore_custom.erb', '.gitignore'
12
12
  end
13
13
 
14
14
  def gemfile
@@ -20,7 +20,13 @@ module BlueberryRails
20
20
  end
21
21
 
22
22
  def disable_xml_params
23
- copy_file 'disable_xml_params.rb', 'config/initializers/disable_xml_params.rb'
23
+ copy_file 'disable_xml_params.rb',
24
+ 'config/initializers/disable_xml_params.rb'
25
+ end
26
+
27
+ def hound_config
28
+ copy_file '../.hound.yml', '.hound.yml'
29
+ copy_file '../.rubocop.yml', '.rubocop.yml'
24
30
  end
25
31
 
26
32
  def setup_mailer_hosts
@@ -30,11 +36,6 @@ module BlueberryRails
30
36
  action_mailer_host 'production', "#{app_name}.com"
31
37
  end
32
38
 
33
- def set_ruby_to_version_being_used
34
- inject_into_file 'Gemfile', "\n\nruby '#{RUBY_VERSION}'",
35
- after: /source 'https:\/\/rubygems.org'/
36
- end
37
-
38
39
  def use_postgres_config_template
39
40
  template 'database.yml.erb', 'config/database.yml',
40
41
  force: true
@@ -62,18 +63,19 @@ module BlueberryRails
62
63
  copy_file 'pryrc.rb', '.pryrc'
63
64
  end
64
65
 
65
- def remove_turbolinks
66
- replace_in_file 'app/assets/javascripts/application.js',
67
- /\/\/= require turbolinks\n/,
68
- ''
69
- end
70
-
71
66
  def create_database
72
67
  bundle_command 'exec rake db:create'
73
68
  end
74
69
 
75
70
  def generate_rspec
76
71
  generate 'rspec:install'
72
+
73
+ inject_into_file 'spec/rails_helper.rb',
74
+ "\n# Screenshots\n" \
75
+ "require 'capybara-screenshot/rspec'\n" \
76
+ "Capybara::Screenshot.autosave_on_failure =\n" \
77
+ " (ENV['SCR'] || ENV['AUTO_SCREENSHOT']) == '1'\n",
78
+ after: "Rails is not loaded until this point!\n"
77
79
  end
78
80
 
79
81
  def configure_rspec
@@ -93,7 +95,6 @@ module BlueberryRails
93
95
  bundle_command 'exec guard init'
94
96
  end
95
97
 
96
-
97
98
  def raise_on_unpermitted_parameters
98
99
  configure_environment 'development',
99
100
  'config.action_controller.action_on_unpermitted_parameters = :raise'
@@ -123,6 +124,12 @@ module BlueberryRails
123
124
  inject_into_class 'config/application.rb', 'Application', config
124
125
  end
125
126
 
127
+ def configure_i18n_logger
128
+ configure_environment 'development',
129
+ "# I18n debug\n I18nLogger = ActiveSupport::" \
130
+ "Logger.new(Rails.root.join('log/i18n.log'))"
131
+ end
132
+
126
133
  def configure_travis
127
134
  template 'travis.yml.erb', '.travis.yml'
128
135
  end
@@ -198,5 +205,36 @@ module BlueberryRails
198
205
  run 'git init'
199
206
  end
200
207
 
208
+ # Gulp
209
+ def gulp_files
210
+ copy_file 'gulp/gulp_helper.rb', 'app/helpers/gulp_helper.rb'
211
+ remove_file 'app/assets/stylesheets/application.css'
212
+ copy_file 'gulp/application.sass',
213
+ 'app/assets/stylesheets/application.sass'
214
+ remove_file 'app/assets/javascripts/application.js'
215
+ copy_file 'gulp/application.js.coffee',
216
+ 'app/assets/javascripts/application.js.coffee'
217
+
218
+ application do
219
+ "# Make public assets requireable in manifest files\n " \
220
+ "config.assets.paths << Rails.root.join('public', 'assets', 'stylesheets')\n " \
221
+ "config.assets.paths << Rails.root.join('public', 'assets', 'javascripts')\n"
222
+ end
223
+
224
+ replace_in_file 'config/environments/development.rb',
225
+ 'config.assets.digest = true',
226
+ 'config.assets.digest = false'
227
+
228
+ copy_file 'gulp/rev_manifest.rb', 'config/initializers/rev_manifest.rb'
229
+ copy_file 'gulp/global.coffee', 'gulp/assets/javascripts/global.coffee'
230
+ copy_file 'gulp/message.coffee', 'gulp/assets/javascripts/message.coffee'
231
+ copy_file 'gulp/global.sass', 'gulp/assets/stylesheets/global.sass'
232
+ copy_file 'gulp/config.coffee'
233
+ directory 'gulp/tasks'
234
+ directory 'gulp/util'
235
+ copy_file 'gulp/gulpfile.js', 'gulpfile.js'
236
+ copy_file 'gulp/package.json', 'package.json'
237
+ end
238
+
201
239
  end
202
240
  end
@@ -4,25 +4,33 @@ require 'rails/generators/rails/app/app_generator'
4
4
  module BlueberryRails
5
5
  class AppGenerator < Rails::Generators::AppGenerator
6
6
 
7
- class_option :database, :type => :string, :aliases => '-d',
8
- :default => 'postgresql',
9
- :desc => "Preconfigure for selected database " +
10
- "(options: #{DATABASES.join('/')})"
7
+ class_option :database, type: :string, aliases: '-d', default: 'postgresql',
8
+ desc: "Preconfigure for selected database " \
9
+ "(options: #{DATABASES.join('/')})"
11
10
 
12
11
  # class_option :github, :type => :string, :aliases => '-G', :default => nil,
13
- # :desc => 'Create Github repository and add remote origin pointed to repo'
12
+ # :desc => 'Create Github repository and add remote origin pointed to repo'
14
13
 
15
- class_option :bootstrap, :type => :boolean, :aliases => '-b',
16
- :default => false, :desc => 'Include bootstrap 3'
14
+ class_option :bootstrap, type: :boolean, aliases: '-b', default: false,
15
+ desc: 'Include bootstrap 3'
17
16
 
18
- class_option :devise, :type => :boolean, :aliases => '-D', :default => true,
19
- :desc => 'Include and generate devise'
17
+ class_option :devise, type: :boolean, aliases: '-D', default: true,
18
+ desc: 'Include and generate devise'
20
19
 
21
- class_option :devise_model, :type => :string, :aliases => '-M',
22
- :default => 'User', :desc => 'Name of devise model to generate'
20
+ class_option :devise_model, type: :string, aliases: '-M', default: 'User',
21
+ desc: 'Name of devise model to generate'
23
22
 
24
- class_option :skip_test_unit, :type => :boolean, :aliases => '-T',
25
- :default => true, :desc => 'Skip Test::Unit files'
23
+ class_option :skip_test_unit, type: :boolean, aliases: '-T', default: true,
24
+ desc: 'Skip Test::Unit files'
25
+
26
+ class_option :skip_turbolinks, type: :boolean, default: true,
27
+ desc: "Skip turbolinks gem"
28
+
29
+ class_option :skip_bundle, type: :boolean, aliases: "-B", default: true,
30
+ desc: "Don't run bundle install"
31
+
32
+ class_option :gulp, type: :boolean, aliases: '-g', default: false,
33
+ desc: 'Include Gulp asset pipeline'
26
34
 
27
35
  def finish_template
28
36
  invoke :blueberry_customization
@@ -41,11 +49,10 @@ module BlueberryRails
41
49
  invoke :setup_gems
42
50
  invoke :fix_specs
43
51
  invoke :setup_git
52
+ invoke :setup_gulp
44
53
  end
45
54
 
46
55
  def customize_gemfile
47
- build :replace_gemfile
48
- build :set_ruby_to_version_being_used
49
56
  bundle_command 'install'
50
57
  end
51
58
 
@@ -63,6 +70,7 @@ module BlueberryRails
63
70
  say 'Setting up the development environment'
64
71
  build :configure_generators
65
72
  build :raise_on_unpermitted_parameters
73
+ build :configure_i18n_logger
66
74
  build :configure_mailcatcher
67
75
  end
68
76
 
@@ -91,9 +99,9 @@ module BlueberryRails
91
99
  build :secret_token
92
100
  build :disable_xml_params
93
101
  build :setup_mailer_hosts
94
- build :remove_turbolinks
95
102
  build :create_pryrc
96
103
  build :add_ruby_version_file
104
+ build :hound_config
97
105
  end
98
106
 
99
107
  def remove_routes_comment_lines
@@ -122,6 +130,12 @@ module BlueberryRails
122
130
  build :init_git
123
131
  end
124
132
 
133
+ def setup_gulp
134
+ if options[:gulp]
135
+ say 'Adding Gulp asset pipeline'
136
+ build :gulp_files
137
+ end
138
+ end
125
139
 
126
140
  def run_bundle
127
141
  end
@@ -131,7 +145,6 @@ module BlueberryRails
131
145
  def get_builder_class
132
146
  BlueberryRails::AppBuilder
133
147
  end
134
-
135
148
  end
136
149
  end
137
150
 
@@ -1,7 +1,7 @@
1
1
  module BlueberryRails
2
- VERSION = '0.3.4'
2
+ VERSION = '0.3.5'
3
3
 
4
4
  RUBY_VERSION = '2.2.1'
5
5
 
6
- RAILS_VERSION = '4.2.0'
6
+ RAILS_VERSION = '4.2.1'
7
7
  end
@@ -19,15 +19,30 @@ class BlueberryRailsTest < Minitest::Test
19
19
  def test_rake_runs_cleanly
20
20
  create_project
21
21
 
22
- assert_exist_file 'config', 'initializers', 'simple_form.rb'
22
+ assert_exist_file 'config/initializers/simple_form.rb'
23
+ assert_exist_file '.hound.yml'
24
+ assert_exist_file '.rubocop.yml'
25
+ assert_exist_file '.rspec'
26
+ assert_file_have_content 'README.md', 'Test Project'
23
27
  assert run_rake
24
28
  end
25
29
 
26
30
  def test_rake_runs_with_bootstrap_option
27
31
  create_project '--bootstrap'
28
32
 
29
- assert_exist_file 'config', 'initializers', 'simple_form.rb'
30
- assert_exist_file 'config', 'initializers', 'simple_form_bootstrap.rb'
33
+ assert_exist_file 'config/initializers/simple_form.rb'
34
+ assert_exist_file 'config/initializers/simple_form_bootstrap.rb'
35
+ assert run_rake
36
+ end
37
+
38
+ def test_rake_runs_with_gulp_option
39
+ create_project '--gulp'
40
+
41
+ assert_file_have_content 'config/environments/development.rb',
42
+ 'config.assets.digest = false'
43
+ assert_exist_file 'gulp/tasks/default.coffee'
44
+ assert_exist_file 'gulpfile.js'
45
+ assert_exist_file 'package.json'
31
46
  assert run_rake
32
47
  end
33
48
  end
@@ -36,7 +36,15 @@ module BlueberryRailsHelpers
36
36
  File.expand_path('../../../', __FILE__)
37
37
  end
38
38
 
39
- def assert_exist_file(*path)
40
- assert File.exists?(File.join(project_path, *path))
39
+ def assert_exist_file(path)
40
+ assert File.exists?(project_file(path))
41
+ end
42
+
43
+ def assert_file_have_content(path, content)
44
+ assert File.read(project_file(path)).include?(content)
45
+ end
46
+
47
+ def project_file(path)
48
+ File.join(project_path, path)
41
49
  end
42
50
  end
@@ -1,7 +1,11 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ ruby '<%= BlueberryRails::RUBY_VERSION %>'
4
+
3
5
  gem 'airbrake'
6
+ <% if !options[:gulp] -%>
4
7
  gem 'autoprefixer-rails'
8
+ <% end -%>
5
9
  <% if options[:bootstrap] -%>
6
10
  gem 'bootstrap-sass'
7
11
  <% end -%>
@@ -21,6 +25,7 @@ gem 'uglifier', '>= 1.3.0'
21
25
  gem 'unicorn'
22
26
 
23
27
  group :development do
28
+ gem 'awesome_print'
24
29
  gem 'better_errors'
25
30
  gem 'binding_of_caller'
26
31
  gem 'capistrano', '~> 3.0.0'
@@ -30,12 +35,17 @@ group :development do
30
35
  gem 'guard-rspec'
31
36
  gem 'mailcatcher'
32
37
  gem 'pry-rails'
38
+ gem 'quiet_assets'
39
+ gem 'rails-i18n-debug', github: 'XeeD/rails-i18n-debug'
40
+ gem 'rubocop', require: false
33
41
  gem 'spring'
34
- gem 'web-console', '~> 2.0'
42
+ gem 'spring-commands-rspec'
35
43
  end
36
44
 
37
45
  group :development, :test do
38
46
  gem 'factory_girl_rails'
47
+ gem 'pry-byebug'
48
+ gem 'pry-doc'
39
49
  gem 'rspec-rails', '>= 3.1'
40
50
  end
41
51
 
@@ -44,8 +54,11 @@ group :staging, :production do
44
54
  end
45
55
 
46
56
  group :test do
47
- gem 'poltergeist', '>= 1.5.0'
57
+ gem 'capybara-screenshot'
48
58
  gem 'database_cleaner'
59
+ gem 'launchy'
60
+ gem 'poltergeist', '>= 1.5.0'
49
61
  gem 'simplecov', '~> 0.9.1', require: false
62
+ gem 'webmock'
50
63
  end
51
64
 
@@ -1,4 +1,4 @@
1
- # Yet another Blueberry Rails project
1
+ # <%= app_name.titleize %> – Blueberry Rails project
2
2
 
3
3
  Use the following guides for getting things done, programming well, and
4
4
  programming in style.
@@ -6,4 +6,4 @@ programming in style.
6
6
  * [Protocol](http://github.com/thoughtbot/guides/blob/master/protocol)
7
7
  * [Best Practices](http://github.com/thoughtbot/guides/blob/master/best-practices)
8
8
  * [Style](http://github.com/thoughtbot/guides/blob/master/style)
9
-
9
+ * [Git commit message](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html)
@@ -15,4 +15,7 @@ rerun.txt
15
15
  tags
16
16
  tmp/*
17
17
  tmp/**/*
18
-
18
+ <% if options[:gulp] -%>
19
+ node_modules
20
+ /public/assets/*
21
+ <% end -%>
@@ -0,0 +1,11 @@
1
+ # This is a manifest file that'll be compiled into application.js, which will
2
+ # include all the files listed below.
3
+ #
4
+ # Only include gem installed javascript assets here. All other JS develoment
5
+ # should use Common JS and will be compiled with Gulp and Browserify.
6
+ #
7
+ #= require jquery
8
+ #= require jquery_ujs
9
+ #
10
+ # Pull compiled from /public/assets/javascripts
11
+ #= require global
@@ -0,0 +1,10 @@
1
+ /*
2
+ * This is a manifest file that'll be compiled into application.css, which will
3
+ * include all the files listed below.
4
+ *
5
+ * Use this file to include any stylesheet assets from installed gems. All other
6
+ * css is compiled with libsass with Gulp.
7
+ *
8
+ * Pull compiled from /public/assets/stylesheets
9
+ *= require global
10
+ */
@@ -0,0 +1,47 @@
1
+ publicAssets = './public/assets'
2
+ sourceFiles = './gulp/assets'
3
+
4
+ module.exports =
5
+ publicAssets: publicAssets
6
+
7
+ browserSync:
8
+ proxy: 'localhost:3000'
9
+ files: [ './app/views/**' ]
10
+
11
+ sass:
12
+ src: sourceFiles + '/stylesheets/**/*.sass'
13
+ dest: publicAssets + '/stylesheets'
14
+ settings:
15
+ indentedSyntax: true
16
+ imagePath: '/assets/images'
17
+ errLogToConsole: true
18
+
19
+ images:
20
+ src: sourceFiles + '/images/**'
21
+ dest: publicAssets + '/images'
22
+
23
+ fontIcons:
24
+ name: 'Font Icons'
25
+ src: sourceFiles + '/icons/*.svg'
26
+ dest: publicAssets + '/fonts'
27
+ sassDest: sourceFiles + '/stylesheets/base'
28
+ template: './gulp/tasks/fontIcons/template.sass'
29
+ sassOutputName: '_font_icons.sass'
30
+ fontPath: '/assets/fonts'
31
+ className: 'icon'
32
+ options:
33
+ fontName: 'font-icons'
34
+ appendCodepoints: true
35
+ normalize: false
36
+
37
+ browserify: bundleConfigs: [ {
38
+ entries: [
39
+ # import React
40
+ #'./node_modules/react/dist/react.js'
41
+ sourceFiles + '/javascripts/global.coffee'
42
+ ]
43
+ dest: publicAssets + '/javascripts'
44
+ outputName: 'global.js'
45
+ extensions: [ '.js', '.coffee' ]
46
+ debug: !process.env.RAILS_ENV == 'production'
47
+ } ]
@@ -0,0 +1,3 @@
1
+ message = require './message'
2
+
3
+ console.log message
@@ -0,0 +1,8 @@
1
+ @import node_modules/bootstrap-sass/assets/stylesheets/bootstrap
2
+ // Uncomment after adding any SVG and running gulp fontIcons
3
+ //@import base/font_icons
4
+
5
+ body
6
+ font-family: sans-serif
7
+ background: fireBrick
8
+ color: white
@@ -0,0 +1,16 @@
1
+ module GulpHelper
2
+
3
+ def gulp_asset_path(path)
4
+ path = REV_MANIFEST[path] if defined?(REV_MANIFEST)
5
+ "/assets/#{path}"
6
+ end
7
+
8
+ def image_alt(src)
9
+ super.sub(/\s[0-9A-F]{8}\z/i, '')
10
+ end
11
+
12
+ def image_tag(image, options = {})
13
+ super(gulp_asset_path("images/#{image}"), options)
14
+ end
15
+
16
+ end
@@ -0,0 +1,20 @@
1
+ /*
2
+ gulpfile.js
3
+ ===========
4
+ Rather than manage one giant configuration file responsible
5
+ for creating multiple tasks, each task has been broken out into
6
+ its own file in gulp/tasks. Any files in that directory get
7
+ automatically required below.
8
+
9
+ To add a new task, simply add a new task file that directory.
10
+ gulp/tasks/default.js specifies the default set of tasks to run
11
+ when you run `gulp`.
12
+ */
13
+
14
+ var requireDir = require('require-dir');
15
+
16
+ // Note the new way of requesting CoffeeScript since 1.7.x
17
+ require('coffee-script/register');
18
+
19
+ // Require all tasks in gulp/tasks, including subfolders
20
+ requireDir('./gulp/tasks', { recurse: true });
@@ -0,0 +1 @@
1
+ module.exports = 'Common.js module'
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "gulp-rails",
3
+ "description": "Gulp Asset Pipeline with Rails",
4
+ "engines": {
5
+ "node": "0.10.36",
6
+ "npm": "2.3.0"
7
+ },
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git://github.com/geoRG77/rails-gulp.git"
11
+ },
12
+ "scripts": {
13
+ "postinstall": "gulp build"
14
+ },
15
+ "browserify": {
16
+ "transform": [
17
+ "coffeeify"
18
+ ]
19
+ },
20
+ "dependencies": {
21
+ "bootstrap-sass": "^3.3.4",
22
+ "browser-sync": "~1.3.6",
23
+ "browserify": "^8.0.2",
24
+ "coffee-script": "^1.9.1",
25
+ "coffeeify": "~0.7.0",
26
+ "del": "^1.1.1",
27
+ "gulp": "^3.8.7",
28
+ "gulp-autoprefixer": "^2.0.0",
29
+ "gulp-changed": "^0.4.1",
30
+ "gulp-cjsx": "^2.0.0",
31
+ "gulp-filesize": "0.0.6",
32
+ "gulp-iconfont": "^1.0.0",
33
+ "gulp-imagemin": "^0.6.2",
34
+ "gulp-minify-css": "^1.0.0",
35
+ "gulp-rename": "^1.2.0",
36
+ "gulp-rev": "^3.0.1",
37
+ "gulp-rev-collector": "^0.1.3",
38
+ "gulp-sass": "~1.3.1",
39
+ "gulp-sequence": "^0.3.2",
40
+ "gulp-sourcemaps": "^1.2.8",
41
+ "gulp-swig": "^0.7.4",
42
+ "gulp-util": "^3.0.0",
43
+ "lodash": "^2.4.1",
44
+ "merge-stream": "^0.1.7",
45
+ "pretty-hrtime": "~0.2.1",
46
+ "require-dir": "^0.1.0",
47
+ "vinyl-source-stream": "~0.1.1",
48
+ "watchify": "^2.2.1"
49
+ },
50
+ "devDependencies": {
51
+ "gulp-watch": "^4.1.1"
52
+ }
53
+ }
@@ -0,0 +1,5 @@
1
+ rev_manifest_path = 'public/assets/rev-manifest.json'
2
+
3
+ if File.exist?(rev_manifest_path)
4
+ REV_MANIFEST = JSON.parse(File.read(rev_manifest_path))
5
+ end
@@ -0,0 +1,6 @@
1
+ browserSync = require 'browser-sync'
2
+ gulp = require 'gulp'
3
+ config = require('../config').browserSync
4
+
5
+ gulp.task 'browserSync', ->
6
+ browserSync config
@@ -0,0 +1,50 @@
1
+ _ = require 'lodash'
2
+ browserify = require 'browserify'
3
+ browserSync = require 'browser-sync'
4
+ bundleLogger = require '../util/bundleLogger'
5
+ config = require('../config').browserify
6
+ gulp = require 'gulp'
7
+ handleErrors = require '../util/handleErrors'
8
+ source = require 'vinyl-source-stream'
9
+ watchify = require 'watchify'
10
+
11
+ browserifyTask = (callback, devMode) ->
12
+ bundleQueue = config.bundleConfigs.length
13
+
14
+ browserifyThis = (bundleConfig) ->
15
+ if devMode
16
+ _.extend bundleConfig, watchify.args, debug: true
17
+ bundleConfig = _.omit(bundleConfig, [ 'external', 'require' ])
18
+ b = browserify(bundleConfig)
19
+
20
+ bundle = ->
21
+ bundleLogger.start bundleConfig.outputName
22
+
23
+ b.bundle().on('error', handleErrors)
24
+ .pipe source(bundleConfig.outputName)
25
+ .pipe gulp.dest(bundleConfig.dest).on('end', reportFinished)
26
+ .pipe browserSync.reload(stream: true)
27
+
28
+ if devMode
29
+ b = watchify(b)
30
+ b.on 'update', bundle
31
+ bundleLogger.watch bundleConfig.outputName
32
+ else
33
+ if bundleConfig.require
34
+ b.require bundleConfig.require
35
+ if bundleConfig.external
36
+ b.external bundleConfig.external
37
+
38
+ reportFinished = ->
39
+ bundleLogger.end bundleConfig.outputName
40
+ if bundleQueue
41
+ bundleQueue--
42
+ if bundleQueue == 0
43
+ callback()
44
+
45
+ bundle()
46
+
47
+ config.bundleConfigs.forEach browserifyThis
48
+
49
+ gulp.task 'browserify', browserifyTask
50
+ module.exports = browserifyTask
@@ -0,0 +1,25 @@
1
+ gulp = require 'gulp'
2
+ gulpSequence = require 'gulp-sequence'
3
+
4
+ gulp.task 'build', (cb) ->
5
+ tasks = [
6
+ 'clean'
7
+ [ 'fontIcons', 'images' ]
8
+ [ 'sass:production', 'browserify' ]
9
+ ]
10
+
11
+ if process.env.RAILS_ENV == 'production'
12
+ tasks.push 'rev'
13
+
14
+ tasks.push cb
15
+ gulpSequence.apply this, tasks
16
+
17
+ gulp.task 'development', (cb) ->
18
+ tasks = [
19
+ 'clean'
20
+ [ 'fontIcons', 'images' ]
21
+ [ 'sass', 'browserify' ]
22
+ ]
23
+
24
+ tasks.push cb
25
+ gulpSequence.apply this, tasks
@@ -0,0 +1,6 @@
1
+ gulp = require 'gulp'
2
+ del = require 'del'
3
+ config = require '../config'
4
+
5
+ gulp.task 'clean', (cb) ->
6
+ del [ config.publicAssets ], cb
@@ -0,0 +1,3 @@
1
+ gulp = require 'gulp'
2
+
3
+ gulp.task 'default', [ 'sass', 'watch' ]
@@ -0,0 +1,23 @@
1
+ gulp = require 'gulp'
2
+ config = require('../../config').fontIcons
3
+ template = require 'gulp-swig'
4
+ rename = require 'gulp-rename'
5
+
6
+ module.exports = (codepoints, options) ->
7
+ iconSass = template(data:
8
+ icons: codepoints.map((icon) ->
9
+ {
10
+ name: icon.name
11
+ code: icon.codepoint.toString(16)
12
+ }
13
+ )
14
+ fontName: config.options.fontName
15
+ fontPath: config.fontPath
16
+ className: config.className
17
+ comment: 'DO NOT EDIT DIRECTLY!\n Generated by ./gulp/tasks/fontIcons/ge' +
18
+ 'nerateIconSass.coffee\n from ' + config.template)
19
+
20
+ gulp.src(config.template)
21
+ .pipe iconSass
22
+ .pipe rename(config.sassOutputName)
23
+ .pipe gulp.dest(config.sassDest)
@@ -0,0 +1,9 @@
1
+ gulp = require 'gulp'
2
+ iconfont = require 'gulp-iconfont'
3
+ config = require('../../config').fontIcons
4
+ generateIconSass = require './generateIconSass'
5
+
6
+ gulp.task 'fontIcons', ->
7
+ gulp.src(config.src)
8
+ .pipe iconfont(config.options).on('codepoints', generateIconSass)
9
+ .pipe gulp.dest(config.dest)
@@ -0,0 +1,33 @@
1
+ // {{comment}}
2
+
3
+ @font-face
4
+ font-family: {{fontName}}
5
+ src: url("{{fontPath}}/{{fontName}}.eot")
6
+ src: url("{{fontPath}}/{{fontName}}.eot?#iefix") format('embedded-opentype'), url("{{fontPath}}/{{fontName}}.woff") format('woff'), url("{{fontPath}}/{{fontName}}.ttf") format('truetype'), url("{{fontPath}}/{{fontName}}.svg#{{fontName}}") format('svg')
7
+ font-weight: normal
8
+ font-style: normal
9
+
10
+ =icon($content)
11
+ &:before
12
+ content: $content
13
+ font-family: '{{fontName}}'
14
+ font-style: normal
15
+ font-variant: normal
16
+ font-weight: normal
17
+ line-height: 1
18
+ speak: none
19
+ text-transform: none
20
+ -moz-osx-font-smoothing: grayscale
21
+ -webkit-font-smoothing: antialiased
22
+ @content
23
+
24
+ {% for icon in icons -%}
25
+ =icon--{{icon.name}}
26
+ +icon("\{{icon.code}}")
27
+ @content
28
+
29
+ .icon
30
+ &.{{icon.name}}
31
+ +icon--{{icon.name}}
32
+
33
+ {% endfor %}
@@ -0,0 +1,12 @@
1
+ changed = require 'gulp-changed'
2
+ gulp = require 'gulp'
3
+ imagemin = require 'gulp-imagemin'
4
+ config = require('../config').images
5
+ browserSync = require 'browser-sync'
6
+
7
+ gulp.task 'images', ->
8
+ gulp.src(config.src)
9
+ .pipe changed(config.dest)
10
+ .pipe imagemin()
11
+ .pipe gulp.dest(config.dest)
12
+ .pipe browserSync.reload(stream: true)
@@ -0,0 +1,12 @@
1
+ config = require '../../config'
2
+ gulp = require 'gulp'
3
+ revCollector = require 'gulp-rev-collector'
4
+
5
+ # Replace asset references in compiled CSS and JS files
6
+ gulp.task 'rev', [ 'rev-assets', 'rev-font-workaround' ], ->
7
+ gulp.src([
8
+ config.publicAssets + '/rev-manifest.json'
9
+ config.publicAssets + '/**/*.{css,js}'
10
+ ])
11
+ .pipe revCollector()
12
+ .pipe gulp.dest(config.publicAssets)
@@ -0,0 +1,11 @@
1
+ config = require '../../config'
2
+ gulp = require 'gulp'
3
+ rev = require 'gulp-rev'
4
+
5
+ # Add md5 hashes to assets
6
+ gulp.task 'rev-assets', ->
7
+ gulp.src(config.publicAssets + '/**/**.!(css|js|eot|woff|ttf)')
8
+ .pipe rev()
9
+ .pipe gulp.dest(config.publicAssets)
10
+ .pipe rev.manifest()
11
+ .pipe gulp.dest(config.publicAssets)
@@ -0,0 +1,49 @@
1
+ # 2) Font rev workaround
2
+ _ = require 'lodash'
3
+ config = require '../../config'
4
+ fs = require 'fs'
5
+ gulp = require 'gulp'
6
+ merge = require 'merge-stream'
7
+ rename = require 'gulp-rename'
8
+ rev = require 'gulp-rev'
9
+
10
+ # .ttf fonts have an embedded timestamp, which cause the contents
11
+ # of the file to change ever-so-slightly. This was a problem for
12
+ # file reving, which generates a hash based on the contents of the file.
13
+ # This meant that even if source files had not changed, the hash would
14
+ # change with every recompile, as well as .eot, and .woff files, which
15
+ # are derived from a source svg font
16
+ # The solution is to only hash svg font files, then append the
17
+ # generated hash to the ttf, eot, and woff files (instead of
18
+ # leting each file generate its own hash)
19
+
20
+ gulp.task 'rev-font-workaround', [ 'rev-assets' ], ->
21
+ manifest = require('../../.' + config.publicAssets + '/rev-manifest.json')
22
+ fontList = []
23
+
24
+ _.each manifest, (reference, key) ->
25
+ fontPath = config.fontIcons.dest.split(config.publicAssets)[1].substr(1)
26
+
27
+ if key.match(fontPath + '/' + config.fontIcons.options.fontName)
28
+ path = key.split('.svg')[0]
29
+ hash = reference.split(path)[1].split('.svg')[0]
30
+
31
+ fontList.push
32
+ path: path
33
+ hash: hash
34
+
35
+ # Add hash to non-svg font files
36
+ streams = fontList.map((file) ->
37
+ # Add references in manifest
38
+ [ '.eot', '.woff', '.ttf' ].forEach (ext) ->
39
+ manifest[file.path + ext] = file.path + file.hash + ext
40
+
41
+ gulp.src(config.publicAssets + '/' + file.path + '*.!(svg)')
42
+ .pipe rename(suffix: file.hash)
43
+ .pipe gulp.dest(config.fontIcons.dest)
44
+ )
45
+
46
+ # Re-write rev-manifest.json to disk
47
+ fs.writeFile config.publicAssets + '/rev-manifest.json',
48
+ JSON.stringify(manifest, null, 2)
49
+ merge.apply this, streams
@@ -0,0 +1,24 @@
1
+ gulp = require 'gulp'
2
+ browserSync = require 'browser-sync'
3
+ sass = require 'gulp-sass'
4
+ sourcemaps = require 'gulp-sourcemaps'
5
+ minifyCSS = require 'gulp-minify-css'
6
+ handleErrors = require '../util/handleErrors'
7
+ config = require('../config').sass
8
+ autoprefixer = require 'gulp-autoprefixer'
9
+
10
+ gulp.task 'sass', ->
11
+ gulp.src(config.src)
12
+ .pipe sourcemaps.init()
13
+ .pipe sass(config.settings).on('error', handleErrors)
14
+ .pipe autoprefixer(browsers: [ 'last 2 version' ])
15
+ .pipe sourcemaps.write()
16
+ .pipe gulp.dest(config.dest)
17
+ .pipe browserSync.reload(stream: true)
18
+
19
+ gulp.task 'sass:production', ->
20
+ gulp.src(config.src)
21
+ .pipe sass(config.settings).on('error', handleErrors)
22
+ .pipe autoprefixer(browsers: [ 'last 2 version' ])
23
+ .pipe minifyCSS()
24
+ .pipe gulp.dest(config.dest)
@@ -0,0 +1,14 @@
1
+ ### Notes:
2
+ - gulp/tasks/browserify.js handles js recompiling with watchify
3
+ - gulp/tasks/browserSync.js watches and reloads compiled files
4
+ ###
5
+
6
+ gulp = require 'gulp'
7
+ config = require '../config'
8
+ watch = require 'gulp-watch'
9
+
10
+ gulp.task 'watch', [ 'watchify', 'browserSync' ], (callback) ->
11
+ watch config.sass.src, ->
12
+ gulp.start 'sass'
13
+ watch config.images.src, ->
14
+ gulp.start 'images'
@@ -0,0 +1,6 @@
1
+ gulp = require 'gulp'
2
+ browserifyTask = require './browserify'
3
+
4
+ gulp.task 'watchify', (callback) ->
5
+ # Start browserify task with devMode === true
6
+ browserifyTask callback, true
@@ -0,0 +1,23 @@
1
+ ### bundleLogger
2
+ Provides gulp style logs to the bundle method in browserify.js
3
+ ###
4
+
5
+ gutil = require 'gulp-util'
6
+ prettyHrtime = require 'pretty-hrtime'
7
+ startTime = undefined
8
+
9
+ module.exports =
10
+ start: (filepath) ->
11
+ startTime = process.hrtime()
12
+ gutil.log 'Bundling', gutil.colors.green(filepath) + '...'
13
+
14
+ watch: (bundleName) ->
15
+ gutil.log 'Watching files required by', gutil.colors.yellow(bundleName)
16
+
17
+ end: (filepath) ->
18
+ taskTime = process.hrtime(startTime)
19
+ prettyTime = prettyHrtime(taskTime)
20
+ gutil.log 'Bundled',
21
+ gutil.colors.green(filepath),
22
+ 'in',
23
+ gutil.colors.magenta(prettyTime)
@@ -0,0 +1,11 @@
1
+ module.exports = ->
2
+ args = Array::slice.call(arguments)
3
+
4
+ # Send error to notification center with gulp-notify
5
+ #notify.onError(
6
+ # title: 'Compile Error'
7
+ #message: '<%= error %>').apply this, args
8
+ console.log args
9
+
10
+ # Keep gulp from hanging on this task
11
+ @emit 'end'
@@ -25,3 +25,4 @@ end
25
25
 
26
26
  Capybara.javascript_driver = :poltergeist
27
27
 
28
+ WebMock.disable_net_connect!(allow_localhost: true, allow: 'codeclimate.com')
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: blueberry_rails
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.4
4
+ version: 0.3.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - BlueberryApps
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-17 00:00:00.000000000 Z
11
+ date: 2015-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: 4.2.0
33
+ version: 4.2.1
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: 4.2.0
40
+ version: 4.2.1
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rake
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -79,7 +79,7 @@ files:
79
79
  - spec/support/blueberry_rails_helpers.rb
80
80
  - templates/Capfile
81
81
  - templates/Gemfile_custom.erb
82
- - templates/README.md
82
+ - templates/README.md.erb
83
83
  - templates/_flashes.html.slim
84
84
  - templates/capistrano_dotenv.cap
85
85
  - templates/database.yml.erb
@@ -90,7 +90,34 @@ files:
90
90
  - templates/disable_xml_params.rb
91
91
  - templates/factories_spec.rb
92
92
  - templates/factory_girl_syntax.rb
93
- - templates/gitignore_custom
93
+ - templates/gitignore_custom.erb
94
+ - templates/gulp/application.js.coffee
95
+ - templates/gulp/application.sass
96
+ - templates/gulp/config.coffee
97
+ - templates/gulp/global.coffee
98
+ - templates/gulp/global.sass
99
+ - templates/gulp/gulp_helper.rb
100
+ - templates/gulp/gulpfile.js
101
+ - templates/gulp/message.coffee
102
+ - templates/gulp/package.json
103
+ - templates/gulp/rev_manifest.rb
104
+ - templates/gulp/tasks/browserSync.coffee
105
+ - templates/gulp/tasks/browserify.coffee
106
+ - templates/gulp/tasks/build.coffee
107
+ - templates/gulp/tasks/clean.coffee
108
+ - templates/gulp/tasks/default.coffee
109
+ - templates/gulp/tasks/fontIcons/generateIconSass.coffee
110
+ - templates/gulp/tasks/fontIcons/index.coffee
111
+ - templates/gulp/tasks/fontIcons/template.sass
112
+ - templates/gulp/tasks/images.coffee
113
+ - templates/gulp/tasks/rev/index.coffee
114
+ - templates/gulp/tasks/rev/rev-assets.coffee
115
+ - templates/gulp/tasks/rev/rev-font-workaround.coffee
116
+ - templates/gulp/tasks/sass.coffee
117
+ - templates/gulp/tasks/watch.coffee
118
+ - templates/gulp/tasks/watchify.coffee
119
+ - templates/gulp/util/bundleLogger.coffee
120
+ - templates/gulp/util/handleErrors.coffee
94
121
  - templates/layout.html.slim
95
122
  - templates/pryrc.rb
96
123
  - templates/root_controller_spec.rb