work-bench 1.0.7 → 1.0.8

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.
@@ -1,11 +1,14 @@
1
1
  module Workbench
2
2
 
3
+ # Web-server class
3
4
  class Application
4
5
 
5
6
  attr_reader :app
6
7
 
8
+ # Initialize class
9
+ #
10
+ # @param [String] path path to working directory
7
11
  def initialize path
8
-
9
12
  @app = Rack::Builder.new {
10
13
  use Rack::Reloader, 0
11
14
  use Rack::CommonLogger
@@ -36,6 +39,10 @@ module Workbench
36
39
  }.to_app
37
40
  end
38
41
 
42
+ # Start Unicorn server
43
+ #
44
+ # @param port [Numeric] port number
45
+ # @param workers [Number] workers count
39
46
  def start port, workers
40
47
  Unicorn::HttpServer.new(@app, {
41
48
  :listeners => [port],
@@ -1,5 +1,6 @@
1
1
  module Workbench
2
2
 
3
+ # CLI application for Workbench
3
4
  class Cli < Thor
4
5
 
5
6
  include Thor::Actions
@@ -10,6 +11,16 @@ module Workbench
10
11
  File.join(File.dirname(__FILE__), '..', '..', 'template')
11
12
  end
12
13
 
14
+ # Start Unicorn server
15
+ #
16
+ # @param [String] path path to new project directory
17
+ #
18
+ # @example
19
+ # workbench start
20
+ #
21
+ # @example
22
+ # workbench start project/
23
+ #
13
24
  desc 'start [PATH] [--port] [--workers]', 'Start server in current directory'
14
25
  long_desc 'Start server in current directory'
15
26
  method_option :port, :aliases => '-p', :type => :numeric, :default => 4000, :desc => 'Port'
@@ -21,6 +32,16 @@ module Workbench
21
32
  app.start options[:port], options[:workers]
22
33
  end
23
34
 
35
+ # Create empty project from template in current directory or specific path
36
+ #
37
+ # @param [String] path path to new project directory
38
+ #
39
+ # @example
40
+ # workbench init
41
+ #
42
+ # @example
43
+ # workbench init project/
44
+ #
24
45
  desc 'init [PATH] [--js=frameworks]', 'Initialize empty project in current directory'
25
46
  long_desc 'Initialize empty project in current directory'
26
47
  method_option :js, :type => :array, :default => ['jquery'], :desc => 'Install specific JS frameworks', :banner => 'jquery jquery-ui json'
@@ -42,9 +63,9 @@ module Workbench
42
63
 
43
64
  unless options[:js].include? 'jquery'
44
65
  options[:js].push('jquery')
45
- end
66
+ end
46
67
 
47
- js_libs = Workbench::JSLibs.list
68
+ js_libs = Workbench::JSLibs::LIST
48
69
  options[:js].each do |js|
49
70
  if js_libs[js]
50
71
  get js_libs[js], "public/js/#{File.basename(js_libs[js])}"
@@ -57,25 +78,35 @@ module Workbench
57
78
  copy_file 'Gemfile', 'Gemfile'
58
79
  end
59
80
 
60
- desc 'js', 'Show available frameworks'
61
- def js
62
- js_libs = Workbench::JSLibs.list
63
- puts 'Available JS library'
64
- js_libs.each do |index, item|
65
- puts " * #{index} => #{item}"
66
- end
67
- end
68
-
81
+ # Export project to specific directory
82
+ #
83
+ # @param [String] path export directory
69
84
  desc 'export [PATH]', 'Export project'
70
85
  method_option :fix, :type => :boolean, :desc => 'Fix relative urls'
71
86
  def export path = 'export'
72
- export = Workbench::Exporter.new $root, File.join($root, path), options[:fix]
87
+ export = Workbench::Exporter.new File.expand_path('.'), File.join(File.expand_path('.'), path), options[:fix]
73
88
  export.process
74
89
  end
75
90
 
91
+ # Get available JS frameworks
92
+ #
93
+ # @example
94
+ # workbench js
95
+ #
96
+ desc 'js', 'Show available JS frameworks'
97
+ def js
98
+ puts 'Available JS frameworks'.color(:green)
99
+ Workbench::JSLibs::LIST.each { |index, item| puts " * #{index.color(:blue)} => #{item}" }
100
+ end
101
+
102
+ # Get version number
103
+ #
104
+ # @example
105
+ # workbench version
106
+ #
76
107
  desc 'version', 'Show gem version'
77
108
  def version
78
- puts "Version: #{Workbench::VERSION}"
109
+ puts "Version: #{Workbench::VERSION.color(:blue)}"
79
110
  end
80
111
 
81
112
  end
@@ -5,3 +5,4 @@ require 'compass'
5
5
  require 'rack/contrib'
6
6
  require 'rack/test'
7
7
  require 'thor'
8
+ require 'rainbow'
@@ -1,16 +1,21 @@
1
1
  module Workbench
2
2
 
3
+ # Export project to specific directory
3
4
  class Exporter
4
5
 
5
- def initialize src, dest, fix = false
6
+ # @param [String] src source directory
7
+ # @param [String] dst destination directory
8
+ # @param [Boolean] fix fix relative url
9
+ def initialize src, dst, fix = false
6
10
  @fix = fix
7
11
  @src = src
8
- @dest = dest
9
- @browser = Rack::Test::Session.new(Rack::MockSession.new(Workbench::Application.new.app))
12
+ @dst = dst
13
+ @browser = Rack::Test::Session.new(Rack::MockSession.new(Workbench::Application.new(src).app))
10
14
  end
11
15
 
16
+ # Process export
12
17
  def process
13
- puts 'Export project'
18
+ puts 'Exporting project'.color(:green)
14
19
  compile_sass
15
20
  copy_public_folder
16
21
  copy_views
@@ -18,6 +23,10 @@ module Workbench
18
23
 
19
24
  private
20
25
 
26
+ # Save file to filesystem
27
+ #
28
+ # @param [String] path path to file
29
+ # @param [String] content file content
21
30
  def save_file path, content
22
31
  if @fix
23
32
  content = content.gsub "url('/", "url('"
@@ -27,16 +36,23 @@ module Workbench
27
36
  File.open(path, 'w+') { |f| f.puts content }
28
37
  end
29
38
 
39
+ # Log action to STDOUT
40
+ #
41
+ # @param msg [String] message
30
42
  def log_action msg
31
43
  puts '=> ' + msg
32
44
  end
33
45
 
46
+ # Virtually get URL without starting server
47
+ #
48
+ # @param [String] path path to file
34
49
  def get_url path
35
50
  @browser.get path, {}, {'REQUEST_URI' => ['http://example.org', path].join('/')}
36
51
  response = @browser.last_response
37
52
  response.body
38
53
  end
39
54
 
55
+ # Compile SASS directory
40
56
  def compile_sass
41
57
  sass_files = get_file_list 'sass'
42
58
  sass_files.each do |file|
@@ -47,29 +63,35 @@ module Workbench
47
63
  end
48
64
  end
49
65
 
66
+ # Export Public folder content
50
67
  def copy_public_folder
51
- FileUtils.mkdir(@dest) unless Dir.exist? @dest
68
+ FileUtils.mkdir(@dst) unless Dir.exist? @dst
52
69
  file_list = get_file_list 'public'
53
70
  file_list.each do |filename|
54
- dirname = File.join(@dest, File.dirname(filename))
71
+ dirname = File.join(@dst, File.dirname(filename))
55
72
  FileUtils.mkdir_p(dirname) unless Dir.exist? dirname
56
- FileUtils.cp( File.join(@src, 'public', filename), File.join(@dest, filename))
57
- log_action "Copy #{filename}"
73
+ FileUtils.cp( File.join(@src, 'public', filename), File.join(@dst, filename))
74
+ log_action "Copy #{filename.color(:blue)}"
58
75
  end
59
76
  end
60
77
 
78
+ # Parse views and compile to export folder
61
79
  def copy_views
62
80
  file_list = get_file_list 'haml'
63
81
  file_list.each do |filename|
64
82
  body = get_url filename
65
83
  filename = filename.gsub('.haml', '.html')
66
- dirname = File.dirname(File.join(@dest, filename))
84
+ dirname = File.dirname(File.join(@dst, filename))
67
85
  FileUtils.mkdir_p(dirname) unless Dir.exist? dirname
68
- save_file "#{@dest}/#{filename}", body
69
- log_action "Copy #{filename}"
86
+ save_file "#{@dst}/#{filename}", body
87
+ log_action "Copy #{filename.color(:blue)}"
70
88
  end
71
89
  end
72
90
 
91
+ # Recursively get file list
92
+ #
93
+ # @param [String] relative_path path to directory
94
+ # @return [Array] file list
73
95
  def get_file_list relative_path
74
96
  path = File.join(@src, relative_path)
75
97
  result = nil
@@ -1,8 +1,9 @@
1
1
  module Workbench
2
2
 
3
+ # Parse HAML file with options
3
4
  class HamlRenderer
4
5
 
5
- @options = {
6
+ DEFAULT_HAML_OPTIONS = {
6
7
  :escape_attrs => true,
7
8
  :attr_wrapper => '"',
8
9
  :format => :html4
@@ -10,9 +11,6 @@ module Workbench
10
11
 
11
12
  class << self
12
13
 
13
- # @return [Hash] the list of options
14
- attr_accessor :options
15
-
16
14
  # Parse HAML file with options
17
15
  #
18
16
  # @param [String] filename path to file
@@ -23,8 +21,7 @@ module Workbench
23
21
  # result = Workbench::HamlRenderer.render 'index.haml', { :attr_wrapper => "'", :escape_attrs => false }
24
22
  #
25
23
  def render filename, options = {}
26
- options = @options.merge(options)
27
- Haml::Engine.new(File.read(filename), options).render
24
+ Haml::Engine.new(File.read(filename), DEFAULT_HAML_OPTIONS.merge(options)).render
28
25
  end
29
26
 
30
27
  end
@@ -1,17 +1,16 @@
1
1
  module Workbench
2
2
 
3
- class JSLibs
3
+ # Available JS libraries
4
+ class JSLibs
4
5
 
5
- def self.list
6
- {
7
- 'jquery' => 'http://code.jquery.com/jquery.js', # latest jQuery
8
- 'jquery-ui' => 'http://yandex.st/jquery-ui/1.8.16/jquery-ui.js',
9
- 'jquery-cookie' => 'http://yandex.st/jquery/cookie/1.0/jquery.cookie.js',
10
- 'jquery-easing' => 'http://yandex.st/jquery/easing/1.3/jquery.easing.js',
11
- 'json' => 'http://yandex.st/json2/2011-01-18/json2.js'
12
- }
13
- end
6
+ LIST = {
7
+ 'jquery' => 'http://code.jquery.com/jquery.js', # latest jQuery
8
+ 'jquery-ui' => 'http://yandex.st/jquery-ui/1.8.16/jquery-ui.js',
9
+ 'jquery-cookie' => 'http://yandex.st/jquery/cookie/1.0/jquery.cookie.js',
10
+ 'jquery-easing' => 'http://yandex.st/jquery/easing/1.3/jquery.easing.js',
11
+ 'json' => 'http://yandex.st/json2/2011-01-18/json2.js'
12
+ }
14
13
 
15
- end
14
+ end
16
15
 
17
16
  end
@@ -1,3 +1,3 @@
1
1
  module Workbench
2
- VERSION = "1.0.7"
2
+ VERSION = "1.0.8"
3
3
  end
@@ -0,0 +1,22 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Workbench::Cli do
5
+
6
+ describe '#version' do
7
+
8
+ it 'вернуть номер версии' do
9
+ capture(:stdout){ Workbench::Cli.start(['version']) }.should =~ /Version: #{Workbench::VERSION}/
10
+ end
11
+
12
+ end
13
+
14
+ describe '#js' do
15
+
16
+ it 'вернуть список JSбиблиотек' do
17
+ capture(:stdout){ Workbench::Cli.start(['js']) }.should =~ /jquery =>/
18
+ end
19
+
20
+ end
21
+
22
+ end
@@ -7,12 +7,12 @@ describe Workbench::HamlRenderer do
7
7
  @root = File.dirname(__FILE__) + '/fixtures'
8
8
  end
9
9
 
10
- it 'должен рендерить HAML файл' do
10
+ it 'HAML файл' do
11
11
  result = Workbench::HamlRenderer.render "#{@root}/index.haml"
12
12
  result.should == "<h1 style=\"color: red\" title=\"&amp;\">Hello world!</h1>\n"
13
13
  end
14
14
 
15
- it 'должен рендерить HAML файл с указанными опциями' do
15
+ it 'файл с опциями' do
16
16
  result = Workbench::HamlRenderer.render "#{@root}/index.haml", { :attr_wrapper => "'", :escape_attrs => false }
17
17
  result.should == "<h1 style='color: red' title='&'>Hello world!</h1>\n"
18
18
  end
@@ -4,3 +4,24 @@ require 'rubygems'
4
4
 
5
5
  require 'work_bench'
6
6
  require 'rspec'
7
+ require 'stringio'
8
+
9
+ RSpec.configure do |config|
10
+
11
+ config.before :each do
12
+ ARGV.replace []
13
+ end
14
+
15
+ def capture(stream)
16
+ begin
17
+ stream = stream.to_s
18
+ eval "$#{stream} = StringIO.new"
19
+ yield
20
+ result = eval("$#{stream}").string
21
+ ensure
22
+ eval("$#{stream} = #{stream.upcase}")
23
+ end
24
+ result
25
+ end
26
+
27
+ end
@@ -3,7 +3,7 @@
3
3
  %head
4
4
  %meta{:content => "text/html; charset=utf-8", "http-equiv" => "Content-Type"}
5
5
  %title Example project
6
- <%- l = Workbench::JSLibs.list -%>
6
+ <%- l = Workbench::JSLibs::LIST -%>
7
7
  <%- unless options[:js].empty? then -%>
8
8
  <%- options[:js].each do |lib| -%>
9
9
  %script{:src => "/js/<%= File.basename(l[lib]) %>", :type => "text/javascript"}
@@ -30,4 +30,5 @@ Gem::Specification.new do |s|
30
30
  s.add_dependency "rack-cache"
31
31
  s.add_dependency "rack-contrib"
32
32
  s.add_dependency "thor"
33
+ s.add_dependency "rainbow"
33
34
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: work-bench
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.7
4
+ version: 1.0.8
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -13,7 +13,7 @@ date: 2011-11-11 00:00:00.000000000Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: yard
16
- requirement: &70227779148420 !ruby/object:Gem::Requirement
16
+ requirement: &70319118173280 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :development
23
23
  prerelease: false
24
- version_requirements: *70227779148420
24
+ version_requirements: *70319118173280
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: maruku
27
- requirement: &70227779147860 !ruby/object:Gem::Requirement
27
+ requirement: &70319118172120 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,10 +32,10 @@ dependencies:
32
32
  version: '0'
33
33
  type: :development
34
34
  prerelease: false
35
- version_requirements: *70227779147860
35
+ version_requirements: *70319118172120
36
36
  - !ruby/object:Gem::Dependency
37
37
  name: rspec
38
- requirement: &70227779147420 !ruby/object:Gem::Requirement
38
+ requirement: &70319118170800 !ruby/object:Gem::Requirement
39
39
  none: false
40
40
  requirements:
41
41
  - - ! '>='
@@ -43,10 +43,10 @@ dependencies:
43
43
  version: '0'
44
44
  type: :development
45
45
  prerelease: false
46
- version_requirements: *70227779147420
46
+ version_requirements: *70319118170800
47
47
  - !ruby/object:Gem::Dependency
48
48
  name: rack
49
- requirement: &70227779146960 !ruby/object:Gem::Requirement
49
+ requirement: &70319118169380 !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ! '>='
@@ -54,10 +54,10 @@ dependencies:
54
54
  version: '0'
55
55
  type: :runtime
56
56
  prerelease: false
57
- version_requirements: *70227779146960
57
+ version_requirements: *70319118169380
58
58
  - !ruby/object:Gem::Dependency
59
59
  name: rack-test
60
- requirement: &70227779146460 !ruby/object:Gem::Requirement
60
+ requirement: &70319118163920 !ruby/object:Gem::Requirement
61
61
  none: false
62
62
  requirements:
63
63
  - - ! '>='
@@ -65,10 +65,10 @@ dependencies:
65
65
  version: '0'
66
66
  type: :runtime
67
67
  prerelease: false
68
- version_requirements: *70227779146460
68
+ version_requirements: *70319118163920
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: unicorn
71
- requirement: &70227779145940 !ruby/object:Gem::Requirement
71
+ requirement: &70319118162960 !ruby/object:Gem::Requirement
72
72
  none: false
73
73
  requirements:
74
74
  - - ! '>='
@@ -76,10 +76,10 @@ dependencies:
76
76
  version: '0'
77
77
  type: :runtime
78
78
  prerelease: false
79
- version_requirements: *70227779145940
79
+ version_requirements: *70319118162960
80
80
  - !ruby/object:Gem::Dependency
81
81
  name: haml
82
- requirement: &70227779145380 !ruby/object:Gem::Requirement
82
+ requirement: &70319118161700 !ruby/object:Gem::Requirement
83
83
  none: false
84
84
  requirements:
85
85
  - - ! '>='
@@ -87,10 +87,10 @@ dependencies:
87
87
  version: '0'
88
88
  type: :runtime
89
89
  prerelease: false
90
- version_requirements: *70227779145380
90
+ version_requirements: *70319118161700
91
91
  - !ruby/object:Gem::Dependency
92
92
  name: compass
93
- requirement: &70227779144700 !ruby/object:Gem::Requirement
93
+ requirement: &70319118160680 !ruby/object:Gem::Requirement
94
94
  none: false
95
95
  requirements:
96
96
  - - ! '>='
@@ -98,10 +98,10 @@ dependencies:
98
98
  version: '0'
99
99
  type: :runtime
100
100
  prerelease: false
101
- version_requirements: *70227779144700
101
+ version_requirements: *70319118160680
102
102
  - !ruby/object:Gem::Dependency
103
103
  name: rack-cache
104
- requirement: &70227779142920 !ruby/object:Gem::Requirement
104
+ requirement: &70319118159740 !ruby/object:Gem::Requirement
105
105
  none: false
106
106
  requirements:
107
107
  - - ! '>='
@@ -109,10 +109,10 @@ dependencies:
109
109
  version: '0'
110
110
  type: :runtime
111
111
  prerelease: false
112
- version_requirements: *70227779142920
112
+ version_requirements: *70319118159740
113
113
  - !ruby/object:Gem::Dependency
114
114
  name: rack-contrib
115
- requirement: &70227779142460 !ruby/object:Gem::Requirement
115
+ requirement: &70319118159060 !ruby/object:Gem::Requirement
116
116
  none: false
117
117
  requirements:
118
118
  - - ! '>='
@@ -120,10 +120,10 @@ dependencies:
120
120
  version: '0'
121
121
  type: :runtime
122
122
  prerelease: false
123
- version_requirements: *70227779142460
123
+ version_requirements: *70319118159060
124
124
  - !ruby/object:Gem::Dependency
125
125
  name: thor
126
- requirement: &70227779141900 !ruby/object:Gem::Requirement
126
+ requirement: &70319118158220 !ruby/object:Gem::Requirement
127
127
  none: false
128
128
  requirements:
129
129
  - - ! '>='
@@ -131,7 +131,18 @@ dependencies:
131
131
  version: '0'
132
132
  type: :runtime
133
133
  prerelease: false
134
- version_requirements: *70227779141900
134
+ version_requirements: *70319118158220
135
+ - !ruby/object:Gem::Dependency
136
+ name: rainbow
137
+ requirement: &70319118157720 !ruby/object:Gem::Requirement
138
+ none: false
139
+ requirements:
140
+ - - ! '>='
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ type: :runtime
144
+ prerelease: false
145
+ version_requirements: *70319118157720
135
146
  description: A quick and simple local web server for prototyping web applications
136
147
  with HAML, SASS and Compass support.
137
148
  email: konstantin.savelyev@gmail.com
@@ -156,6 +167,7 @@ files:
156
167
  - lib/work_bench/js_libs.rb
157
168
  - lib/work_bench/server.rb
158
169
  - lib/work_bench/version.rb
170
+ - spec/cli_spec.rb
159
171
  - spec/fixtures/index.haml
160
172
  - spec/haml_renderer_spec.rb
161
173
  - spec/spec_helper.rb
@@ -191,6 +203,7 @@ specification_version: 3
191
203
  summary: A quick and simple local web server for prototyping web applications with
192
204
  HAML, SASS and Compass support.
193
205
  test_files:
206
+ - spec/cli_spec.rb
194
207
  - spec/fixtures/index.haml
195
208
  - spec/haml_renderer_spec.rb
196
209
  - spec/spec_helper.rb