mascut 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,3 +1,7 @@
1
+ = 0.0.5
2
+ * start to write specs (partially)
3
+ * you can use local jquery with -j option
4
+
1
5
  = 0.0.4
2
6
  * remove sinatra dependency, mascut is now a Rack middleware (use Mascut::Mascut)
3
7
  * add command line option
data/Rakefile CHANGED
@@ -4,14 +4,15 @@ require 'rake'
4
4
  begin
5
5
  require 'jeweler'
6
6
  Jeweler::Tasks.new do |gem|
7
- gem.name = 'mascut'
8
- gem.summary = 'instant comet-like server in order to debug web pages'
7
+ gem.name = 'mascut'
8
+ gem.summary = 'instant comet-like server in order to debug web pages'
9
9
  gem.description = 'instant comet-like server in order to debug web pages'
10
- gem.email = 'okitakunio@gmail.com'
11
- gem.homepage = 'http://github.com/okitan/mascut'
12
- gem.authors = %w[ okitan ]
10
+ gem.email = 'okitakunio@gmail.com'
11
+ gem.homepage = 'http://github.com/okitan/mascut'
12
+ gem.authors = %w[ okitan ]
13
13
 
14
- gem.add_development_dependency 'rspec', '>= 1.2.9'
14
+ gem.add_development_dependency 'rr', '>= 0.10.11'
15
+ gem.add_development_dependency 'rspec', '>= 1.3.0'
15
16
  # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
16
17
  end
17
18
  Jeweler::GemcutterTasks.new
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.4
1
+ 0.0.5
@@ -16,11 +16,9 @@ module Mascut
16
16
  body = [ File.read(body.path) ] if body.is_a?(Rack::File)
17
17
  body.map! {|html| mascutize(html) }
18
18
  headers['Content-Length'] = body.to_a.inject(0) { |len, part| len + Rack::Utils.bytesize(part) }.to_s
19
-
20
- [ status, headers, [mascutize(body.first)] ]
21
- else
22
- [ status, headers, body ]
23
19
  end
20
+
21
+ [ status, headers, body ]
24
22
  end
25
23
  end
26
24
 
@@ -39,7 +37,22 @@ module Mascut
39
37
 
40
38
  def mascutize(html)
41
39
  # I don't use html parser like nokogiri, because it corrects html to be debugged
42
- html.sub('</head>', <<-JS)
40
+ html.sub('</head>', @opts[:jquery] ? <<-LOCAL : <<-REMOTE)
41
+ <script src='#{@opts[:jquery]}'></script>
42
+ <script>
43
+ var comet = function() {
44
+ $.ajax({
45
+ type: 'GET',
46
+ url: '#{@path}',
47
+ success: function(msg) {
48
+ msg == 'reload' ? location.reload() : comet();
49
+ }
50
+ });
51
+ }
52
+ $(document).ready(comet);
53
+ </script>
54
+ </head>
55
+ LOCAL
43
56
  <script src='http://www.google.com/jsapi'></script>
44
57
  <script>
45
58
  var comet = function() {
@@ -56,7 +69,7 @@ google.load('jquery', '1');
56
69
  google.setOnLoadCallback(comet);
57
70
  </script>
58
71
  </head>
59
- JS
72
+ REMOTE
60
73
  end
61
74
  end
62
75
  end
@@ -38,6 +38,10 @@ module Mascut
38
38
  opts.on('-i', '--interval SEC', Float, 'interval to monitor files(default on Mascut::Mascut: 1.0 sec)') do |sec|
39
39
  options[:interval] = sec
40
40
  end
41
+
42
+ opts.on('-j', '--jquery JQUERY', 'jquery file to use for commet') do |file|
43
+ options[:jquery] = file
44
+ end
41
45
 
42
46
  opts.permute!(args)
43
47
  options[:files] = args.size > 0 ? args : nil
@@ -0,0 +1,124 @@
1
+ require File.join(File.dirname(__FILE__), %w[ .. spec_helper ])
2
+
3
+ describe Mascut::Mascut, '#new' do
4
+ context 'called with only an app' do
5
+ let(:app) { nil }
6
+ subject { Mascut::Mascut.new(app) }
7
+
8
+ before do
9
+ # Dir.chdir(tmpdir)
10
+ # tmpdir has some files
11
+ end
12
+
13
+ after do
14
+ # Dir.chdir(currentdir)
15
+ # delete tmpdir
16
+ end
17
+
18
+ it 'should assign @path with default value /mascut' do
19
+ subject.instance_variable_get(:@path).should == '/mascut'
20
+ end
21
+
22
+ it %(should assign @files with default value Dir['**/*']) do
23
+ pending 'I should change Dir to tmpdir'
24
+ end
25
+
26
+ it 'should assign @opts with default value {}' do
27
+ subject.instance_variable_get(:@opts).should == {}
28
+ end
29
+ end
30
+ end
31
+
32
+ describe Mascut::Mascut, '#call' do
33
+ let(:app) { mock }
34
+ let(:files) { [ ] }
35
+ let(:middleware) { Mascut::Mascut.new(app, '/mascut', files, {}) }
36
+
37
+ subject { middleware.call('PATH_INFO' => path) }
38
+
39
+ let(:html) { '<html><head></head><body></body>' }
40
+
41
+ context 'if path is not mascut' do
42
+ let(:path) { '/hoge.html' }
43
+ let(:html) { '<html><head></head><body></body>' }
44
+
45
+ it 'app should be called' do
46
+ mock(app).call('PATH_INFO' => path)
47
+ subject
48
+ end
49
+
50
+ context 'if app returns html with status 200' do
51
+ before do
52
+ stub(app).call { [ 200, { 'Content-Type' => 'text/html' }, [ html ] ] }
53
+ end
54
+
55
+ it 'should call mascutize' do
56
+ mock(middleware).mascutize(html) { 'mascutized' }
57
+ subject
58
+ end
59
+
60
+ it 'should also returns 200' do
61
+ subject[0].should == 200
62
+ end
63
+
64
+ it 'should add updated content length' do
65
+ stub(middleware).mascutize(html) { '12characters' }
66
+ subject[1].should include('Content-Length' => 12.to_s )
67
+ end
68
+
69
+ it 'should return mascutized values' do
70
+ mock(middleware).mascutize(html) { 'mascutized' }
71
+ subject[2].should == [ 'mascutized' ]
72
+ end
73
+ end
74
+
75
+ [ [ 201, { 'Content-Type' => 'text/html' }, [ 'html' ] ],
76
+ [ 200, { 'Content-Type' => 'text/css' }, [ 'css' ] ],
77
+ ].each do |response|
78
+ context "when status is #{response[0]} and Content-Type is #{response[1]['Content-Type']}" do
79
+ before do
80
+ stub(app).call { response }
81
+ end
82
+
83
+ it 'should return as is' do
84
+ subject.should == response
85
+ end
86
+ end
87
+ end
88
+ end
89
+
90
+ context 'if path is mascut' do
91
+ let(:path) { '/mascut' }
92
+ it 'should wait until the files are updated' do
93
+ pending 'thread and benchmark'
94
+ end
95
+ end
96
+ end
97
+
98
+ describe Mascut::Mascut, '#mascut' do
99
+ it 'should have specs'
100
+ end
101
+
102
+ describe Mascut::Mascut, '#mascutize' do
103
+ let(:app) { mock }
104
+ let(:html) { '<html><head></head><body></body>' }
105
+ subject { Mascut::Mascut.new(app, nil, nil, opts).mascutize(html) }
106
+
107
+ context 'if use local jquery' do
108
+ let(:jquery) { 'jquery_file' }
109
+ let(:opts) { { :jquery => jquery } }
110
+
111
+ it "should include local jquery path" do
112
+ subject.should =~ /#{jquery}/
113
+ end
114
+ end
115
+
116
+ context 'if use remote jquery' do
117
+ let(:opts) { {} }
118
+
119
+ it 'should load jquery from google' do
120
+ subject.should =~ /http:\/\/www\.google\.com\/jsapi/
121
+ end
122
+ end
123
+ end
124
+
@@ -0,0 +1,94 @@
1
+ require File.join(File.dirname(__FILE__), %w[ .. spec_helper ])
2
+
3
+ describe Mascut::Option, '#parse' do
4
+ subject { Mascut::Option.parse(args) }
5
+ let(:value) { 'value' }
6
+
7
+ context 'String option' do
8
+ [ %w[ -s --server server ],
9
+ %w[ -o --host Host ],
10
+ %w[ -j --jquery jquery],
11
+ ].each do |short, long, key|
12
+ context "with short option #{short}" do
13
+ let(:args) { [ short, value ] }
14
+
15
+ it "should assign #{key}" do
16
+ subject[key.to_sym].should == value
17
+ end
18
+ end
19
+
20
+ context "with long option #{long}" do
21
+ it 'should have specs'
22
+ end
23
+ end
24
+
25
+ context '-m --mascut' do
26
+ context 'with short option -m' do
27
+ it 'should assign mascut and add its head /' do
28
+ Mascut::Option.parse(%w[ -m mascut ])[:mascut].should == '/mascut'
29
+ end
30
+
31
+ it 'should assign mascut and add its head /' do
32
+ Mascut::Option.parse(%w[ -m /mascut ])[:mascut].should == '/mascut'
33
+ end
34
+ end
35
+
36
+ context 'with long option --mascut' do
37
+ it 'should have specs'
38
+ end
39
+ end
40
+ end
41
+
42
+ context 'Integer option' do
43
+ [ %w[ -p --port Port ],
44
+ ].each do |short, long, key|
45
+ # XXX: now default value is Integer but parsed value is String
46
+ it 'should have specs'
47
+ end
48
+ end
49
+
50
+ context 'Float option' do
51
+ [ %w[ -i --interval interval],
52
+ ].each do |short, long, key|
53
+ it 'should have specs'
54
+ end
55
+ end
56
+
57
+ # returns true/false
58
+ context 'boolean option' do
59
+ [
60
+ %w[ -D --daemonize daemonize],
61
+ ].each do |short, long, key|
62
+ it 'should have specs'
63
+ end
64
+ end
65
+
66
+ # out of options
67
+ context 'not options' do
68
+ let(:args) { %w[ file1 file2 ] }
69
+
70
+ it 'should be assigned to files' do
71
+ subject[:files].should == args
72
+ end
73
+ end
74
+
75
+ context 'invalid options' do
76
+ it 'should have specs'
77
+ end
78
+
79
+ # default values
80
+ [ [ :server, 'mongrel' ],
81
+ [ :Host, '0.0.0.0' ],
82
+ [ :Port, 9203 ],
83
+ [ :files, nil ],
84
+ ].each do |key, default_value|
85
+ context "when #{key} is not specified" do
86
+ let(:args) { [] }
87
+
88
+ it 'should be assigned default value' do
89
+ subject[key].should == default_value
90
+ end
91
+ end
92
+ end
93
+ end
94
+
@@ -1,7 +1,6 @@
1
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
1
+ require File.join(File.dirname(__FILE__), 'spec_helper')
2
2
 
3
- describe "Mascut" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
6
- end
3
+ describe Mascut::VERSION do
4
+ it { should =~ /^\d+\.\d+\.\d+(\w+)?$/ }
7
5
  end
6
+
@@ -1,9 +1,10 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
1
+ $: << File.join(File.dirname(__FILE__), %w[ .. lib ])
3
2
  require 'mascut'
4
- require 'spec'
5
- require 'spec/autorun'
3
+
4
+ require 'rubygems'
5
+ require 'rack'
6
+ require 'rr'
6
7
 
7
8
  Spec::Runner.configure do |config|
8
-
9
+ config.mock_with :rr
9
10
  end
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 4
9
- version: 0.0.4
8
+ - 5
9
+ version: 0.0.5
10
10
  platform: ruby
11
11
  authors:
12
12
  - okitan
@@ -14,23 +14,37 @@ autorequire:
14
14
  bindir: bin
15
15
  cert_chain: []
16
16
 
17
- date: 2010-04-12 00:00:00 +09:00
17
+ date: 2010-05-24 00:00:00 +09:00
18
18
  default_executable: mascut
19
19
  dependencies:
20
20
  - !ruby/object:Gem::Dependency
21
- name: rspec
21
+ name: rr
22
22
  prerelease: false
23
23
  requirement: &id001 !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - ">="
26
26
  - !ruby/object:Gem::Version
27
27
  segments:
28
- - 1
29
- - 2
30
- - 9
31
- version: 1.2.9
28
+ - 0
29
+ - 10
30
+ - 11
31
+ version: 0.10.11
32
32
  type: :development
33
33
  version_requirements: *id001
34
+ - !ruby/object:Gem::Dependency
35
+ name: rspec
36
+ prerelease: false
37
+ requirement: &id002 !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 1
43
+ - 3
44
+ - 0
45
+ version: 1.3.0
46
+ type: :development
47
+ version_requirements: *id002
34
48
  description: instant comet-like server in order to debug web pages
35
49
  email: okitakunio@gmail.com
36
50
  executables:
@@ -52,6 +66,8 @@ files:
52
66
  - lib/mascut.rb
53
67
  - lib/mascut/mascut.rb
54
68
  - lib/mascut/option.rb
69
+ - spec/mascut/mascut_spec.rb
70
+ - spec/mascut/option_spec.rb
55
71
  - spec/mascut_spec.rb
56
72
  - spec/spec.opts
57
73
  - spec/spec_helper.rb
@@ -86,5 +102,7 @@ signing_key:
86
102
  specification_version: 3
87
103
  summary: instant comet-like server in order to debug web pages
88
104
  test_files:
105
+ - spec/mascut/mascut_spec.rb
106
+ - spec/mascut/option_spec.rb
89
107
  - spec/spec_helper.rb
90
108
  - spec/mascut_spec.rb