sitediff 0.0.2 → 1.1.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,82 +1,94 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'webrick'
2
4
 
3
5
  class SiteDiff
4
- class Webserver
5
- # Simple webserver for testing purposes
6
- DEFAULT_PORT = 13080
7
-
8
- attr_accessor :ports
9
-
10
- # Serve a list of directories
11
- def initialize(start_port, dirs, opts = {})
12
- start_port ||= DEFAULT_PORT
13
- @ports = (start_port...(start_port + dirs.size)).to_a
14
- @dirs = dirs
15
- @opts = opts
16
-
17
- setup
18
- start_servers
19
-
20
- if block_given?
21
- yield self
22
- kill
23
- end
24
- end
25
-
26
- def kill
27
- @threads.each { |t| t.kill }
28
- end
29
-
30
- def wait
31
- @threads.each { |t| t.join }
32
- end
33
-
34
- def uris
35
- ports.map { |p| "http://localhost:#{p}" }
36
- end
37
-
38
- protected
39
- def setup
40
- @server_opts = {}
41
- if @opts[:quiet]
42
- @server_opts[:Logger] = WEBrick::Log.new(IO::NULL)
43
- @server_opts[:AccessLog] = []
44
- end
45
- end
46
-
47
- def server(opts)
48
- WEBrick::HTTPServer.new(opts)
49
- end
50
-
51
- def start_servers
52
- @threads = []
53
- @dirs.each_with_index do |dir, idx|
54
- @server_opts[:Port] = @ports[idx]
55
- @server_opts[:DocumentRoot] = dir
56
- srv = server(@server_opts)
57
- @threads << Thread.new { srv.start }
6
+ # SiteDiff Web Server.
7
+ class Webserver
8
+ # Simple web server for testing purposes.
9
+ DEFAULT_PORT = 13_080
10
+
11
+ attr_accessor :ports
12
+
13
+ ##
14
+ # Serve a list of directories.
15
+ def initialize(start_port, dirs, opts = {})
16
+ start_port ||= DEFAULT_PORT
17
+ @ports = (start_port...(start_port + dirs.size)).to_a
18
+ @dirs = dirs
19
+ @opts = opts
20
+
21
+ setup
22
+ start_servers
23
+
24
+ if block_given?
25
+ yield self
26
+ kill
27
+ end
28
+ end
29
+
30
+ ##
31
+ # Kills the server.
32
+ def kill
33
+ @threads.each(&:kill)
34
+ end
35
+
36
+ ##
37
+ # Waits for the server.
38
+ def wait
39
+ @threads.each(&:join)
40
+ end
41
+
42
+ ##
43
+ # Maps URIs to defined ports and returns a list of URIs.
44
+ def uris
45
+ ports.map { |p| "http://localhost:#{p}" }
46
+ end
47
+
48
+ protected
49
+
50
+ def setup
51
+ @server_opts = {}
52
+ if @opts[:quiet]
53
+ @server_opts[:Logger] = WEBrick::Log.new(IO::NULL)
54
+ @server_opts[:AccessLog] = []
55
+ end
56
+ end
57
+
58
+ def server(opts)
59
+ WEBrick::HTTPServer.new(opts)
60
+ end
61
+
62
+ def start_servers
63
+ @threads = []
64
+ @dirs.each_with_index do |dir, idx|
65
+ @server_opts[:Port] = @ports[idx]
66
+ @server_opts[:DocumentRoot] = dir
67
+ srv = server(@server_opts)
68
+ @threads << Thread.new { srv.start }
69
+ end
70
+ end
71
+
72
+ public
73
+
74
+ # SiteDiff Fixture Server.
75
+ class FixtureServer < Webserver
76
+ PORT = DEFAULT_PORT + 1
77
+ BASE = 'spec/sites/ruby-doc.org'
78
+ NAMES = %w[core-1.9.3 core-2.0].freeze
79
+
80
+ def initialize(port = PORT, base = BASE, names = NAMES)
81
+ dirs = names.map { |n| File.join(base, n) }
82
+ super(port, dirs, quiet: true)
83
+ end
84
+
85
+ def before
86
+ uris.first
87
+ end
88
+
89
+ def after
90
+ uris.last
91
+ end
92
+ end
58
93
  end
59
94
  end
60
-
61
- public
62
-
63
- class FixtureServer < Webserver
64
- PORT = DEFAULT_PORT + 1
65
- BASE = 'spec/fixtures/ruby-doc.org'
66
- NAMES = %w[core-1.9.3 core-2.0]
67
-
68
- def initialize(port = PORT, base = BASE, names = NAMES)
69
- dirs = names.map { |n| File.join(base, n) }
70
- super(port, dirs, :quiet => true)
71
- end
72
-
73
- def before
74
- uris.first
75
- end
76
- def after
77
- uris.last
78
- end
79
- end
80
-
81
- end
82
- end
@@ -1,98 +1,134 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'sitediff'
4
+ require 'sitediff/report'
2
5
  require 'sitediff/webserver'
3
6
  require 'erb'
4
7
 
5
8
  class SiteDiff
6
- class Webserver
7
- class ResultServer < Webserver
8
- # Display a page from the cache
9
- class CacheServlet < WEBrick::HTTPServlet::AbstractServlet
10
- def initialize(server, cache)
11
- @cache = cache
12
- end
9
+ class Webserver
10
+ # SiteDiff Result Server.
11
+ class ResultServer < Webserver
12
+ # Display a page from the cache
13
+ class CacheServlet < WEBrick::HTTPServlet::AbstractServlet
14
+ ##
15
+ # Creates a Cache Servlet.
16
+ def initialize(_server, cache)
17
+ @cache = cache
18
+ end
13
19
 
14
- def do_GET(req, res)
15
- path = req.path_info
16
- md = %r[^/([^/]+)(/.*)$].match(path) or
17
- raise WEBrick::HTTPStatus::NotFound
18
- tag, path = *md.captures
19
- r = @cache.get(tag.to_sym, path) or
20
- raise WEBrick::HTTPStatus::NotFound
20
+ ##
21
+ # Performs a GET request.
22
+ def do_GET(req, res)
23
+ path = req.path_info
24
+ (md = %r{^/([^/]+)(/.*)$}.match(path)) ||
25
+ raise(WEBrick::HTTPStatus::NotFound)
26
+ tag, path = *md.captures
27
+ (r = @cache.get(tag.to_sym, path)) ||
28
+ raise(WEBrick::HTTPStatus::NotFound)
21
29
 
22
- raise WEBrick::HTTPStatus[r.error_code] if r.error_code
23
- raise WEBrick::HTTPStatus::InternalServerError, r.error if r.error
30
+ raise WEBrick::HTTPStatus[r.error_code] if r.error_code
31
+ raise WEBrick::HTTPStatus::InternalServerError, r.error if r.error
24
32
 
25
- res['content-type'] = 'text/html'
26
- res.body = r.content
27
- end
28
- end
33
+ res['content-type'] = 'text/html'
34
+ res.body = r.content
35
+ end
36
+ end
29
37
 
30
- # Display two pages side by side
31
- class SideBySideServlet < WEBrick::HTTPServlet::AbstractServlet
32
- def initialize(server, cache, settings)
33
- @cache = cache
34
- @settings = settings
35
- end
38
+ ##
39
+ # Display two pages side by side.
40
+ class SideBySideServlet < WEBrick::HTTPServlet::AbstractServlet
41
+ ##
42
+ # Creates a Side By Side Servlet.
43
+ def initialize(_server, cache, settings)
44
+ @cache = cache
45
+ @settings = settings
46
+ end
36
47
 
37
- def urls(path)
38
- %w[before after].map do |tag|
39
- base = @settings[tag]
40
- base = "/cache/#{tag}" if @settings['cached'].include? tag
41
- base + path
42
- end
43
- end
48
+ ##
49
+ # Generates URLs for a given path.
50
+ def urls(path)
51
+ %w[before after].map do |tag|
52
+ base = @settings[tag]
53
+ base = "/cache/#{tag}" if @settings['cached'].include? tag
54
+ base + path
55
+ end
56
+ end
44
57
 
45
- def do_GET(req, res)
46
- path = req.path_info
47
- before, after = *urls(path)
58
+ ##
59
+ # Performs a GET request.
60
+ def do_GET(req, res)
61
+ path = req.path_info
62
+ before, after = *urls(path)
48
63
 
49
- res['content-type'] = 'text/html'
50
- erb = File.join(SiteDiff::FILES_DIR, 'sidebyside.html.erb')
51
- res.body = ERB.new(File.read(erb)).result(binding)
52
- end
53
- end
64
+ res['content-type'] = 'text/html'
65
+ erb = File.join(SiteDiff::FILES_DIR, 'sidebyside.html.erb')
66
+ res.body = ERB.new(File.read(erb)).result(binding)
67
+ end
68
+ end
54
69
 
55
- def initialize(port, dir, opts = {})
56
- @settings = YAML.load_file(File.join(dir, SiteDiff::SETTINGS_FILE))
57
- @cache = opts[:cache]
58
- super(port, [dir], opts)
59
- end
70
+ ##
71
+ # Creates a Result Server.
72
+ def initialize(port, dir, opts = {})
73
+ unless File.exist?(File.join(dir, Report::SETTINGS_FILE))
74
+ raise SiteDiffException,
75
+ "Please run 'sitediff diff' before running 'sitediff serve'"
76
+ end
60
77
 
61
- def server(opts)
62
- dir = opts.delete(:DocumentRoot)
63
- srv = super(opts)
64
- srv.mount_proc('/') do |req, res|
65
- res.set_redirect(WEBrick::HTTPStatus::Found,
66
- "/files/#{SiteDiff::REPORT_FILE}")
67
- end
78
+ @settings = YAML.load_file(File.join(dir, Report::SETTINGS_FILE))
79
+ puts @settings
80
+ @cache = opts[:cache]
81
+ super(port, [dir], opts)
82
+ end
68
83
 
69
- srv.mount('/files', WEBrick::HTTPServlet::FileHandler, dir, true)
70
- srv.mount('/cache', CacheServlet, @cache)
71
- srv.mount('/sidebyside', SideBySideServlet, @cache, @settings)
72
- return srv
73
- end
84
+ ##
85
+ # TODO: Document what this method does.
86
+ def server(opts)
87
+ dir = opts.delete(:DocumentRoot)
88
+ srv = super(opts)
89
+ srv.mount_proc('/') do |req, res|
90
+ if req.path == '/'
91
+ res.set_redirect(WEBrick::HTTPStatus::Found,
92
+ "/files/#{Report::REPORT_FILE_HTML}")
93
+ else
94
+ res.set_redirect(WEBrick::HTTPStatus::TemporaryRedirect,
95
+ "#{@settings['after']}#{req.path}")
96
+ end
97
+ end
74
98
 
75
- def setup
76
- super
77
- root = uris.first
78
- puts "Serving at #{root}"
79
- open_in_browser(root) if @opts[:browse]
80
- end
99
+ srv.mount('/files', WEBrick::HTTPServlet::FileHandler, dir, true)
100
+ srv.mount('/cache', CacheServlet, @cache)
101
+ srv.mount('/sidebyside', SideBySideServlet, @cache, @settings)
102
+ srv
103
+ end
81
104
 
82
- def open_in_browser(url)
83
- commands = %w[xdg-open open]
84
- cmd = commands.find { |c| which(c) }
85
- system(cmd, url) if cmd
86
- return cmd
87
- end
105
+ ##
106
+ # Sets up the server.
107
+ def setup
108
+ super
109
+ root = uris.first
110
+ puts "Serving at #{root}"
111
+ open_in_browser(root) if @opts[:browse]
112
+ end
113
+
114
+ ##
115
+ # Opens a URL in a browser.
116
+ def open_in_browser(url)
117
+ commands = %w[xdg-open open]
118
+ cmd = commands.find { |c| which(c) }
119
+ system(cmd, url) if cmd
120
+ cmd
121
+ end
88
122
 
89
- def which(cmd)
90
- ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
91
- file = File.join(path, cmd)
92
- return file if File.executable?(file)
123
+ ##
124
+ # TODO: Document what this method does.
125
+ def which(cmd)
126
+ ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
127
+ file = File.join(path, cmd)
128
+ return file if File.executable?(file)
129
+ end
130
+ nil
131
+ end
93
132
  end
94
- return nil
95
133
  end
96
134
  end
97
- end
98
- end
metadata CHANGED
@@ -1,176 +1,192 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sitediff
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
5
- prerelease:
4
+ version: 1.1.1
6
5
  platform: ruby
7
6
  authors:
8
7
  - Alex Dergachev
9
8
  - Amir Kadivar
10
9
  - Dave Vasilevsky
11
- autorequire:
10
+ autorequire:
12
11
  bindir: bin
13
12
  cert_chain: []
14
- date: 2015-05-05 00:00:00.000000000 Z
13
+ date: 2020-08-06 00:00:00.000000000 Z
15
14
  dependencies:
16
15
  - !ruby/object:Gem::Dependency
17
- name: thor
16
+ name: pkg-config
18
17
  requirement: !ruby/object:Gem::Requirement
19
- none: false
20
18
  requirements:
21
- - - ! '>='
19
+ - - "~>"
22
20
  - !ruby/object:Gem::Version
23
- version: '0'
21
+ version: '1.1'
24
22
  type: :runtime
25
23
  prerelease: false
26
24
  version_requirements: !ruby/object:Gem::Requirement
27
- none: false
28
25
  requirements:
29
- - - ! '>='
26
+ - - "~>"
30
27
  - !ruby/object:Gem::Version
31
- version: '0'
28
+ version: '1.1'
32
29
  - !ruby/object:Gem::Dependency
33
- name: nokogiri
30
+ name: minitar
34
31
  requirement: !ruby/object:Gem::Requirement
35
- none: false
36
32
  requirements:
37
- - - ! '>='
33
+ - - "~>"
38
34
  - !ruby/object:Gem::Version
39
- version: '0'
35
+ version: '0.9'
40
36
  type: :runtime
41
37
  prerelease: false
42
38
  version_requirements: !ruby/object:Gem::Requirement
43
- none: false
44
39
  requirements:
45
- - - ! '>='
40
+ - - "~>"
46
41
  - !ruby/object:Gem::Version
47
- version: '0'
42
+ version: '0.9'
48
43
  - !ruby/object:Gem::Dependency
49
- name: diffy
44
+ name: thor
50
45
  requirement: !ruby/object:Gem::Requirement
51
- none: false
52
46
  requirements:
53
- - - ! '>='
47
+ - - "~>"
54
48
  - !ruby/object:Gem::Version
55
- version: '0'
49
+ version: 0.20.0
56
50
  type: :runtime
57
51
  prerelease: false
58
52
  version_requirements: !ruby/object:Gem::Requirement
59
- none: false
60
53
  requirements:
61
- - - ! '>='
54
+ - - "~>"
62
55
  - !ruby/object:Gem::Version
63
- version: '0'
56
+ version: 0.20.0
64
57
  - !ruby/object:Gem::Dependency
65
58
  name: typhoeus
66
59
  requirement: !ruby/object:Gem::Requirement
67
- none: false
68
60
  requirements:
69
- - - ! '>='
61
+ - - "~>"
70
62
  - !ruby/object:Gem::Version
71
- version: '0'
63
+ version: '1.0'
72
64
  type: :runtime
73
65
  prerelease: false
74
66
  version_requirements: !ruby/object:Gem::Requirement
75
- none: false
76
67
  requirements:
77
- - - ! '>='
68
+ - - "~>"
78
69
  - !ruby/object:Gem::Version
79
- version: '0'
70
+ version: '1.0'
80
71
  - !ruby/object:Gem::Dependency
81
72
  name: rainbow
82
73
  requirement: !ruby/object:Gem::Requirement
83
- none: false
84
74
  requirements:
85
- - - ! '>='
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: 3.0.0
78
+ type: :runtime
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: 3.0.0
85
+ - !ruby/object:Gem::Dependency
86
+ name: nokogiri
87
+ requirement: !ruby/object:Gem::Requirement
88
+ requirements:
89
+ - - ">="
86
90
  - !ruby/object:Gem::Version
87
- version: '0'
91
+ version: 1.10.4
88
92
  type: :runtime
89
93
  prerelease: false
90
94
  version_requirements: !ruby/object:Gem::Requirement
91
- none: false
92
95
  requirements:
93
- - - ! '>='
96
+ - - ">="
94
97
  - !ruby/object:Gem::Version
95
- version: '0'
98
+ version: 1.10.4
96
99
  - !ruby/object:Gem::Dependency
97
100
  name: addressable
98
101
  requirement: !ruby/object:Gem::Requirement
99
- none: false
100
102
  requirements:
101
- - - ! '>='
103
+ - - "~>"
102
104
  - !ruby/object:Gem::Version
103
- version: '0'
105
+ version: 2.5.2
104
106
  type: :runtime
105
107
  prerelease: false
106
108
  version_requirements: !ruby/object:Gem::Requirement
107
- none: false
108
109
  requirements:
109
- - - ! '>='
110
+ - - "~>"
110
111
  - !ruby/object:Gem::Version
111
- version: '0'
112
- description: ! 'SiteDiff makes it easy to see differences between two versions of
112
+ version: 2.5.2
113
+ - !ruby/object:Gem::Dependency
114
+ name: diffy
115
+ requirement: !ruby/object:Gem::Requirement
116
+ requirements:
117
+ - - "~>"
118
+ - !ruby/object:Gem::Version
119
+ version: 3.3.0
120
+ type: :runtime
121
+ prerelease: false
122
+ version_requirements: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - "~>"
125
+ - !ruby/object:Gem::Version
126
+ version: 3.3.0
127
+ description: " SiteDiff makes it easy to see differences between two versions of
113
128
  a website. It accepts a set of paths to compare two versions of the site together
114
129
  with potential normalization/sanitization rules. From the provided paths and configuration
115
130
  SiteDiff generates an HTML report of all the status of HTML comparison between the
116
131
  given paths together with a readable diff-like HTML for each specified path containing
117
132
  the differences between the two versions of the site. It is useful tool for QAing
118
- re-deployments, site upgrades, etc.
119
-
120
- '
133
+ re-deployments, site upgrades, etc.\n"
121
134
  email: alex@evolvingweb.ca
122
135
  executables:
123
136
  - sitediff
124
137
  extensions: []
125
138
  extra_rdoc_files: []
126
139
  files:
140
+ - bin/sitediff
127
141
  - lib/sitediff.rb
128
- - lib/sitediff/crawler.rb
129
- - lib/sitediff/sanitize/dom_transform.rb
130
- - lib/sitediff/sanitize/regexp.rb
131
- - lib/sitediff/config/creator.rb
132
- - lib/sitediff/cli.rb
133
- - lib/sitediff/fetch.rb
134
- - lib/sitediff/exception.rb
142
+ - lib/sitediff/api.rb
135
143
  - lib/sitediff/cache.rb
144
+ - lib/sitediff/cli.rb
136
145
  - lib/sitediff/config.rb
137
- - lib/sitediff/uriwrapper.rb
138
- - lib/sitediff/result.rb
139
- - lib/sitediff/sanitize.rb
140
- - lib/sitediff/webserver/resultserver.rb
141
- - lib/sitediff/rules.rb
142
- - lib/sitediff/webserver.rb
146
+ - lib/sitediff/config/creator.rb
147
+ - lib/sitediff/config/preset.rb
148
+ - lib/sitediff/crawler.rb
143
149
  - lib/sitediff/diff.rb
150
+ - lib/sitediff/exception.rb
151
+ - lib/sitediff/fetch.rb
144
152
  - lib/sitediff/files/diff.html.erb
153
+ - lib/sitediff/files/jquery.min.js
154
+ - lib/sitediff/files/normalize.css
155
+ - lib/sitediff/files/pretty_print.xsl
156
+ - lib/sitediff/files/report.html.erb
145
157
  - lib/sitediff/files/sidebyside.html.erb
146
158
  - lib/sitediff/files/sitediff.css
147
- - lib/sitediff/files/html_report.html.erb
148
- - lib/sitediff/files/pretty_print.xsl
149
- - lib/sitediff/files/rules/drupal.yaml
150
- - bin/sitediff
151
- homepage: https://github.com/evolvingweb/sitediff/
159
+ - lib/sitediff/files/sitediff.js
160
+ - lib/sitediff/report.rb
161
+ - lib/sitediff/result.rb
162
+ - lib/sitediff/sanitize.rb
163
+ - lib/sitediff/sanitize/dom_transform.rb
164
+ - lib/sitediff/sanitize/regexp.rb
165
+ - lib/sitediff/uriwrapper.rb
166
+ - lib/sitediff/webserver.rb
167
+ - lib/sitediff/webserver/resultserver.rb
168
+ homepage: https://sitediff.io/
152
169
  licenses:
153
- - GPL-2
154
- post_install_message:
170
+ - GPL-2.0
171
+ metadata:
172
+ source_code_uri: https://github.com/evolvingweb/sitediff
173
+ post_install_message:
155
174
  rdoc_options: []
156
175
  require_paths:
157
176
  - lib
158
177
  required_ruby_version: !ruby/object:Gem::Requirement
159
- none: false
160
178
  requirements:
161
- - - ! '>='
179
+ - - ">="
162
180
  - !ruby/object:Gem::Version
163
- version: 1.9.3
181
+ version: '2.6'
164
182
  required_rubygems_version: !ruby/object:Gem::Requirement
165
- none: false
166
183
  requirements:
167
- - - ! '>='
184
+ - - ">="
168
185
  - !ruby/object:Gem::Version
169
186
  version: '0'
170
187
  requirements: []
171
- rubyforge_project:
172
- rubygems_version: 1.8.23
173
- signing_key:
174
- specification_version: 3
188
+ rubygems_version: 3.1.2
189
+ signing_key:
190
+ specification_version: 4
175
191
  summary: Compare two versions of a site with ease!
176
192
  test_files: []