blueberry_rails 0.3.4 → 0.3.5

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.
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