mascut 0.0.4 → 0.0.5

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,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