work-bench 1.0.7 → 1.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -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