volt 0.9.5.pre7 → 0.9.5.pre8

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 (38) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +5 -0
  3. data/lib/volt/cli.rb +21 -12
  4. data/lib/volt/cli/asset_compile.rb +13 -8
  5. data/lib/volt/cli/base_index_renderer.rb +4 -3
  6. data/lib/volt/cli/new_gem.rb +22 -4
  7. data/lib/volt/models/model.rb +3 -0
  8. data/lib/volt/models/validators/length_validator.rb +2 -2
  9. data/lib/volt/page/bindings/event_binding.rb +4 -4
  10. data/lib/volt/server/middleware/default_middleware_stack.rb +2 -2
  11. data/lib/volt/server/rack/asset_files.rb +12 -7
  12. data/lib/volt/server/rack/component_code.rb +3 -2
  13. data/lib/volt/server/rack/component_paths.rb +1 -1
  14. data/lib/volt/server/rack/index_files.rb +5 -5
  15. data/lib/volt/server/rack/opal_files.rb +7 -6
  16. data/lib/volt/server/rack/sprockets_helpers_setup.rb +41 -7
  17. data/lib/volt/server/template_handlers/sprockets_component_handler.rb +1 -1
  18. data/lib/volt/utils/recursive_exists.rb +19 -0
  19. data/lib/volt/version.rb +1 -1
  20. data/lib/volt/volt/app.rb +3 -1
  21. data/lib/volt/volt/server_setup/app.rb +8 -0
  22. data/spec/apps/file_loading/app/disable_auto/config/dependencies.rb +1 -1
  23. data/spec/apps/kitchen_sink/Gemfile +1 -1
  24. data/spec/apps/kitchen_sink/app/main/views/main/store_demo.html +1 -5
  25. data/spec/integration/todos_spec.rb +26 -2
  26. data/spec/models/validators/length_validator_spec.rb +2 -10
  27. data/spec/server/rack/asset_files_spec.rb +35 -35
  28. data/spec/server/rack/rack_requests_spec.rb +2 -1
  29. data/spec/server/rack/sprockets_helpers_setup.rb +15 -0
  30. data/templates/newgem/Gemfile.tt +11 -0
  31. data/templates/newgem/app/newgem/tasks/.empty_directory +0 -0
  32. data/templates/newgem/newgem.gemspec.tt +16 -1
  33. data/templates/newgem/spec/integration/sample_integration_spec.rb +11 -0
  34. data/templates/newgem/spec/newgem_spec.rb.tt +0 -4
  35. data/templates/newgem/spec/spec_helper.rb.tt +5 -1
  36. data/templates/project/Gemfile.tt +5 -5
  37. data/volt.gemspec +1 -1
  38. metadata +10 -5
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4f390816bb9edfcbfae226435bb32d20e2d70ea4
4
- data.tar.gz: ea40df8a4eceb9edc38baa64cd70499537d8d4aa
3
+ metadata.gz: c66c8281cc4ad10eadde2b575b4ca2606cf270e8
4
+ data.tar.gz: f76598259c1dcd62376c61efb2f208295bc221cd
5
5
  SHA512:
6
- metadata.gz: 12e637430dd9d239703bf3383132610128245e3b0ec1509bd027ba6ed9835aac3538c5e15e5f9be35a58bb4fde768aec0f001c88226e4e8b25abf0b95e70539c
7
- data.tar.gz: 0ed51b143c52f690c813afe97b7e1decd282b6800269af5b8b9d3953dc742e60da863b5608c7a7cb3881fffe3935c3a9c5f0558d51fa12f028f2f051d100cbb9
6
+ metadata.gz: a5f7e6b83f481e1c81222c93df07f77a2fc3dc8715de60712950701cda264c6192fa9ce294d680f4ce77fba651948562386d774e312893862a374e0b7253218a
7
+ data.tar.gz: 89030a005ae230751ed6f45f0afaa1ac190fbe0c0abe3fb63f9e7643ffda2675904748251f86dd4bbab53a84fb70af0bb208f5e42ef95bb7a6591d6d25668dde
data/CHANGELOG.md CHANGED
@@ -1,6 +1,9 @@
1
1
  # Change Log
2
2
 
3
3
  ## 0.9.5
4
+ ### Breaking Changes
5
+ - previously, we mounted the asset folders in components at /assets, and we also mounted the /app folder (and any gem's app folders') at /assets. This allowed you to usually access what you wanted at /assets, but resulted in conflicts. To ensure better component isolation, we now only mount the ```app``` folders. To make things clear, instead of sprockets being mounted at /assets, it is now mounted at /app. So the url for something in /app/main/assets/css/something.css can be accessed at (you guessed it) /app/main/assets/css/something.css
6
+
4
7
  ### Added
5
8
  - You can now disable auto-import of JS/CSS with ```disable_auto_import``` in a dependencies.rb file
6
9
  - Opal was upgraded to 0.8, which brings sourcemaps back (yah!)
@@ -12,6 +15,8 @@
12
15
  - Rewrote the precompile pipeline.
13
16
  - Added image compression by default. (using image_optim)
14
17
  - All volt CLI tasks now can run from inside of any directory in the volt app (or the root)
18
+ - Asset precompilation has been reworked to use Sprockets::Manifest. The results are written to /public, and an index.html file is created. The entire app loading up until the websocket connect can be served statically (via nginx for example) All js and css is written to a single file.
19
+ - The ```generate gem``` generator has been improved to setup a dummy app and integration specs out of the box.
15
20
 
16
21
  ### Changed
17
22
  - fix issue with ```raw``` and promises (#275)
data/lib/volt/cli.rb CHANGED
@@ -17,16 +17,7 @@ module Volt
17
17
  desc 'new PROJECT_NAME', 'generates a new project.'
18
18
 
19
19
  def new(name)
20
- require 'securerandom'
21
-
22
- # Grab the current volt version
23
- directory('project', name, version: Volt::Version::STRING, name: name, domain: name.dasherize.downcase, app_name: name.capitalize)
24
-
25
- # Move into the directory
26
- Dir.chdir(name) do
27
- # bundle
28
- bundle_command('install')
29
- end
20
+ new_project(name)
30
21
 
31
22
  say ""
32
23
  say "Your app is now ready in the #{name} directory.", :green
@@ -63,11 +54,12 @@ module Volt
63
54
 
64
55
  require 'fileutils'
65
56
  require 'volt/server'
57
+ require 'volt/utils/recursive_exists'
66
58
 
67
59
  # If we're in a Volt project, clear the temp directory
68
60
  # TODO: this is a work around for a bug when switching between
69
61
  # source maps and non-source maps.
70
- if File.exist?('config.ru') && File.exist?('Gemfile')
62
+ if RecursiveExists.exists_here_or_up?('config.ru') && RecursiveExists.exists_here_or_up?('Gemfile')
71
63
  # FileUtils.rm_rf('tmp/sass')
72
64
  # FileUtils.rm_rf('tmp/sprockets')
73
65
  else
@@ -126,13 +118,30 @@ module Volt
126
118
  end
127
119
 
128
120
  no_tasks do
121
+ # The logic for creating a new project. We want to be able to invoke this
122
+ # inside of a method so we can run it with Dir.chdir
123
+ def new_project(name, skip_gemfile = false)
124
+ require 'securerandom'
125
+
126
+ # Grab the current volt version
127
+ directory('project', name, version: Volt::Version::STRING, name: name, domain: name.dasherize.downcase, app_name: name.capitalize)
128
+
129
+ unless skip_gemfile
130
+ # Move into the directory
131
+ Dir.chdir(name) do
132
+ # bundle
133
+ bundle_command('install')
134
+ end
135
+ end
136
+ end
137
+
129
138
  def move_to_root
130
139
  unless Gem.win_platform?
131
140
  # Change CWD to the root of the volt project
132
141
  pwd = Dir.pwd
133
142
  changed = false
134
143
  loop do
135
- if File.exists?(pwd + '/Gemfile')
144
+ if File.exists?(pwd + '/config.ru') || File.exists?(pwd + '/Gemfile')
136
145
  Dir.chdir(pwd) if changed
137
146
  break
138
147
  else
@@ -16,6 +16,11 @@ module Volt
16
16
  ENV['MAPS'] = 'false'
17
17
  ENV['NO_FORKING'] = 'true'
18
18
 
19
+ if !ENV['VOLT_ENV'] && !ENV['RACK_ENV']
20
+ # Set the default env for compile
21
+ ENV['VOLT_ENV'] = 'production'
22
+ end
23
+
19
24
  require 'opal'
20
25
  require 'rack'
21
26
  require 'volt'
@@ -41,7 +46,7 @@ module Volt
41
46
  end
42
47
 
43
48
  def write_files_and_manifest
44
- asset_files = AssetFiles.from_cache('main', @volt_app.component_paths)
49
+ asset_files = AssetFiles.from_cache(@volt_app.app_url, 'main', @volt_app.component_paths)
45
50
  # Write a temp css file
46
51
  js = asset_files.javascript(@volt_app)
47
52
  css = asset_files.css
@@ -51,7 +56,7 @@ module Volt
51
56
  js.each do |type, src_or_body|
52
57
  if type == :src
53
58
  src = src_or_body
54
- url = src.gsub(/^\/assets\//, '')
59
+ url = src.gsub(/^#{@volt_app.app_url}\//, '')
55
60
  file.write("//= require '#{url}'\n")
56
61
  else
57
62
  body = src_or_body
@@ -73,14 +78,14 @@ module Volt
73
78
 
74
79
  File.open(Volt.root + '/app/main/app.scss', 'wb') do |file|
75
80
  css.each do |link|
76
- url = link.gsub(/^\/assets\//, '')
81
+ url = link.gsub(/^#{@volt_app.app_url}\//, '')
77
82
  file.write("//= require '#{url}'\n")
78
83
  end
79
84
  end
80
85
  end
81
86
 
82
87
  def compile_manifests
83
- manifest = Sprockets::Manifest.new(@volt_app.sprockets, './public/assets/manifest.json')
88
+ manifest = Sprockets::Manifest.new(@volt_app.sprockets, "./public#{@volt_app.app_url}/manifest.json")
84
89
 
85
90
  # Compile the files (and linked assets)
86
91
  manifest.compile('main/app.js')
@@ -90,8 +95,8 @@ module Volt
90
95
  @tmp_files.each {|path| FileUtils.rm(path) }
91
96
 
92
97
  # Remove the temp files
93
- FileUtils.rm(Volt.root + '/app/main/app.js')
94
- FileUtils.rm(Volt.root + '/app/main/app.scss')
98
+ FileUtils.rm(Volt.root + "#{@volt_app.app_url}/main/app.js")
99
+ FileUtils.rm(Volt.root + "#{@volt_app.app_url}/main/app.scss")
95
100
  end
96
101
 
97
102
  def write_index
@@ -100,8 +105,8 @@ module Volt
100
105
  output_path = "#{@root_path}/public/index.html"
101
106
  require 'json'
102
107
 
103
- @manifest = JSON.parse(File.read(@root_path + '/public/assets/manifest.json'))
104
- output_html = BaseIndexRenderer.new(@manifest).html
108
+ @manifest = JSON.parse(File.read(@root_path + "/public#{@volt_app.app_url}/manifest.json"))
109
+ output_html = BaseIndexRenderer.new(@volt_app, @manifest).html
105
110
 
106
111
  write_file(output_path, output_html)
107
112
  end
@@ -3,7 +3,8 @@
3
3
 
4
4
  module Volt
5
5
  class BaseIndexRenderer
6
- def initialize(manifest)
6
+ def initialize(volt_app, manifest)
7
+ @volt_app = volt_app
7
8
  @manifest = manifest
8
9
  end
9
10
 
@@ -16,11 +17,11 @@ module Volt
16
17
 
17
18
  # When writing the index, we render the
18
19
  def javascript_tags
19
- "<script src=\"/assets/#{@manifest['assets']['main/app.js']}\"></script>"
20
+ "<script async src=\"#{@volt_app.app_url}/#{@manifest['assets']['main/app.js']}\"></script>"
20
21
  end
21
22
 
22
23
  def css_tags
23
- "<link href=\"/assets/#{@manifest['assets']['main/app.css']}\" media=\"all\" rel=\"stylesheet\" type=\"text/css\" />"
24
+ "<link href=\"#{@volt_app.app_url}/#{@manifest['assets']['main/app.css']}\" media=\"all\" rel=\"stylesheet\" type=\"text/css\" />"
24
25
  end
25
26
  end
26
27
  end
@@ -25,6 +25,25 @@ class NewGem
25
25
 
26
26
  copy_files
27
27
  copy_options
28
+
29
+ # Create a sample project inside of the specs folder
30
+ Dir.chdir(@target + '/spec') do
31
+ @thor.say 'Generating dummy project for integration specs', :green
32
+ cli = Volt::CLI.new
33
+ cli.shell.mute do
34
+ cli.new_project('dummy', true)
35
+ end
36
+
37
+ # Remove gemfile
38
+ FileUtils.rm('dummy/Gemfile')
39
+
40
+ # Remove spec directory inside of dummy app
41
+ FileUtils.rm_rf('dummy/spec')
42
+ end
43
+
44
+ puts "Initializing git repo in #{@target}"
45
+ Dir.chdir(@target) { `git init`; `git add .` }
46
+
28
47
  end
29
48
 
30
49
  # Check with the rubygems api to see if this gem name is available.
@@ -78,9 +97,8 @@ at choosealicense.com/licenses/mit.\n\ny/(n):")
78
97
  copy('newgem/bin/newgem.tt', "bin/#{@name}") if @options[:bin]
79
98
  copy('newgem/rspec.tt', '.rspec')
80
99
  copy('newgem/spec/spec_helper.rb.tt', 'spec/spec_helper.rb')
81
- copy('newgem/spec/newgem_spec.rb.tt', "spec/#{@namespaced_path}_spec.rb")
82
- puts "Initializing git repo in #{@target}"
83
- Dir.chdir(@target) { `git init`; `git add .` }
100
+ copy('newgem/spec/newgem_spec.rb.tt', "spec/sample_spec.rb")
101
+ copy('newgem/spec/integration/sample_integration_spec.rb', "spec/integration/sample_integration_spec.rb")
84
102
 
85
103
  if @options[:edit]
86
104
  run("#{@options['edit']} \"#{gemspec_dest}\"") # Open gemspec in editor
@@ -115,7 +133,7 @@ at choosealicense.com/licenses/mit.\n\ny/(n):")
115
133
 
116
134
  def volt_version_base
117
135
  require 'volt/version'
118
- Volt::Version::STRING.split('.').tap { |v| v[v.size - 1] = 0 }.join('.')
136
+ Volt::Version::STRING
119
137
  end
120
138
 
121
139
  def get_constant_name
@@ -365,6 +365,9 @@ module Volt
365
365
  # Revert wholesale
366
366
  @attributes = old_attrs
367
367
  Promise.new.resolve(errs)
368
+ else
369
+ # Persist
370
+ persist_changes(nil)
368
371
  end
369
372
  end
370
373
  end
@@ -19,9 +19,9 @@ module Volt
19
19
  end
20
20
 
21
21
  if !value || value.size < min
22
- errors[field_name] = [message || "must be at least #{args} characters"]
22
+ errors[field_name] = [message || "must be at least #{min} characters"]
23
23
  elsif max && value.size > max
24
- errors[field_name] = [message || "must be less than #{args} characters"]
24
+ errors[field_name] = [message || "must be less than #{max} characters"]
25
25
  end
26
26
 
27
27
  errors
@@ -13,19 +13,19 @@ module Volt
13
13
  end
14
14
 
15
15
  def key_code
16
- `this.js_event.keyCode`
16
+ `self.js_event.keyCode`
17
17
  end
18
18
 
19
19
  def stop!
20
- `this.js_event.stopPropagation();`
20
+ `self.js_event.stopPropagation();`
21
21
  end
22
22
 
23
23
  def prevent_default!
24
- `this.js_event.preventDefault();`
24
+ `self.js_event.preventDefault();`
25
25
  end
26
26
 
27
27
  def target
28
- `this.js_event.toElement`
28
+ `self.js_event.toElement || self.js_event.target`
29
29
  end
30
30
  end
31
31
 
@@ -43,11 +43,11 @@ module Volt
43
43
  # can set them up.
44
44
  def self.postboot_setup(volt_app, rack_app)
45
45
  # Serve the opal files
46
- opal_files = OpalFiles.new(rack_app, volt_app.app_path, volt_app.component_paths)
46
+ opal_files = OpalFiles.new(rack_app, volt_app.app_url, volt_app.app_path, volt_app.component_paths)
47
47
  volt_app.opal_files = opal_files
48
48
  volt_app.sprockets = opal_files.environment
49
49
 
50
- Volt::SprocketsHelpersSetup.new(volt_app.sprockets)
50
+ Volt::SprocketsHelpersSetup.new(volt_app)
51
51
 
52
52
  # Serve the main html files from public, also figure out
53
53
  # which JS/CSS files to serve.
@@ -4,17 +4,18 @@ require 'uri'
4
4
  # from the dependencies.rb files.
5
5
  module Volt
6
6
  class AssetFiles
7
- def self.from_cache(component_name, component_paths)
7
+ def self.from_cache(app_url, component_name, component_paths)
8
8
  # @cache ||= {}
9
9
 
10
10
  # @cache[component_name] ||= begin
11
11
  # not cached, create
12
12
 
13
- self.new(component_name, component_paths)
13
+ self.new(app_url, component_name, component_paths)
14
14
  # end
15
15
  end
16
16
 
17
- def initialize(component_name, component_paths)
17
+ def initialize(app_url, component_name, component_paths)
18
+ @app_url = app_url
18
19
  @component_paths = component_paths
19
20
  @assets = []
20
21
  @included_components = {}
@@ -93,7 +94,7 @@ module Volt
93
94
 
94
95
  def prepare_locator(locator, valid_extensions)
95
96
  unless url_or_path?(locator)
96
- locator = File.join('/assets', @current_component, '/assets', valid_extensions.first, "#{locator}")
97
+ locator = File.join(@app_url, @current_component, '/assets', valid_extensions.first, "#{locator}")
97
98
  locator += '.css' unless locator =~ /^.*\.(#{valid_extensions.join('|')})$/
98
99
  end
99
100
  locator
@@ -129,7 +130,10 @@ module Volt
129
130
  case type
130
131
  when :folder
131
132
  # for a folder, we search for all .js files and return a tag for them
132
- javascript_files += Dir["#{path}/**/*.js"].sort.map { |folder| '/assets' + folder[path.size..-1] }
133
+ javascript_files += Dir["#{path}/**/*.js"].sort.map do |folder|
134
+ # Grab the component folder/assets/js/file.js
135
+ @app_url + '/' + folder.split('/')[-4..-1].join('/')
136
+ end
133
137
  when :javascript_file
134
138
  # javascript_file is a cdn path to a JS file
135
139
  javascript_files << path
@@ -146,7 +150,7 @@ module Volt
146
150
  if ENV['MAPS'] == 'all'
147
151
  scripts << @opal_tag_generator.javascript_include_tag(volt_path)
148
152
  else
149
- scripts << "<script src=\"/assets/#{volt_path}.js\"></script>"
153
+ scripts << "<script src=\"#{volt_app.app_url}/#{volt_path}.js\"></script>"
150
154
  scripts << "<script>#{Opal::Processor.load_asset_code(volt_app.sprockets, volt_path)}</script>"
151
155
  end
152
156
 
@@ -172,7 +176,8 @@ module Volt
172
176
  # aren't imported by default:
173
177
  # http://sass-lang.com/guide
174
178
  css_files += Dir["#{path}/**/[^_]*.{css,scss}"].sort.map do |folder|
175
- css_path = '/assets' + folder[path.size..-1].gsub(/[.]scss$/, '')
179
+ last4 = folder.split('/')[-4..-1].join('/').gsub(/[.]scss$/, '')
180
+ css_path = @app_url + '/' + last4
176
181
  css_path += '.css' unless css_path =~ /[.]css$/
177
182
  css_path
178
183
  end
@@ -6,7 +6,8 @@ require 'volt/server/rack/asset_files'
6
6
  # method that returns all of the ruby setup code for the component.
7
7
  module Volt
8
8
  class ComponentCode
9
- def initialize(component_name, component_paths, client = true)
9
+ def initialize(volt_app, component_name, component_paths, client = true)
10
+ @volt_app = volt_app
10
11
  @component_name = component_name
11
12
  @component_paths = component_paths
12
13
  @client = client
@@ -17,7 +18,7 @@ module Volt
17
18
  # Start with config code
18
19
  code = @client ? generate_config_code : ''
19
20
 
20
- asset_files = AssetFiles.from_cache(@component_name, @component_paths)
21
+ asset_files = AssetFiles.from_cache(@volt_app.app_url, @component_name, @component_paths)
21
22
  asset_files.component_paths.each do |component_path, component_name|
22
23
  code << ComponentTemplates.new(component_path, component_name, @client).code
23
24
  code << "\n\n"
@@ -84,7 +84,7 @@ module Volt
84
84
  # Load in all views and routes
85
85
  # TODO: Nested components listed twice are are loaded multiple times
86
86
  component_names.uniq.each do |component_name|
87
- code = Volt::ComponentCode.new(component_name, self, false).code
87
+ code = Volt::ComponentCode.new(volt_app, component_name, self, false).code
88
88
  # Evaluate returned code, the ```volt_app``` variable is set for access.
89
89
  eval(code)
90
90
  end
@@ -4,8 +4,8 @@ require 'volt/router/routes'
4
4
  # Serves the main pages
5
5
  module Volt
6
6
  class IndexFiles
7
- def initialize(app, volt_app, component_paths, opal_files)
8
- @app = app
7
+ def initialize(rack_app, volt_app, component_paths, opal_files)
8
+ @rack_app = rack_app
9
9
  @volt_app = volt_app
10
10
  @component_paths = component_paths
11
11
  @opal_files = opal_files
@@ -37,7 +37,7 @@ module Volt
37
37
  if route_match?(env['PATH_INFO'])
38
38
  [200, { 'Content-Type' => 'text/html; charset=utf-8' }, [html]]
39
39
  else
40
- @app.call env
40
+ @rack_app.call env
41
41
  end
42
42
  end
43
43
 
@@ -58,11 +58,11 @@ module Volt
58
58
 
59
59
  def javascript_tags
60
60
  # TODO: Cache somehow, this is being loaded every time
61
- AssetFiles.from_cache('main', @component_paths).javascript_tags(@volt_app)
61
+ AssetFiles.from_cache(@volt_app.app_url, 'main', @component_paths).javascript_tags(@volt_app)
62
62
  end
63
63
 
64
64
  def css_tags
65
- AssetFiles.from_cache('main', @component_paths).css_tags
65
+ AssetFiles.from_cache(@volt_app.app_url, 'main', @component_paths).css_tags
66
66
  end
67
67
  end
68
68
  end
@@ -12,7 +12,7 @@ module Volt
12
12
  class OpalFiles
13
13
  attr_reader :environment, :server
14
14
 
15
- def initialize(builder, app_path, component_paths)
15
+ def initialize(builder, app_url, app_path, component_paths)
16
16
  Opal::Processor.source_map_enabled = Volt.source_maps?
17
17
  Opal::Processor.const_missing_enabled = true
18
18
 
@@ -34,7 +34,7 @@ module Volt
34
34
  # Opal::Processor.arity_check_enabled = !Volt.env.production?
35
35
  # Opal::Processor.dynamic_require_severity = :raise
36
36
 
37
- @server = Opal::Server.new(prefix: '/assets', debug: Volt.source_maps?)
37
+ @server = Opal::Server.new(prefix: app_url, debug: Volt.source_maps?)
38
38
  @server.use_index = false
39
39
 
40
40
  @component_paths = component_paths
@@ -78,7 +78,7 @@ module Volt
78
78
  # environment in closure
79
79
  environment = @environment
80
80
 
81
- builder.map '/assets' do
81
+ builder.map(app_url) do
82
82
  run environment
83
83
  end
84
84
 
@@ -121,9 +121,10 @@ module Volt
121
121
  end
122
122
 
123
123
  def add_asset_folders(environment)
124
- @component_paths.asset_folders do |asset_folder|
125
- environment.append_path(asset_folder)
126
- end
124
+ # @component_paths.asset_folders do |asset_folder|
125
+ # puts "ADD ASSET FOLDER: #{asset_folder.inspect}"
126
+ # environment.append_path(asset_folder)
127
+ # end
127
128
  end
128
129
  end
129
130
  end
@@ -2,8 +2,9 @@ require 'sprockets-helpers'
2
2
 
3
3
  module Volt
4
4
  class SprocketsHelpersSetup
5
- def initialize(env)
6
- @env = env
5
+ def initialize(volt_app)
6
+ @volt_app = volt_app
7
+ @env = volt_app.sprockets
7
8
 
8
9
  setup_path_helpers
9
10
  add_linking_in_asset_path
@@ -15,7 +16,7 @@ module Volt
15
16
  # Configure Sprockets::Helpers (if necessary)
16
17
  Sprockets::Helpers.configure do |config|
17
18
  config.environment = @env
18
- config.prefix = '/assets'
19
+ config.prefix = @volt_app.app_url
19
20
  config.public_path = 'public'
20
21
  config.debug = false#!Volt.env.production?
21
22
 
@@ -36,9 +37,27 @@ module Volt
36
37
  # We "freedom-patch" sprockets-helpers asset_path method to
37
38
  # automatically link assets.
38
39
  def asset_path(source, options = {})
40
+ relative_path = source =~ /^[.][.]\//
41
+ if relative_path
42
+ component_root = logical_path.gsub(/\/[^\/]+$/, '')
43
+ path = File.join(component_root, source)
44
+ source = Volt::SprocketsHelpersSetup.expand(path)
45
+ end
46
+
47
+ if relative_path
48
+ link_path = source
49
+ else
50
+ link_path = source.gsub(/^#{@volt_app.app_path}\//, '')
51
+ end
52
+
53
+ # Return for absolute urls (one's off site)
39
54
  uri = URI.parse(source)
40
55
  return source if uri.absolute?
41
56
 
57
+ # Link all assets out of the box
58
+ # Added by volt
59
+ link_asset(link_path)
60
+
42
61
  options[:prefix] = Sprockets::Helpers.prefix unless options[:prefix]
43
62
 
44
63
  if Sprockets::Helpers.debug || options[:debug]
@@ -53,11 +72,8 @@ module Volt
53
72
  uri.path << ".#{options[:ext]}"
54
73
  end
55
74
 
56
- # Link all assets out of the box
57
- # Added by volt
58
- link_asset(uri)
59
-
60
75
  path = find_asset_path(uri, source, options)
76
+
61
77
  if options[:expand] && path.respond_to?(:to_a)
62
78
  path.to_a
63
79
  else
@@ -67,5 +83,23 @@ module Volt
67
83
  end
68
84
 
69
85
  end
86
+
87
+ private
88
+
89
+ def self.expand(path)
90
+ parts = path.split('/')
91
+
92
+ output = []
93
+
94
+ parts.each do |part|
95
+ if part == '..'
96
+ output.pop
97
+ else
98
+ output << part
99
+ end
100
+ end
101
+
102
+ output.join('/')
103
+ end
70
104
  end
71
105
  end
@@ -49,7 +49,7 @@ module Sprockets
49
49
 
50
50
  # Working with a component path
51
51
  volt_app = Thread.current['volt_app'] || $volt_app
52
- data = Volt::ComponentCode.new(component_name, volt_app.component_paths, true).code
52
+ data = Volt::ComponentCode.new(volt_app, component_name, volt_app.component_paths, true).code
53
53
  else
54
54
  data = env.read_file(input[:filename], input[:content_type])
55
55
  end
@@ -0,0 +1,19 @@
1
+ module Volt
2
+ module RecursiveExists
3
+ def self.exists_here_or_up?(file)
4
+ # Check for a gemfile here or up a directory
5
+ pwd = Dir.pwd
6
+
7
+ loop do
8
+ if File.exists?("#{pwd}/#{file}")
9
+ return true
10
+ else
11
+ pwd = pwd.gsub(/\/[^\/]+$/, '')
12
+ return false if pwd == ''
13
+ end
14
+ end
15
+
16
+ false
17
+ end
18
+ end
19
+ end
data/lib/volt/version.rb CHANGED
@@ -1,5 +1,5 @@
1
1
  module Volt
2
2
  module Version
3
- STRING = '0.9.5.pre7'
3
+ STRING = '0.9.5.pre8'
4
4
  end
5
5
  end
data/lib/volt/volt/app.rb CHANGED
@@ -91,7 +91,9 @@ module Volt
91
91
  # Load up the main component dependencies. This is needed to load in
92
92
  # any opal_gem calls in dependencies.rb
93
93
  # TODO: Needs to support all components
94
- AssetFiles.from_cache('main', component_paths)
94
+ if Dir.exists?(Volt.root + '/app/main')
95
+ AssetFiles.from_cache(app_url, 'main', component_paths)
96
+ end
95
97
 
96
98
  reset_query_pool!
97
99
 
@@ -10,6 +10,11 @@ end
10
10
  module Volt
11
11
  module ServerSetup
12
12
  module App
13
+ # The root url is where the volt app is mounted
14
+ attr_reader :root_url
15
+ # The app url is where the app folder (and sprockets) is mounted
16
+ attr_reader :app_url
17
+
13
18
  def setup_paths
14
19
  # Load component paths
15
20
  @component_paths = ComponentPaths.new(@app_path)
@@ -19,6 +24,9 @@ module Volt
19
24
  def load_app_code
20
25
  setup_router
21
26
  require_http_controllers
27
+
28
+ @root_url = '/'
29
+ @app_url = '/app'
22
30
  end
23
31
 
24
32
  def setup_router
@@ -1,3 +1,3 @@
1
1
  disable_auto_import
2
- javascript_file '/assets/disable_auto/assets/js/test1.js'
2
+ javascript_file '/app/disable_auto/assets/js/test1.js'
3
3
  css_file 'test1'
@@ -7,7 +7,7 @@ gem 'volt-mongo'
7
7
 
8
8
  # The following gem's are optional for themeing
9
9
  # Twitter bootstrap
10
- gem 'volt-bootstrap', '~> 0.0.10'
10
+ gem 'volt-bootstrap', '~> 0.1.0'
11
11
 
12
12
  # Simple theme for bootstrap, remove to theme yourself.
13
13
  gem 'volt-bootstrap_jumbotron_theme', '~> 0.1.0'
@@ -2,8 +2,4 @@
2
2
  Store
3
3
 
4
4
  <:Body>
5
- <h1>Store</h1>
6
-
7
- <p>Sync between nested root properties.</p>
8
- <input id="field1" value="{{ store._name }}" /><br />
9
- <!-- <input id="field2" value="{{ store._name }}" /> -->
5
+ <h1>Store Test</h1>
@@ -1,11 +1,12 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe 'todos app', type: :feature, sauce: true do
4
+ ENTER_KEY = ENV["BROWSER"] == 'phantom' ? :Enter : :return
4
5
  it 'should add a todo and remove it' do
5
6
  visit '/todos'
6
7
 
7
8
  fill_in 'newtodo', :with => 'Todo 1'
8
- find('#newtodo').native.send_keys(:return)
9
+ find('#newtodo').native.send_keys(ENTER_KEY)
9
10
 
10
11
  expect(page).to have_content('Todo 1')
11
12
 
@@ -16,7 +17,30 @@ describe 'todos app', type: :feature, sauce: true do
16
17
  expect(page).to_not have_content('Todo 1')
17
18
 
18
19
  # Make sure it deleted
19
- page.driver.browser.navigate.refresh
20
+ if ENV['BROWSER'] == 'phantom'
21
+ visit '/todos'
22
+ else
23
+ page.driver.browser.navigate.refresh
24
+ end
20
25
  expect(page).to_not have_content('Todo 1')
21
26
  end
27
+
28
+ it 'should update a todo check state and persist' do
29
+ visit '/todos'
30
+
31
+ fill_in 'newtodo', :with => 'Todo 1'
32
+ find('#newtodo').native.send_keys(ENTER_KEY)
33
+
34
+ expect(page).to have_content('Todo 1')
35
+
36
+ find("input[type='checkbox']").click
37
+
38
+ if ENV['BROWSER'] == 'phantom'
39
+ visit '/todos'
40
+ else
41
+ page.evaluate_script('document.location.reload()')
42
+ end
43
+
44
+ expect(find("input[type='checkbox']").checked?).to eq(true)
45
+ end
22
46
  end
@@ -38,22 +38,14 @@ describe Volt::LengthValidator do
38
38
  describe 'when name is "John"' do
39
39
  let(:name) { 'John' }
40
40
  it do
41
- if RUBY_PLATFORM == 'opal'
42
- expect(subject).to eq(name: ["must be at least {\"length\"=>5, \"maximum\"=>10} characters"])
43
- else
44
- expect(subject).to eq(name: ['must be at least {:length=>5, :maximum=>10} characters'])
45
- end
41
+ expect(subject).to eq(name: ["must be at least 5 characters"])
46
42
  end
47
43
  end
48
44
 
49
45
  describe 'when name is "Zach Galifianakis"' do
50
46
  let(:name) { 'Zach Galifianakis' }
51
47
  it do
52
- if RUBY_PLATFORM == 'opal'
53
- expect(subject).to eq(name: ["must be less than {\"length\"=>5, \"maximum\"=>10} characters"])
54
- else
55
- expect(subject).to eq(name: ['must be less than {:length=>5, :maximum=>10} characters'])
56
- end
48
+ expect(subject).to eq(name: ['must be less than 10 characters'])
57
49
  end
58
50
  end
59
51
  end
@@ -11,7 +11,7 @@ if RUBY_PLATFORM != 'opal'
11
11
  end
12
12
 
13
13
  it 'should return the dependencies list' do
14
- main = Volt::AssetFiles.new('main', @component_paths)
14
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
15
15
 
16
16
  components = main.components
17
17
  expect(components).to eq(%w(volt mongo main shared bootstrap slideshow))
@@ -20,31 +20,31 @@ if RUBY_PLATFORM != 'opal'
20
20
  describe 'js files' do
21
21
  context "when the component's dependencies.rb does not contain .disable_auto_import" do
22
22
  it 'should list all JS files' do
23
- main = Volt::AssetFiles.new('main', @component_paths)
23
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
24
24
  expect(main.javascript(volt_app).reject{|v| v[0] != :src }).to eq([
25
- [:src, '/assets/js/jquery-2.0.3.js'],
26
- [:src, '/assets/js/volt_js_polyfills.js'],
27
- [:src, '/assets/js/volt_watch.js'],
28
- [:src, '/assets/js/bootstrap.js'],
29
- [:src, '/assets/js/test2.js'],
30
- [:src, '/assets/js/test3.js'],
31
- [:src, '/assets/js/test1.js'],
32
- [:src, '/assets/volt/volt/app.js'],
33
- [:src, '/assets/components/main.js']
25
+ [:src, "/app/volt/assets/js/jquery-2.0.3.js"],
26
+ [:src, "/app/volt/assets/js/volt_js_polyfills.js"],
27
+ [:src, "/app/volt/assets/js/volt_watch.js"],
28
+ [:src, "/app/bootstrap/assets/js/bootstrap.js"],
29
+ [:src, "/app/shared/assets/js/test2.js"],
30
+ [:src, "/app/slideshow/assets/js/test3.js"],
31
+ [:src, "/app/main/assets/js/test1.js"],
32
+ [:src, "/app/volt/volt/app.js"],
33
+ [:src, "/app/components/main.js"]
34
34
  ])
35
35
  end
36
36
  end
37
37
 
38
38
  context "when the component's dependencies.rb contains .disable_auto_import" do
39
39
  it 'should list only the files included via the css_file helpers' do
40
- disabled_auto = Volt::AssetFiles.new('disable_auto', @component_paths)
40
+ disabled_auto = Volt::AssetFiles.new('/app', 'disable_auto', @component_paths)
41
41
  expect(disabled_auto.javascript(volt_app).reject{|v| v[0] != :src }).to eq([
42
- [:src, '/assets/js/jquery-2.0.3.js'],
43
- [:src, '/assets/js/volt_js_polyfills.js'],
44
- [:src, '/assets/js/volt_watch.js'],
45
- [:src, '/assets/disable_auto/assets/js/test1.js'],
46
- [:src, '/assets/volt/volt/app.js'],
47
- [:src, '/assets/components/main.js']
42
+ [:src, "/app/volt/assets/js/jquery-2.0.3.js"],
43
+ [:src, "/app/volt/assets/js/volt_js_polyfills.js"],
44
+ [:src, "/app/volt/assets/js/volt_watch.js"],
45
+ [:src, "/app/disable_auto/assets/js/test1.js"],
46
+ [:src, "/app/volt/volt/app.js"],
47
+ [:src, "/app/components/main.js"]
48
48
  ])
49
49
  end
50
50
  end
@@ -54,23 +54,23 @@ if RUBY_PLATFORM != 'opal'
54
54
 
55
55
  context "when the component's dependencies.rb does not contain .disable_auto_import" do
56
56
  it 'should list all the asset files in that component' do
57
- main = Volt::AssetFiles.new('main', @component_paths)
57
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
58
58
 
59
59
  expect(main.css).to eq([
60
- '/assets/css/notices.css',
61
- '/assets/css/01-bootstrap.css',
62
- '/assets/css/test3.css'
60
+ "/app/volt/assets/css/notices.css",
61
+ "/app/bootstrap/assets/css/01-bootstrap.css",
62
+ "/app/main/assets/css/test3.css"
63
63
  ])
64
64
  end
65
65
  end
66
66
 
67
67
  context "when the component's dependencies.rb contains .disable_auto_import" do
68
68
  it 'should list only the files included via the css_file helpers' do
69
- disabled_auto = Volt::AssetFiles.new('disable_auto', @component_paths)
69
+ disabled_auto = Volt::AssetFiles.new('/app', 'disable_auto', @component_paths)
70
70
 
71
71
  expect(disabled_auto.css).to eq([
72
- '/assets/css/notices.css',
73
- '/assets/disable_auto/assets/css/test1.css'
72
+ "/app/volt/assets/css/notices.css",
73
+ "/app/disable_auto/assets/css/test1.css"
74
74
  ])
75
75
  end
76
76
  end
@@ -78,33 +78,33 @@ if RUBY_PLATFORM != 'opal'
78
78
 
79
79
  describe '.is_url?' do
80
80
  it 'should return true for URIs like //something.com/something.js' do
81
- main = Volt::AssetFiles.new('main', @component_paths)
81
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
82
82
  expect(main.url_or_path? '//something.com/a-folder/something.js').to eq(true)
83
83
  end
84
84
 
85
85
  it 'should return true for HTTP and HTTPS urls' do
86
- main = Volt::AssetFiles.new('main', @component_paths)
86
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
87
87
  expect(main.url_or_path? 'http://something.com/a-folder/something.js').to eq(true)
88
88
  expect(main.url_or_path? 'https://something.com/a-folder/something.js').to eq(true)
89
89
  end
90
90
 
91
91
  it 'should return true for paths' do
92
- main = Volt::AssetFiles.new('main', @component_paths)
92
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
93
93
  expect(main.url_or_path? 'something.js').to eq(false)
94
- expect(main.url_or_path? '/assets/something.js').to eq(true)
95
- expect(main.url_or_path? '/assets/something/something.js').to eq(true)
94
+ expect(main.url_or_path? '/app/something.js').to eq(true)
95
+ expect(main.url_or_path? '/app/something/something.js').to eq(true)
96
96
  end
97
97
 
98
98
  it 'should return false for file names' do
99
- main = Volt::AssetFiles.new('main', @component_paths)
99
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
100
100
  expect(main.url_or_path? 'something.js').to eq(false)
101
- expect(main.url_or_path? 'assets/something/something.js').to eq(false)
101
+ expect(main.url_or_path? 'app/something/something.js').to eq(false)
102
102
  end
103
103
 
104
104
  end
105
105
 
106
106
  it 'should raise an exception for a missing component gem' do
107
- main = Volt::AssetFiles.new('main', @component_paths)
107
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
108
108
 
109
109
  relative_dep_path = '../../apps/file_loading/app/missing_deps'
110
110
  path_to_missing_deps = File.join(File.dirname(__FILE__), relative_dep_path)
@@ -115,7 +115,7 @@ if RUBY_PLATFORM != 'opal'
115
115
  end
116
116
 
117
117
  it 'should not raise an exception for a dependency file with valid components' do
118
- main = Volt::AssetFiles.new('main', @component_paths)
118
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
119
119
 
120
120
  path_to_main = File.join(File.dirname(__FILE__), '../../apps/file_loading/app/main')
121
121
  path_to_missing_deps = File.join(File.dirname(__FILE__), path_to_main)
@@ -125,7 +125,7 @@ if RUBY_PLATFORM != 'opal'
125
125
  end
126
126
 
127
127
  it 'should parse javascript src/body from the javascript tags' do
128
- main = Volt::AssetFiles.new('main', @component_paths)
128
+ main = Volt::AssetFiles.new('/app', 'main', @component_paths)
129
129
 
130
130
  expect(main).to receive(:javascript_tags).and_return("<script src='/someurl.js'></script><script>var inlinejs = true;</script>")
131
131
 
@@ -1,8 +1,9 @@
1
+ require 'spec_helper'
1
2
 
2
3
  if ENV['BROWSER'] && ENV['BROWSER'] == 'phantom'
3
4
  describe 'Rack Requests', type: :feature do
4
5
  it 'should send JS file with JS mimetype' do
5
- visit '/components/main.js'
6
+ visit '/app/components/main.js'
6
7
 
7
8
  expect(page.response_headers['Content-Type']).to include 'application/javascript'
8
9
  end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe "sprockets helpers" do
4
+ it 'should expand paths' do
5
+ result = Volt::SprocketsHelpersSetup.expand('/something/cool/../awesome/beans/../../five/six/seven')
6
+
7
+ expect(result).to eq('/something/five/six/seven')
8
+ end
9
+
10
+ it 'should expand paths2' do
11
+ result = Volt::SprocketsHelpersSetup.expand('bootstrap/assets/css/../fonts/glyphicons-halflings-regular.svg')
12
+
13
+ expect(result).to eq('bootstrap/assets/fonts/glyphicons-halflings-regular.svg')
14
+ end
15
+ end
@@ -2,3 +2,14 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in <%=config[:name]%>.gemspec
4
4
  gemspec
5
+
6
+ # Optional Gems for testing/dev
7
+
8
+ # The implementation of ReadWriteLock in Volt uses concurrent ruby and ext helps performance.
9
+ gem 'concurrent-ruby-ext', '~> 0.8.0'
10
+
11
+ # For mongo (optional)
12
+ gem 'bson_ext', '~> 1.9.0'
13
+
14
+ # Gems you use for development should be added to the gemspec file as
15
+ # development dependencies.
@@ -19,8 +19,23 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ["lib"]
20
20
 
21
21
  spec.add_development_dependency "volt", "~> <%= config[:volt_version_base] %>"
22
- spec.add_development_dependency 'rspec', '~> 3.2.0'
23
22
  spec.add_development_dependency "rake"
23
+
24
+ # Testing gems
25
+ spec.add_development_dependency 'rspec', '~> 3.2.0'
26
+ spec.add_development_dependency 'opal-rspec', '~> 0.4.2'
27
+ spec.add_development_dependency 'capybara', '~> 2.4.2'
28
+ spec.add_development_dependency 'selenium-webdriver', '~> 2.43.0'
29
+ spec.add_development_dependency 'chromedriver2-helper', '~> 0.0.8'
30
+ spec.add_development_dependency 'poltergeist', '~> 1.5.0'
31
+
32
+ # Gems to run the dummy app
33
+ spec.add_development_dependency 'volt-mongo', '0.1.1'
34
+ spec.add_development_dependency 'volt-bootstrap', '~> 0.1.0'
35
+ spec.add_development_dependency 'volt-bootstrap_jumbotron_theme', '~> 0.1.0'
36
+ spec.add_development_dependency 'volt-user_templates', '~> 0.4.0'
37
+ spec.add_development_dependency 'thin', '~> 1.6.0'
38
+
24
39
  <% if config[:test] -%>
25
40
  spec.add_development_dependency "<%=config[:test]%>"
26
41
  <% end -%>
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
3
+ describe 'sample integration test', type: :feature do
4
+ # An example integration spec, this will only be run if ENV['BROWSER'] is
5
+ # specified. Current values for ENV['BROWSER'] are 'firefox' and 'phantom'
6
+ it 'should load the page' do
7
+ visit '/'
8
+
9
+ expect(page).to have_content('Home')
10
+ end
11
+ end
@@ -1,10 +1,6 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe <%= config[:constant_name] %> do
4
- it 'should have a version number' do
5
- expect(<%= config[:constant_name] %>::VERSION).not_to be nil
6
- end
7
-
8
4
  it 'should do something useful' do
9
5
  expect(false).to be true
10
6
  end
@@ -1,6 +1,10 @@
1
1
  # Volt sets up rspec and capybara for testing.
2
2
  require 'volt/spec/setup'
3
- Volt.spec_setup
3
+
4
+ # When testing Volt component gems, we boot up a dummy app first to run the
5
+ # test in, so we have access to Volt itself.
6
+ dummy_app_path = File.join(File.dirname(__FILE__), 'dummy')
7
+ Volt.spec_setup(dummy_app_path)
4
8
 
5
9
  RSpec.configure do |config|
6
10
  config.run_all_when_everything_filtered = true
@@ -7,7 +7,7 @@ gem 'volt-mongo', '~> 0.1.0'
7
7
 
8
8
  # The following gem's are optional for themeing
9
9
  # Twitter bootstrap
10
- gem 'volt-bootstrap', '~> 0.0.10'
10
+ gem 'volt-bootstrap', '~> 0.1.0'
11
11
 
12
12
  # Simple theme for bootstrap, remove to theme yourself.
13
13
  gem 'volt-bootstrap_jumbotron_theme', '~> 0.1.0'
@@ -27,10 +27,6 @@ platform :ruby, :jruby do
27
27
  gem 'rbnacl-libsodium', require: false
28
28
  end
29
29
 
30
- # Asset compilation gems, they will be required when needed.
31
- gem 'csso-rails', '~> 0.3.4', require: false
32
- gem 'uglifier', '>= 2.4.0', require: false
33
-
34
30
  group :test do
35
31
  # Testing dependencies
36
32
  gem 'rspec', '~> 3.2.0'
@@ -52,6 +48,10 @@ platform :mri, :mingw do
52
48
  end
53
49
 
54
50
  group :production do
51
+ # Asset compilation gems, they will be required when needed.
52
+ gem 'csso-rails', '~> 0.3.4', require: false
53
+ gem 'uglifier', '>= 2.4.0', require: false
54
+
55
55
  # Image compression gem for precompiling assets
56
56
  gem 'image_optim'
57
57
 
data/volt.gemspec CHANGED
@@ -45,7 +45,7 @@ Gem::Specification.new do |spec|
45
45
 
46
46
  # There is a big performance issue with selenium-webdriver on v2.45.0
47
47
  spec.add_development_dependency 'selenium-webdriver', '~> 2.46.2'
48
- spec.add_development_dependency 'chromedriver2-helper', '~> 0.0.8'
48
+ spec.add_development_dependency 'chromedriver-helper', '~> 1.0.0'
49
49
  spec.add_development_dependency 'poltergeist', '~> 1.5.0'
50
50
  spec.add_development_dependency 'thin', '~> 1.6.3'
51
51
  spec.add_development_dependency 'coveralls', '~> 0.8.1'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: volt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.5.pre7
4
+ version: 0.9.5.pre8
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ryan Stout
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-21 00:00:00.000000000 Z
11
+ date: 2015-08-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -235,19 +235,19 @@ dependencies:
235
235
  - !ruby/object:Gem::Version
236
236
  version: 2.46.2
237
237
  - !ruby/object:Gem::Dependency
238
- name: chromedriver2-helper
238
+ name: chromedriver-helper
239
239
  requirement: !ruby/object:Gem::Requirement
240
240
  requirements:
241
241
  - - "~>"
242
242
  - !ruby/object:Gem::Version
243
- version: 0.0.8
243
+ version: 1.0.0
244
244
  type: :development
245
245
  prerelease: false
246
246
  version_requirements: !ruby/object:Gem::Requirement
247
247
  requirements:
248
248
  - - "~>"
249
249
  - !ruby/object:Gem::Version
250
- version: 0.0.8
250
+ version: 1.0.0
251
251
  - !ruby/object:Gem::Dependency
252
252
  name: poltergeist
253
253
  requirement: !ruby/object:Gem::Requirement
@@ -591,6 +591,7 @@ files:
591
591
  - lib/volt/utils/parsing.rb
592
592
  - lib/volt/utils/promise_extensions.rb
593
593
  - lib/volt/utils/read_write_lock.rb
594
+ - lib/volt/utils/recursive_exists.rb
594
595
  - lib/volt/utils/set_patch.rb
595
596
  - lib/volt/utils/tilt_patch.rb
596
597
  - lib/volt/utils/time_patch.rb
@@ -739,6 +740,7 @@ files:
739
740
  - spec/server/rack/http_response_renderer_spec.rb
740
741
  - spec/server/rack/quite_common_logger_spec.rb
741
742
  - spec/server/rack/rack_requests_spec.rb
743
+ - spec/server/rack/sprockets_helpers_setup.rb
742
744
  - spec/spec_helper.rb
743
745
  - spec/store/mongo_spec.rb
744
746
  - spec/tasks/dispatcher_spec.rb
@@ -796,6 +798,7 @@ files:
796
798
  - templates/newgem/app/newgem/controllers/server/.empty_directory
797
799
  - templates/newgem/app/newgem/lib/.empty_directory
798
800
  - templates/newgem/app/newgem/models/.empty_directory
801
+ - templates/newgem/app/newgem/tasks/.empty_directory
799
802
  - templates/newgem/app/newgem/views/main/index.html
800
803
  - templates/newgem/bin/newgem.tt
801
804
  - templates/newgem/gitignore.tt
@@ -804,6 +807,7 @@ files:
804
807
  - templates/newgem/lib/newgem/version.rb.tt
805
808
  - templates/newgem/newgem.gemspec.tt
806
809
  - templates/newgem/rspec.tt
810
+ - templates/newgem/spec/integration/sample_integration_spec.rb
807
811
  - templates/newgem/spec/newgem_spec.rb.tt
808
812
  - templates/newgem/spec/spec_helper.rb.tt
809
813
  - templates/newgem/test/minitest_helper.rb.tt
@@ -1001,6 +1005,7 @@ test_files:
1001
1005
  - spec/server/rack/http_response_renderer_spec.rb
1002
1006
  - spec/server/rack/quite_common_logger_spec.rb
1003
1007
  - spec/server/rack/rack_requests_spec.rb
1008
+ - spec/server/rack/sprockets_helpers_setup.rb
1004
1009
  - spec/spec_helper.rb
1005
1010
  - spec/store/mongo_spec.rb
1006
1011
  - spec/tasks/dispatcher_spec.rb