snatch 0.0.10 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
data/.autotest ADDED
@@ -0,0 +1,15 @@
1
+ begin
2
+ require 'autotest/growl'
3
+ require 'autotest/fsevent'
4
+
5
+ Autotest::Growl::show_modified_files = true
6
+ rescue LoadError
7
+ $stderr.puts "Failed to load Mac-specific autotest enhancements"
8
+ end
9
+
10
+ Autotest.add_hook :initialize do |autotest|
11
+ exceptions = %w[ .git .svn .hg .DS_Store ._* ]
12
+ exceptions.each do |exception|
13
+ autotest.add_exception(exception)
14
+ end
15
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.10
1
+ 1.0.0
@@ -0,0 +1,56 @@
1
+ class Snatch
2
+ class Clean
3
+ class CSS
4
+ attr_accessor :doc, :working_directory
5
+
6
+ def initialize(doc, working_directory)
7
+ self.doc = doc
8
+ self.working_directory = working_directory
9
+ end
10
+
11
+ def self.update(nokogiri_doc, working_directory = nil)
12
+ new(nokogiri_doc, working_directory).update
13
+ end
14
+
15
+ def update
16
+ doc.css('link[rel=stylesheet]').each do |stylesheet_node|
17
+ stylesheet_node['href'] = rewrite_href(stylesheet_node['href'])
18
+ end
19
+ doc
20
+ end
21
+
22
+ private
23
+
24
+ def extract_path_components(href)
25
+ m = href.match(%r{^(.+)?stylesheet\.php\?cssid=(\d+)(?:&|&)mediatype=(\w+)})
26
+ m.nil? ? nil : m.to_a[1..-1].compact
27
+ end
28
+
29
+ def expand_paths(*paths)
30
+ paths.map { |path| File.expand_path(File.join(@working_directory, path)) }
31
+ end
32
+
33
+ def mv_stylesheet(php_path, css_path)
34
+ php_path, css_path = *expand_paths(php_path, css_path)
35
+ FileUtils.mv(php_path, css_path) if File.exist?(php_path)
36
+ end
37
+
38
+ def rewrite_href(href)
39
+ return href if href.empty?
40
+ css_path = href
41
+ matches = extract_path_components(href)
42
+
43
+ unless matches.nil?
44
+ path = matches.size == 3 ? matches.shift : nil
45
+
46
+ file_name = matches.join('-')
47
+ css_path = File.join(*[path, "#{file_name}.css"].compact)
48
+
49
+ mv_stylesheet(href, css_path)
50
+ end
51
+
52
+ css_path
53
+ end
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,74 @@
1
+ class Snatch
2
+ class Clean
3
+ class HTML
4
+ module HrefFixMethods
5
+ def remove_index_html(a)
6
+ a['href'] = a['href'].sub(%r{index\.html?$}, '')
7
+ end
8
+
9
+ def replace_absolute(a)
10
+ a['href'] = a['href'].sub(%r{(https?)://#{MARKETING_SITE}/}, '/')
11
+ end
12
+
13
+ def encode_mailtos(a)
14
+ if a['href'] =~ /^mailto:(.*)/
15
+ a['href'] = 'mailto:' + url_encode($1)
16
+ a.inner_html = html_encode(a.inner_html)
17
+ end
18
+ end
19
+
20
+ def prepend_slash(a)
21
+ a['href'] = a['href'].sub(%r{^/?}, '/') unless a['href'].include?(':')
22
+ end
23
+
24
+ def append_slash(a)
25
+ slash_required = (%w(# : .) & a['href'].split(//)).empty?
26
+ a['href'] = a['href'].sub(%r{/?$}, '/') if slash_required
27
+ end
28
+ end
29
+
30
+ module SrcFixMethods
31
+ def replace_absolute(link)
32
+ link['src'] = link['src'].sub(%r{(https?)://#{MARKETING_SITE}/}, '/')
33
+ end
34
+
35
+ def rewrite_uploads(link)
36
+ link['src'] = link['src'].sub(%r{^#{UPLOADS_DIR}/}, "/#{UPLOADS_DIR}/")
37
+ end
38
+ end
39
+
40
+ attr_accessor :doc, :working_directory
41
+
42
+ def initialize(doc, working_directory)
43
+ @doc = doc
44
+ @working_directory = working_directory
45
+ end
46
+
47
+ def self.update(doc, working_directory)
48
+ new(doc, working_directory).update
49
+ end
50
+
51
+ def html_encode(string)
52
+ string.gsub(/./){ |char| "&#x#{char.unpack('U')[0].to_s(16)};" }
53
+ end
54
+
55
+ def url_encode(string)
56
+ string.gsub(/./) { |char| '%' + char.unpack('H2' * char.size).join('%').upcase }
57
+ end
58
+
59
+ def update
60
+ @doc.css('base, meta[generator]').each { |node| node.remove }
61
+
62
+ @doc.children.reject! { |child| child.comment? }
63
+
64
+ HrefFixMethods.instance_methods.each do |m|
65
+ @doc.css('a[href]').each { |a| send m, a }
66
+ end
67
+
68
+ SrcFixMethods.instance_methods.each do |m|
69
+ @doc.css('[src]').each { |a| send m, a }
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
data/lib/snatch/clean.rb CHANGED
@@ -10,9 +10,6 @@ class Snatch
10
10
  @doc = Nokogiri::XML(File.open(@file_name, 'r'))
11
11
  end
12
12
 
13
- # Convenience method for creating Snatch::Clean with HTML.
14
- #
15
- # Returns instance of Snatch::Clean
16
13
  def self.process(html, working_directory = nil)
17
14
  instance = new(html, working_directory)
18
15
  instance.process
@@ -20,65 +17,10 @@ class Snatch
20
17
  end
21
18
 
22
19
  def process
23
- @doc.css('link[rel=stylesheet]').each do |stylesheet_node|
24
- stylesheet_node['href'] = rewrite_href(stylesheet_node['href'])
25
- end
26
-
27
- @doc.css('a[href]').each do |anchor|
28
- anchor['href'].sub!(%r{\.html?$}, '')
29
- end
20
+ CSS.update(@doc, @working_directory)
21
+ HTML.update(@doc, @working_directory)
30
22
 
31
23
  File.open(@file_name, 'w') { |f| f.write @doc.to_html }
32
24
  end
33
-
34
- private
35
- def log(*messages)
36
- width = messages.max(&:size).size
37
- puts "\e[36;1m#{messages.map(&:inspect).join("\n")}\e[0m"
38
- puts '=' * width.to_i
39
- end
40
-
41
- def rewrite_href(href)
42
- return href unless href.present?
43
- css_path = href
44
- matches = extract_path_components(href)
45
-
46
- if matches.present?
47
- path = matches.size == 3 ? matches.shift : nil
48
-
49
- file_name = matches.join('-')
50
- css_path = File.join(*[path, "#{file_name}.css"].compact)
51
-
52
- mv_stylesheet(href, css_path)
53
- end
54
-
55
- css_path
56
- end
57
-
58
- # Look for a match within our stylesheet link href. If it's there
59
- # reject the original string from MatchData.
60
- #
61
- # Returns Array of matches or nil
62
- def extract_path_components(href)
63
- m = href.match(%r{^(.+)?stylesheet\.php\?cssid=(\d+)(?:&|&)mediatype=(\w+)})
64
- m.present? ? m.to_a[1..-1].compact : nil
65
- end
66
-
67
- def remove_query_params(href)
68
- href.sub(%r{\.php\?.*?$}, '.php')
69
- end
70
-
71
- # Convert any number of paths in to absolute paths prepending with
72
- # the public path (e.g. /Users/jcf/git/static/public/#{path}).
73
- #
74
- # Returns an Array of expanded paths
75
- def expand_paths(*paths)
76
- paths.map { |path| File.expand_path(File.join(@working_directory, path)) }
77
- end
78
-
79
- def mv_stylesheet(php_path, css_path)
80
- php_path, @css_path = *expand_paths(php_path, css_path)
81
- FileUtils.mv(php_path, @css_path) if File.exist?(php_path)
82
- end
83
25
  end
84
26
  end
data/lib/snatch.rb CHANGED
@@ -1,9 +1,12 @@
1
1
  $LOAD_PATH.unshift(File.dirname(__FILE__))
2
2
 
3
- require "#{File.dirname(__FILE__)}/extensions"
3
+ require "extensions"
4
4
  require 'snatch/clean'
5
+ require 'snatch/clean/html'
6
+ require 'snatch/clean/css'
5
7
 
6
8
  class Snatch
9
+ RAILS_ROOT = Dir.pwd unless defined?(RAILS_ROOT)
7
10
  RAILS_PUBLIC_ASSETS = [
8
11
  '404.html',
9
12
  '422.html',
@@ -19,6 +22,9 @@ class Snatch
19
22
  ].map { |file_name| File.expand_path("#{RAILS_ROOT}/public/#{file_name}") }
20
23
  PUBLIC_PATH = File.expand_path("#{Dir.pwd}/public")
21
24
 
25
+ MARKETING_SITE = 'cms.alphasights-002.vm.brightbox.net'
26
+ UPLOADS_DIR = 'uploads'
27
+
22
28
  def initialize(url = nil)
23
29
  @url = url || 'www.google.com'
24
30
  end
@@ -81,7 +87,8 @@ class Snatch
81
87
  def remove_cms_files
82
88
  glob_path = File.expand_path("#{RAILS_ROOT}/public") + '/*'
83
89
  Pathname.glob(glob_path) do |pathname|
84
- FileUtils.rm_rf(pathname.to_s) unless RAILS_PUBLIC_ASSETS.include?(pathname.expand_path("#{RAILS_ROOT}/public").to_s)
90
+ public_path = pathname.expand_path("#{RAILS_ROOT}/public").to_s
91
+ FileUtils.rm_rf(pathname.to_s) unless RAILS_PUBLIC_ASSETS.include?(public_path)
85
92
  end
86
93
  end
87
94
 
data/snatch.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{snatch}
8
- s.version = "0.0.10"
8
+ s.version = "1.0.0"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["James Conroy-Finn"]
12
- s.date = %q{2010-02-10}
12
+ s.date = %q{2010-02-15}
13
13
  s.description = %q{Simple site downloaded that wraps wget and converts PHP CSS files in to regular CSS files.}
14
14
  s.email = %q{james@logi.cl}
15
15
  s.extra_rdoc_files = [
@@ -17,7 +17,8 @@ Gem::Specification.new do |s|
17
17
  "README.rdoc"
18
18
  ]
19
19
  s.files = [
20
- ".document",
20
+ ".autotest",
21
+ ".document",
21
22
  ".gitignore",
22
23
  "LICENSE",
23
24
  "README.rdoc",
@@ -26,11 +27,16 @@ Gem::Specification.new do |s|
26
27
  "lib/extensions.rb",
27
28
  "lib/snatch.rb",
28
29
  "lib/snatch/clean.rb",
30
+ "lib/snatch/clean/css.rb",
31
+ "lib/snatch/clean/html.rb",
29
32
  "snatch.gemspec",
33
+ "spec/snatch/clean/css_spec.rb",
34
+ "spec/snatch/clean/html_spec.rb",
30
35
  "spec/snatch/clean_spec.rb",
31
36
  "spec/snatch_spec.rb",
32
37
  "spec/spec.opts",
33
- "spec/spec_helper.rb"
38
+ "spec/spec_helper.rb",
39
+ "spec/support/matchers/nokogiri.rb"
34
40
  ]
35
41
  s.homepage = %q{http://github.com/jcf/snatch}
36
42
  s.rdoc_options = ["--charset=UTF-8"]
@@ -38,9 +44,12 @@ Gem::Specification.new do |s|
38
44
  s.rubygems_version = %q{1.3.5}
39
45
  s.summary = %q{wget your site and replace any nasty PHP CSS files}
40
46
  s.test_files = [
41
- "spec/snatch/clean_spec.rb",
47
+ "spec/snatch/clean/css_spec.rb",
48
+ "spec/snatch/clean/html_spec.rb",
49
+ "spec/snatch/clean_spec.rb",
42
50
  "spec/snatch_spec.rb",
43
- "spec/spec_helper.rb"
51
+ "spec/spec_helper.rb",
52
+ "spec/support/matchers/nokogiri.rb"
44
53
  ]
45
54
 
46
55
  if s.respond_to? :specification_version then
@@ -0,0 +1,78 @@
1
+ require 'spec_helper'
2
+
3
+ describe Snatch::Clean::CSS do
4
+ before(:each) do
5
+ File.stub!(:open)
6
+ @css = Snatch::Clean::CSS.new('nokogiri_doc', 'public')
7
+ end
8
+
9
+ describe "rewrite_href" do
10
+ it "should do nothing without an href" do
11
+ @css.send(:rewrite_href, '').should == ''
12
+ end
13
+
14
+ it "should move a top-level stylesheet file" do
15
+ href = 'stylesheet.php?cssid=12&mediatype=screen'
16
+ @css.should_receive(:mv_stylesheet).with(href, '12-screen.css')
17
+ @css.send(:rewrite_href, href)
18
+ end
19
+
20
+ it "should move a nested stylesheet file" do
21
+ href = '../stylesheet.php?cssid=12&mediatype=screen'
22
+ @css.should_receive(:mv_stylesheet).with(href, '../12-screen.css')
23
+ @css.send(:rewrite_href, href)
24
+ end
25
+ end
26
+
27
+ describe "extract_path_components" do
28
+ it "should find parents and values for cssid and mediatype" do
29
+ php_path = '/css/something/stylesheet.php?cssid=12&mediatype=screen'
30
+ path = @css.send(:extract_path_components, php_path)
31
+ path.to_a.should == ['/css/something/', '12', 'screen']
32
+ end
33
+
34
+ it "should find relative path compontents and values for cssid and mediatype" do
35
+ php_path = '../../stylesheet.php?cssid=12&mediatype=screen'
36
+ path = @css.send(:extract_path_components, php_path)
37
+ path.to_a.should == ['../../', '12', 'screen']
38
+ end
39
+
40
+ it "should find values for cssid and mediatype" do
41
+ php_path = 'stylesheet.php?cssid=12&mediatype=screen'
42
+ path = @css.send(:extract_path_components, php_path)
43
+ path.to_a.should == ['12', 'screen']
44
+ end
45
+ end
46
+
47
+ describe "moving PHP files to CSS path" do
48
+ it "should expand multiple paths to include the public directory" do
49
+ public_path = Snatch::PUBLIC_PATH
50
+ expected = [
51
+ File.expand_path(File.join(public_path, 'a/b')),
52
+ File.expand_path(File.join(public_path, 'c/d'))
53
+ ]
54
+ @css.send(:expand_paths, 'a/b', 'c/d').should == expected
55
+ end
56
+
57
+ it "should assign multiple paths with a splat" do
58
+ public_path = Snatch::PUBLIC_PATH
59
+ expected = [
60
+ File.expand_path(File.join(public_path, 'a/b')),
61
+ File.expand_path(File.join(public_path, 'c/d')),
62
+ File.expand_path(File.join(public_path, 'e/f'))
63
+ ]
64
+ a, b, c = *@css.send(:expand_paths, 'a/b', 'c/d', 'e/f')
65
+ a.should == expected.first
66
+ b.should == expected[1]
67
+ c.should == expected.last
68
+ end
69
+
70
+ it "should expand absolute paths to include the public directory" do
71
+ public_path = Snatch::PUBLIC_PATH
72
+ expected = [
73
+ File.expand_path(File.join(public_path, '/a/b'))
74
+ ]
75
+ @css.send(:expand_paths, '/a/b').should == expected
76
+ end
77
+ end
78
+ end
@@ -0,0 +1,126 @@
1
+ # encoding: utf-8
2
+ require 'spec_helper'
3
+
4
+ describe Snatch::Clean::HTML do
5
+ before(:each) do
6
+ @html = Snatch::Clean::HTML.new('nokogiri_doc', 'public')
7
+ end
8
+
9
+ describe "Removing crap" do
10
+ before do
11
+ @html.doc.should_receive(:css).with('a[href]').any_number_of_times.and_return([])
12
+ @html.doc.should_receive(:css).with('[src]').any_number_of_times.and_return([])
13
+ end
14
+
15
+ it 'should remove any base tags' do
16
+ mock_nodes = [(mock_node = mock('nokogiri_node'))]
17
+ @html.doc.should_receive(:css).with('base, meta[generator]').and_return(mock_nodes)
18
+ @html.doc.should_receive(:children).and_return([])
19
+ mock_nodes.should_receive(:each).and_yield(mock_node)
20
+ mock_node.should_receive(:remove)
21
+ @html.send(:update)
22
+ end
23
+
24
+ it 'should remove comments and the generator meta tag' do
25
+ mock_nodes = [(mock_node = mock('nokogiri_node'))]
26
+ @html.doc.should_receive(:css).with('base, meta[generator]').and_return([])
27
+ @html.doc.should_receive(:children).twice.and_return(mock_nodes)
28
+ mock_node.should_receive(:comment?).and_return(true)
29
+ @html.send(:update)
30
+ @html.doc.children.should be_empty
31
+ end
32
+ end
33
+
34
+ describe Snatch::Clean::HTML::HrefFixMethods do
35
+ subject { mock.extend(Snatch::Clean::HTML::HrefFixMethods) }
36
+
37
+ it 'should remove a trailing index.html' do
38
+ fix_node(:remove_index_html, '<a href="/blah/index.html"></a>') do |node|
39
+ node.should have_href('/blah/')
40
+ end
41
+ end
42
+
43
+ it 'should replace an absolute CMS URL with a domainless absolute URL' do
44
+ anchor = %Q{<a href="http://#{Snatch::MARKETING_SITE}/folder"></a>}
45
+ fix_node(:replace_absolute, anchor) do |node|
46
+ node.should have_href('/folder')
47
+ end
48
+ end
49
+
50
+ it 'should encode email addresses' do
51
+ anchor = %Q{<a href="mailto:blah@exåmplé.cøm">blah@exåmplé.cøm</a>}
52
+ subject.should_receive(:url_encode).and_return('url_encode')
53
+ subject.should_receive(:html_encode).and_return('html_encode')
54
+ fix_node(:encode_mailtos, anchor) do |node|
55
+ node.should have_href('mailto:url_encode')
56
+ node.text.should == 'html_encode'
57
+ end
58
+ end
59
+
60
+ describe "leading slashes and colons" do
61
+ it 'should append a slash when there is no colon' do
62
+ fix_node(:prepend_slash, %Q{<a href="blah/file.txt"></a>}) do |node|
63
+ node.should have_href('/blah/file.txt')
64
+ end
65
+ end
66
+
67
+ it 'should not append a slash when there is a colon' do
68
+ fix_node(:prepend_slash, %Q{<a href="blah/file:wtf.txt"></a>}) do |node|
69
+ node.should have_href('blah/file:wtf.txt')
70
+ end
71
+ end
72
+
73
+ it 'should not add two slashes' do
74
+ fix_node(:prepend_slash, %Q{<a href="/blah/file.txt"></a>}) do |node|
75
+ node.should have_href('/blah/file.txt')
76
+ end
77
+ end
78
+ end
79
+
80
+ describe "trailing slash" do
81
+ it 'with a period' do
82
+ fix_node(:append_slash, %Q{<a href="file.extension"></a>}) do |node|
83
+ node.should have_href('file.extension')
84
+ end
85
+ end
86
+
87
+ it 'with a hash' do
88
+ fix_node(:append_slash, %Q{<a href="blah#anchor"></a>"}) do |node|
89
+ node.should have_href('blah#anchor')
90
+ end
91
+ end
92
+
93
+ it 'with a colon' do
94
+ # When would this ever happen?
95
+ fix_node(:append_slash, %Q{<a href="user:pass@domain.com"></a>}) do |node|
96
+ node.should have_href('user:pass@domain.com')
97
+ end
98
+ end
99
+
100
+ it 'should not duplicate slashes' do
101
+ fix_node(:append_slash, %Q{<a href="folder/"></a>}) do |node|
102
+ node.should have_href('folder/')
103
+ end
104
+ end
105
+ end
106
+ end
107
+
108
+ describe Snatch::Clean::HTML::SrcFixMethods do
109
+ subject { mock.extend(Snatch::Clean::HTML::SrcFixMethods) }
110
+
111
+ it 'should replace an absolute CMS URL with a domainless absolute URL' do
112
+ link = %Q{<link src="http://#{Snatch::MARKETING_SITE}/folder"></a>}
113
+ fix_node(:replace_absolute, link) do |node|
114
+ node.should have_src('/folder')
115
+ end
116
+ end
117
+
118
+ it 'should make upload URLs absolute and root' do
119
+ link = %Q{<link src="uploads/some-image.png"></link>}
120
+ fix_node(:rewrite_uploads, link) do |node|
121
+ node.should have_src('/uploads/some-image.png')
122
+ end
123
+ end
124
+ end
125
+ end
126
+
@@ -2,93 +2,14 @@ require 'spec_helper'
2
2
 
3
3
  describe Snatch::Clean do
4
4
  before(:each) do
5
- File.stub!(:open)
5
+ File.stub!(:open).and_return('stream')
6
+ @clean = Snatch::Clean.new('file_name', 'public')
6
7
  end
7
8
 
8
- it "should remove query params after a PHP CSS path" do
9
- clean = Snatch::Clean.new('file_name')
10
- href = '../../stylesheet.php?blah=woot'
11
- expected = '../../stylesheet.php'
12
- clean.send(:remove_query_params, href).should == expected
13
- end
14
-
15
- describe "rewrite_href" do
16
- before(:each) do
17
- @clean = Snatch::Clean.new('file_name')
18
- end
19
-
20
- it "should do nothing without an href" do
21
- @clean.send(:rewrite_href, '').should == ''
22
- end
23
-
24
- it "should move a top-level stylesheet file" do
25
- href = 'stylesheet.php?cssid=12&amp;mediatype=screen'
26
- @clean.should_receive(:mv_stylesheet).with(href, '12-screen.css')
27
- @clean.send(:rewrite_href, href)
28
- end
29
-
30
- it "should move a nested stylesheet file" do
31
- href = '../stylesheet.php?cssid=12&amp;mediatype=screen'
32
- @clean.should_receive(:mv_stylesheet).with(href, '../12-screen.css')
33
- @clean.send(:rewrite_href, href)
34
- end
35
- end
36
-
37
- describe "extract_path_components" do
38
- it "should find parents and values for cssid and mediatype" do
39
- clean = Snatch::Clean.new('file_name')
40
- php_path = '/css/something/stylesheet.php?cssid=12&amp;mediatype=screen'
41
- path = clean.send(:extract_path_components, php_path)
42
- path.to_a.should == ['/css/something/', '12', 'screen']
43
- end
44
-
45
- it "should find relative path compontents and values for cssid and mediatype" do
46
- clean = Snatch::Clean.new('file_name')
47
- php_path = '../../stylesheet.php?cssid=12&amp;mediatype=screen'
48
- path = clean.send(:extract_path_components, php_path)
49
- path.to_a.should == ['../../', '12', 'screen']
50
- end
51
-
52
- it "should find values for cssid and mediatype" do
53
- clean = Snatch::Clean.new('file_name')
54
- php_path = 'stylesheet.php?cssid=12&amp;mediatype=screen'
55
- path = clean.send(:extract_path_components, php_path)
56
- path.to_a.should == ['12', 'screen']
57
- end
58
- end
59
-
60
- describe "moving PHP files to CSS path" do
61
- it "should expand multiple paths to include the public directory" do
62
- clean = Snatch::Clean.new('file_name')
63
- public_path = Snatch::PUBLIC_PATH
64
- expected = [
65
- File.expand_path(File.join(public_path, 'a/b')),
66
- File.expand_path(File.join(public_path, 'c/d'))
67
- ]
68
- clean.send(:expand_paths, 'a/b', 'c/d').should == expected
69
- end
70
-
71
- it "should assign multiple paths with a splat" do
72
- clean = Snatch::Clean.new('file_name')
73
- public_path = Snatch::PUBLIC_PATH
74
- expected = [
75
- File.expand_path(File.join(public_path, 'a/b')),
76
- File.expand_path(File.join(public_path, 'c/d')),
77
- File.expand_path(File.join(public_path, 'e/f'))
78
- ]
79
- a, b, c = *clean.send(:expand_paths, 'a/b', 'c/d', 'e/f')
80
- a.should == expected.first
81
- b.should == expected.second
82
- c.should == expected.last
83
- end
84
-
85
- it "should expand absolute paths to include the public directory" do
86
- clean = Snatch::Clean.new('file_name')
87
- public_path = Snatch::PUBLIC_PATH
88
- expected = [
89
- File.expand_path(File.join(public_path, '/a/b'))
90
- ]
91
- clean.send(:expand_paths, '/a/b').should == expected
92
- end
9
+ it 'should update CSS and HTML' do
10
+ @clean.instance_variable_set(:@doc, 'nokogiri')
11
+ Snatch::Clean::CSS.should_receive(:update).with('nokogiri', 'public')
12
+ Snatch::Clean::HTML.should_receive(:update).with('nokogiri', 'public')
13
+ @clean.process
93
14
  end
94
15
  end
data/spec/snatch_spec.rb CHANGED
@@ -1,7 +1,4 @@
1
1
  require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
2
2
 
3
3
  describe "Snatch" do
4
- it "fails" do
5
- fail "hey buddy, you should probably rename this file and start specing for real"
6
- end
7
4
  end
data/spec/spec_helper.rb CHANGED
@@ -4,6 +4,14 @@ require 'snatch'
4
4
  require 'spec'
5
5
  require 'spec/autorun'
6
6
 
7
+ Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each { |f| require f }
8
+
7
9
  Spec::Runner.configure do |config|
8
10
 
9
11
  end
12
+
13
+ def fix_node(method, xhtml)
14
+ node = Nokogiri::XML(xhtml).children.first
15
+ subject.send method, node
16
+ yield node
17
+ end
@@ -0,0 +1,36 @@
1
+ Spec::Matchers.define :have_href do |expected|
2
+ match do |actual|
3
+ expected.should == actual['href']
4
+ end
5
+
6
+ failure_message_for_should do |actual|
7
+ "expected href to equal #{expected} but got #{actual['href']}"
8
+ end
9
+
10
+ failure_message_for_should_not do |actual|
11
+ "expected href to not equal #{expected}"
12
+ end
13
+
14
+ description do
15
+ "be equal to #{expected}"
16
+ end
17
+ end
18
+
19
+ Spec::Matchers.define :have_src do |expected|
20
+ match do |actual|
21
+ expected.should == actual['src']
22
+ end
23
+
24
+ failure_message_for_should do |actual|
25
+ "expected src to equal #{expected} but got #{actual['src']}"
26
+ end
27
+
28
+ failure_message_for_should_not do |actual|
29
+ "expected src to not equal #{expected}"
30
+ end
31
+
32
+ description do
33
+ "be equal to #{expected}"
34
+ end
35
+ end
36
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: snatch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Conroy-Finn
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2010-02-10 00:00:00 +00:00
12
+ date: 2010-02-15 00:00:00 +00:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
@@ -42,6 +42,7 @@ extra_rdoc_files:
42
42
  - LICENSE
43
43
  - README.rdoc
44
44
  files:
45
+ - .autotest
45
46
  - .document
46
47
  - .gitignore
47
48
  - LICENSE
@@ -51,11 +52,16 @@ files:
51
52
  - lib/extensions.rb
52
53
  - lib/snatch.rb
53
54
  - lib/snatch/clean.rb
55
+ - lib/snatch/clean/css.rb
56
+ - lib/snatch/clean/html.rb
54
57
  - snatch.gemspec
58
+ - spec/snatch/clean/css_spec.rb
59
+ - spec/snatch/clean/html_spec.rb
55
60
  - spec/snatch/clean_spec.rb
56
61
  - spec/snatch_spec.rb
57
62
  - spec/spec.opts
58
63
  - spec/spec_helper.rb
64
+ - spec/support/matchers/nokogiri.rb
59
65
  has_rdoc: true
60
66
  homepage: http://github.com/jcf/snatch
61
67
  licenses: []
@@ -85,6 +91,9 @@ signing_key:
85
91
  specification_version: 3
86
92
  summary: wget your site and replace any nasty PHP CSS files
87
93
  test_files:
94
+ - spec/snatch/clean/css_spec.rb
95
+ - spec/snatch/clean/html_spec.rb
88
96
  - spec/snatch/clean_spec.rb
89
97
  - spec/snatch_spec.rb
90
98
  - spec/spec_helper.rb
99
+ - spec/support/matchers/nokogiri.rb