snatch 0.0.10 → 1.0.0

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