volt 0.2.3 → 0.2.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/Readme.md +3 -0
  3. data/VERSION +1 -1
  4. data/docs/GUIDE.md +3 -3
  5. data/lib/volt.rb +0 -2
  6. data/lib/volt/cli.rb +14 -1
  7. data/lib/volt/cli/new_gem.rb +116 -0
  8. data/lib/volt/controllers/model_controller.rb +4 -0
  9. data/lib/volt/router/routes.rb +10 -7
  10. data/lib/volt/server.rb +36 -96
  11. data/lib/volt/server/channel_handler.rb +1 -1
  12. data/lib/volt/server/rack/component_files.rb +97 -0
  13. data/lib/volt/server/rack/component_paths.rb +70 -0
  14. data/lib/volt/server/rack/index_files.rb +38 -0
  15. data/lib/volt/server/rack/opal_files.rb +51 -0
  16. data/lib/volt/server/{source_map_server.rb → rack/source_map_server.rb} +0 -0
  17. data/lib/volt/templates/page.rb +3 -5
  18. data/{templates/app/.empty_directory → spec/app/main/assets/js/test1.js} +0 -0
  19. data/spec/app/main/config/dependencies.rb +1 -0
  20. data/{templates/app/home/css/.empty_directory → spec/app/shared/assets/js/test2.js} +0 -0
  21. data/spec/app/shared/config/dependencies.rb +1 -0
  22. data/spec/server/rack/component_files_spec.rb +23 -0
  23. data/spec/server/rack/component_paths_spec.rb +26 -0
  24. data/spec/store/mongo_spec.rb +5 -2
  25. data/templates/newgem/Gemfile.tt +4 -0
  26. data/templates/newgem/LICENSE.txt.tt +22 -0
  27. data/templates/newgem/README.md.tt +29 -0
  28. data/templates/newgem/Rakefile.tt +16 -0
  29. data/templates/newgem/VERSION +1 -0
  30. data/templates/{app/home/models → newgem/app/newgem/assets/css}/.empty_directory +0 -0
  31. data/templates/{public/css/ansi.css → newgem/app/newgem/assets/js/.empty_directory} +0 -0
  32. data/templates/newgem/bin/newgem.tt +3 -0
  33. data/templates/newgem/gitignore.tt +17 -0
  34. data/templates/newgem/lib/newgem.rb.tt +9 -0
  35. data/templates/{public/js/bootstrap.js → newgem/lib/newgem/.empty_directory} +0 -0
  36. data/templates/newgem/newgem.gemspec.tt +28 -0
  37. data/templates/newgem/rspec.tt +2 -0
  38. data/templates/newgem/spec/newgem_spec.rb.tt +11 -0
  39. data/templates/newgem/spec/spec_helper.rb.tt +2 -0
  40. data/templates/newgem/test/minitest_helper.rb.tt +4 -0
  41. data/templates/newgem/test/test_newgem.rb.tt +11 -0
  42. data/templates/{Gemfile.tt → project/Gemfile.tt} +4 -1
  43. data/templates/project/app/.empty_directory +0 -0
  44. data/templates/{app → project/app}/home/config/routes.rb +0 -0
  45. data/templates/{app → project/app}/home/controllers/index_controller.rb +0 -0
  46. data/templates/project/app/home/css/.empty_directory +0 -0
  47. data/templates/project/app/home/models/.empty_directory +0 -0
  48. data/templates/{app → project/app}/home/views/index/about.html +0 -0
  49. data/templates/{app → project/app}/home/views/index/home.html +0 -0
  50. data/templates/{app → project/app}/home/views/index/index.html +0 -0
  51. data/templates/{config.ru → project/config.ru} +1 -1
  52. data/templates/project/public/css/ansi.css +0 -0
  53. data/templates/{public → project/public}/css/bootstrap-theme.css +0 -0
  54. data/templates/{public → project/public}/css/bootstrap.css +0 -0
  55. data/templates/{public → project/public}/css/jumbotron.css +0 -0
  56. data/templates/{public → project/public}/fonts/glyphicons-halflings-regular.eot +0 -0
  57. data/templates/{public → project/public}/fonts/glyphicons-halflings-regular.svg +0 -0
  58. data/templates/{public → project/public}/fonts/glyphicons-halflings-regular.ttf +0 -0
  59. data/templates/{public → project/public}/fonts/glyphicons-halflings-regular.woff +0 -0
  60. data/templates/project/public/index.html +19 -0
  61. data/templates/project/public/js/bootstrap.js +0 -0
  62. data/templates/{public → project/public}/js/jquery-2.0.3.js +0 -0
  63. data/templates/{public → project/public}/js/sockjs-0.2.1.min.js +0 -0
  64. data/templates/{spec → project/spec}/spec_helper.rb +0 -0
  65. metadata +60 -27
  66. data/lib/volt/server/request_handler.rb +0 -16
  67. data/templates/public/index.html +0 -25
@@ -0,0 +1,70 @@
1
+ class ComponentPaths
2
+ def initialize(root=nil)
3
+ @root = root || Dir.pwd
4
+ end
5
+
6
+ # Yield for every folder where we might find components
7
+ def app_folders
8
+ # Find all app folders
9
+ @app_folders ||= begin
10
+ app_folders = ["#{@root}/app", "#{@root}/vendor/app"].map {|f| File.expand_path(f) }
11
+
12
+ # Gem folders with volt in them
13
+ # TODO: we should probably qualify this a bit more
14
+ app_folders += Gem.loaded_specs.values.map { |g| g.full_gem_path }.reject {|g| g !~ /volt/ }.map {|f| f + '/app' }
15
+
16
+ app_folders
17
+ end
18
+
19
+ # Yield each app folder and return a flattened array with
20
+ # the results
21
+
22
+ files = []
23
+ @app_folders.each do |app_folder|
24
+ files << yield(app_folder)
25
+ end
26
+
27
+ return files.flatten
28
+ end
29
+
30
+ def components
31
+ return @components if @components
32
+
33
+ @components = {}
34
+ app_folders do |app_folder|
35
+ Dir["#{app_folder}/*"].each do |folder|
36
+ if File.directory?(folder)
37
+ folder_name = folder[/[^\/]+$/]
38
+
39
+ @components[folder_name] ||= []
40
+ @components[folder_name] << folder
41
+ end
42
+ end
43
+ end
44
+
45
+ return @components
46
+ end
47
+
48
+ def component_path(name)
49
+ folders = components[name]
50
+
51
+ if folders
52
+ return folders.first
53
+ else
54
+ return nil
55
+ end
56
+ end
57
+
58
+ # Return every asset folder we need to serve from
59
+ def asset_folders
60
+ folders = []
61
+ app_folders do |app_folder|
62
+ Dir["#{app_folder}/*/assets"].each do |asset_folder|
63
+ folders << yield(asset_folder)
64
+ end
65
+ end
66
+
67
+ folders.flatten
68
+ end
69
+
70
+ end
@@ -0,0 +1,38 @@
1
+ require 'volt/server/rack/component_files'
2
+
3
+ # Serves the main pages
4
+ class IndexFiles
5
+ def initialize(app, component_paths)
6
+ @app = app
7
+ @component_paths = component_paths
8
+ end
9
+
10
+ def call(env)
11
+ if %w[/ /demo /blog /todos /page3 /page4].include?(env['PATH_INFO']) || env['PATH_INFO'][0..5] == '/todos'
12
+ [200, { 'Content-Type' => 'text/html' }, [html]]
13
+ else
14
+ @app.call env
15
+ end
16
+ end
17
+
18
+ def html
19
+ index_path = File.expand_path(File.join(Dir.pwd, "public/index.html"))
20
+ html = File.read(index_path)
21
+
22
+ ERB.new(html).result(binding)
23
+ end
24
+
25
+ def javascript_files
26
+ # TODO: OPTimize
27
+ ComponentFiles.new('home', @component_paths).javascript_files
28
+ end
29
+
30
+ def css_files
31
+ ComponentFiles.new('home', @component_paths).css_files
32
+ end
33
+
34
+
35
+
36
+ end
37
+
38
+
@@ -0,0 +1,51 @@
1
+ require 'volt/server/rack/source_map_server'
2
+
3
+ SOURCE_MAPS = !!ENV['MAPS'] unless defined?(SOURCE_MAPS)
4
+
5
+ Opal::Processor.source_map_enabled = SOURCE_MAPS
6
+ # Opal::Processor.arity_check_enabled = true
7
+ # Opal::Processor.dynamic_require_severity = :raise
8
+
9
+ # Sets up the maps for the opal assets, and source maps if enabled.
10
+ class OpalFiles
11
+ def initialize(builder, app_path, component_paths)
12
+ @component_paths = component_paths
13
+ environment = Opal::Environment.new
14
+ environment.cache = Sprockets::Cache::FileStore.new("./tmp")
15
+
16
+ environment.append_path(app_path)
17
+
18
+ volt_gem_lib_path = File.expand_path(File.join(File.dirname(__FILE__), "../../.."))
19
+ environment.append_path(volt_gem_lib_path)
20
+
21
+ add_asset_folders(environment)
22
+
23
+ # Add the opal load paths
24
+ Opal.paths.each do |path|
25
+ environment.append_path(path)
26
+ end
27
+
28
+ # opal-jquery gem
29
+ spec = Gem::Specification.find_by_name("opal-jquery")
30
+ environment.append_path(spec.gem_dir + "/opal")
31
+
32
+ builder.map '/assets' do
33
+ run environment
34
+ end
35
+
36
+ if SOURCE_MAPS
37
+ source_maps = SourceMapServer.new(environment)
38
+
39
+ builder.map(source_maps.prefix) do
40
+ run source_maps
41
+ end
42
+ end
43
+ end
44
+
45
+ def add_asset_folders(environment)
46
+ @component_paths.asset_folders do |asset_folder|
47
+ environment.append_path(asset_folder)
48
+ end
49
+ end
50
+
51
+ end
@@ -64,11 +64,9 @@ class Page
64
64
  });
65
65
  }
66
66
 
67
- # channel
68
- # channel.on('message') do |message|
69
- # # puts "GOT: #{message}"
70
- # # `console.log('got: ', message);`
71
- # end
67
+ channel.on('message') do |message|
68
+ puts "GOT: #{message}"
69
+ end
72
70
  end
73
71
 
74
72
  def link_clicked(url)
@@ -0,0 +1 @@
1
+ component 'shared'
@@ -0,0 +1 @@
1
+ component 'bootstrap'
@@ -0,0 +1,23 @@
1
+ require 'volt/server/rack/component_files'
2
+
3
+ describe ComponentFiles do
4
+ before do
5
+ spec_app_root = File.join(File.dirname(__FILE__), "../..")
6
+
7
+ path_to_main = File.join(File.dirname(__FILE__), "../../app/main")
8
+ @component_paths = ComponentPaths.new(spec_app_root)
9
+ end
10
+
11
+ it "should return the dependencies list" do
12
+ main = ComponentFiles.new("main", @component_paths)
13
+
14
+ components = main.components
15
+ expect(components).to eq(['main', 'shared', 'bootstrap'])
16
+ end
17
+
18
+ it "should list all JS files" do
19
+ main = ComponentFiles.new("main", @component_paths)
20
+
21
+ expect(main.javascript_files).to eq(["/assets/volt/templates/page.js", "/components/home.js", "/assets/js/test2.js", "/assets/js/test1.js"])
22
+ end
23
+ end
@@ -0,0 +1,26 @@
1
+ require 'volt/server/rack/component_paths'
2
+
3
+ describe ComponentPaths do
4
+ before do
5
+ spec_app_root = File.join(File.dirname(__FILE__), "../..")
6
+
7
+ path_to_main = File.join(File.dirname(__FILE__), "../../app/main")
8
+ @component_paths = ComponentPaths.new(spec_app_root)
9
+ end
10
+
11
+ it "should return the paths to all app folders" do
12
+ match_count = 0
13
+ @component_paths.app_folders do |app_folder|
14
+ if app_folder[/spec\/app$/] || app_folder[/spec\/vendor\/app$/]
15
+ match_count += 1
16
+ end
17
+ end
18
+
19
+ expect(match_count).to eq(2)
20
+ end
21
+
22
+ it "should return the path to a component" do
23
+ main_path = @component_paths.component_path('main')
24
+ expect(main_path).to match(/spec\/app\/main$/)
25
+ end
26
+ end
@@ -1,4 +1,7 @@
1
- # require 'volt/mongo'
1
+ # require 'mongo'
2
2
  # include Mongo
3
3
  #
4
- # mongo_client = MongoClient.new("localhost", 27017)
4
+ # mongo_client = MongoClient.new("localhost", 27017)
5
+ # items = mongo_client['docs']['items']
6
+ #
7
+ # items
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in <%=config[:name]%>.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) <%=Time.now.year%> <%=config[:author]%>
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,29 @@
1
+ # <%=config[:constant_name]%>
2
+
3
+ TODO: Write a gem description
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem '<%=config[:name]%>'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install <%=config[:name]%>
18
+
19
+ ## Usage
20
+
21
+ TODO: Write usage instructions here
22
+
23
+ ## Contributing
24
+
25
+ 1. Fork it ( http://github.com/[my-github-username]/<%=config[:name]%>/fork )
26
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
27
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
28
+ 4. Push to the branch (`git push origin my-new-feature`)
29
+ 5. Create new Pull Request
@@ -0,0 +1,16 @@
1
+ require "bundler/gem_tasks"
2
+ <% if config[:test] == 'minitest' -%>
3
+ require "rake/testtask"
4
+
5
+ Rake::TestTask.new(:test) do |t|
6
+ t.libs << "test"
7
+ end
8
+
9
+ task :default => :test
10
+ <% elsif config[:test] == 'rspec' -%>
11
+ require "rspec/core/rake_task"
12
+
13
+ RSpec::Core::RakeTask.new(:spec)
14
+
15
+ task :default => :spec
16
+ <% end -%>
@@ -0,0 +1 @@
1
+ 0.0.1
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require '<%= config[:namespaced_path] %>'
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1,9 @@
1
+ require "<%=config[:namespaced_path]%>/version"
2
+
3
+ <%- config[:constant_array].each_with_index do |c,i| -%>
4
+ <%= ' '*i %>class <%= c %>
5
+ <%- end -%>
6
+ <%= ' '*config[:constant_array].size %># Your code goes here...
7
+ <%- (config[:constant_array].size-1).downto(0) do |i| -%>
8
+ <%= ' '*i %>end
9
+ <%- end -%>
@@ -0,0 +1,28 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+
5
+ version = File.read(File.expand_path('../VERSION', __FILE__)).strip
6
+
7
+
8
+ Gem::Specification.new do |spec|
9
+ spec.name = <%=config[:name].inspect%>
10
+ spec.version = version
11
+ spec.authors = [<%=config[:author].inspect%>]
12
+ spec.email = [<%=config[:email].inspect%>]
13
+ spec.summary = %q{TODO: Write a short summary. Required.}
14
+ spec.description = %q{TODO: Write a longer description. Optional.}
15
+ spec.homepage = ""
16
+ spec.license = "MIT"
17
+
18
+ spec.files = `git ls-files -z`.split("\x0")
19
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
20
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
21
+ spec.require_paths = ["lib"]
22
+
23
+ spec.add_development_dependency "volt", "~> <%= config[:volt_version_base] %>"
24
+ spec.add_development_dependency "rake"
25
+ <% if config[:test] -%>
26
+ spec.add_development_dependency "<%=config[:test]%>"
27
+ <% end -%>
28
+ end
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,11 @@
1
+ require 'spec_helper'
2
+
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
+ it 'should do something useful' do
9
+ expect(false).to be true
10
+ end
11
+ end
@@ -0,0 +1,2 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require '<%= config[:namespaced_path] %>'
@@ -0,0 +1,4 @@
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require '<%= config[:namespaced_path] %>'
3
+
4
+ require 'minitest/autorun'
@@ -0,0 +1,11 @@
1
+ require 'minitest_helper'
2
+
3
+ class Test<%= config[:constant_name] %> < MiniTest::Unit::TestCase
4
+ def test_that_it_has_a_version_number
5
+ refute_nil ::<%= config[:constant_name] %>::VERSION
6
+ end
7
+
8
+ def test_it_does_something_useful
9
+ assert false
10
+ end
11
+ end