proxy_pac_rb 0.4.2 → 0.5.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.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +3 -3
  3. data/CONTRIBUTING.md +61 -0
  4. data/Gemfile +2 -2
  5. data/Gemfile.lock +6 -14
  6. data/README.md +319 -14
  7. data/Rakefile +2 -96
  8. data/features/init_proxy_pac.feature +47 -0
  9. data/features/resolve_proxy.feature +1 -1
  10. data/features/step_definitions.rb +11 -0
  11. data/lib/proxy_pac_rb/cli/compress_proxy_pac.rb +1 -1
  12. data/lib/proxy_pac_rb/cli/find_proxy.rb +2 -0
  13. data/lib/proxy_pac_rb/cli/init.rb +10 -0
  14. data/lib/proxy_pac_rb/cli/init_proxy_pac.rb +98 -0
  15. data/lib/proxy_pac_rb/cli/lint.rb +0 -1
  16. data/lib/proxy_pac_rb/cli/lint_proxy_pac.rb +0 -1
  17. data/lib/proxy_pac_rb/cli/runner.rb +3 -0
  18. data/lib/proxy_pac_rb/environment.rb +13 -10
  19. data/lib/proxy_pac_rb/errors.rb +4 -0
  20. data/lib/proxy_pac_rb/javascript_compiler.rb +29 -0
  21. data/lib/proxy_pac_rb/main.rb +6 -0
  22. data/lib/proxy_pac_rb/parser.rb +2 -7
  23. data/lib/proxy_pac_rb/proxy_pac_file.rb +53 -5
  24. data/lib/proxy_pac_rb/proxy_pac_linter.rb +11 -5
  25. data/lib/proxy_pac_rb/proxy_pac_loader.rb +38 -5
  26. data/lib/proxy_pac_rb/proxy_pac_parser.rb +9 -21
  27. data/lib/proxy_pac_rb/rack/proxy_pac_compressor.rb +3 -3
  28. data/lib/proxy_pac_rb/rack/proxy_pac_linter.rb +3 -3
  29. data/lib/proxy_pac_rb/rspec/helpers/.keep +0 -0
  30. data/lib/proxy_pac_rb/rspec/helpers.rb +52 -0
  31. data/lib/proxy_pac_rb/rspec/matchers/.keep +0 -0
  32. data/lib/proxy_pac_rb/rspec/matchers/proxy.rb +23 -0
  33. data/lib/proxy_pac_rb/rspec/matchers/url.rb +13 -0
  34. data/lib/proxy_pac_rb/rspec/shared_contexts/.keep +0 -0
  35. data/lib/proxy_pac_rb/rspec/shared_examples/.keep +0 -0
  36. data/lib/proxy_pac_rb/rspec.rb +18 -0
  37. data/lib/proxy_pac_rb/version.rb +1 -1
  38. data/lib/proxy_pac_rb.rb +5 -1
  39. data/script/config.ru +8 -0
  40. data/spec/api/proxy_pac_compressor_spec.rb +31 -0
  41. data/spec/api/proxy_pac_dumper_spec.rb +67 -0
  42. data/spec/api/proxy_pac_file_spec.rb +90 -0
  43. data/spec/api/proxy_pac_linter_spec.rb +61 -0
  44. data/spec/api/proxy_pac_loader_spec.rb +88 -0
  45. data/spec/api/proxy_pac_parser_spec.rb +56 -0
  46. data/spec/environment_spec.rb +121 -78
  47. data/spec/parser_spec.rb +1 -1
  48. data/spec/rspec/compare_proxy_pac_files_spec.rb +62 -0
  49. data/spec/rspec/parse_proxy_pac_spec.rb +88 -0
  50. data/spec/rspec/readability_spec.rb +57 -0
  51. data/spec/rspec/rspec_spec.rb +7 -0
  52. data/spec/rspec/validitiy_spec.rb +48 -0
  53. data/spec/support/aruba.rb +0 -27
  54. data/spec/support/shared_examples/loader.rb +27 -0
  55. data/templates/build/middleman/config.rb +12 -0
  56. data/templates/build/middleman/script/build +2 -0
  57. data/templates/build/middleman/source/.keep +0 -0
  58. data/templates/default/.gitignore +24 -0
  59. data/templates/default/Gemfile +3 -0
  60. data/templates/default/Rakefile +1 -0
  61. data/templates/default/script/bootstrap +22 -0
  62. data/templates/new_proxy_pac.pac.erb +3 -0
  63. data/templates/test_framework/rspec/spec_helper.rb +9 -0
  64. data/templates/test_framework/rspec/support/aruba.rb +23 -0
  65. data/templates/test_framework/rspec/support/matchers/shared_contexts/.keep +0 -0
  66. data/templates/test_framework/rspec/support/proxy_pac_rb.rb +1 -0
  67. data/templates/test_framework/rspec/support/rspec.rb +20 -0
  68. data/templates/test_framework/rspec/support/shared_contexts/.keep +0 -0
  69. data/templates/test_framework/rspec/support/shared_examples/.keep +0 -0
  70. metadata +56 -6
  71. data/lib/proxy_pac_rb/proxy_pac.rb +0 -24
  72. data/script/test_web +0 -16
  73. data/spec/api_spec.rb +0 -207
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1965713a0aecec2df86db7b6b214469d6b8b19a3
4
- data.tar.gz: d74100e8339ad216ee5ab2d2d06036478e56a59d
3
+ metadata.gz: af8baea71f58817f9cdb5f272ee6c185562b178f
4
+ data.tar.gz: 7ead5006f6d5957b9fa9dd1c317d7668daec7e69
5
5
  SHA512:
6
- metadata.gz: e88fc56a91184d502bbfdaa926ec0baba657051d77b788cabbc3d8ca91c893bdec5edeffb8a5ee07f5d6b2062e1e9e639492a1a866b3ec1a5522ad101d101c01
7
- data.tar.gz: 64ce7df70bf552e6f5c8702960a35fb7f2f6ef8aaff9911c4f7d4bd97cb6dc8b446ac3277ff4a193ba3db831eef9f463a90867574425114e73e74a1b8e35923c
6
+ metadata.gz: fa68a759f58f146e000ed26a9778bccdac7dc31787ec1e101152dab623050ffc211bfb7342347b48ef51ec8b3a26b6dc40323d82811f27852f1e25f06ba2c633
7
+ data.tar.gz: fc862d9c7899ad8d9bf4c756895df016f3a16990e71d99a758fc5df1b20d15496b3bb036b7fd03859818f5f26b2153e4b494e6f66c4d0f63588a3921bf7426c3
data/.rubocop.yml CHANGED
@@ -14,6 +14,9 @@ Metrics/LineLength:
14
14
  Metrics/ParameterLists:
15
15
  Max: 6
16
16
 
17
+ Style/CaseEquality:
18
+ Enabled: false
19
+
17
20
  Metrics/BlockNesting:
18
21
  Max: 4
19
22
 
@@ -31,9 +34,6 @@ Metrics/MethodLength:
31
34
  Metrics/PerceivedComplexity:
32
35
  Max: 8
33
36
 
34
- Style/RegexpLiteral:
35
- MaxSlashes: 0
36
-
37
37
  # Configuration parameters: EnforcedStyle, SupportedStyles.
38
38
  Style/MethodName:
39
39
  Exclude:
data/CONTRIBUTING.md ADDED
@@ -0,0 +1,61 @@
1
+ # Contributing
2
+
3
+ In the spirit of [free software][free-sw], **everyone** is encouraged to help
4
+ improve this project.
5
+
6
+ [free-sw]: http://www.fsf.org/licensing/essays/free-sw.html
7
+
8
+ Here are some ways *you* can contribute:
9
+
10
+ * by using alpha, beta, and prerelease versions
11
+ * by reporting bugs
12
+ * by suggesting new features
13
+ * by writing or editing documentation
14
+ * by writing specifications
15
+ * by writing code ( **no patch is too small** : fix typos, add comments, clean up inconsistent whitespace )
16
+ * by refactoring code
17
+ * by closing [issues][]
18
+ * by reviewing patches
19
+
20
+ [issues]: https://github.com/fedux-org/proxy_pac_rb/issues
21
+
22
+ ## Submitting an Issue
23
+
24
+ We use the [GitHub issue tracker][issues] to track bugs and features. Before
25
+ submitting a bug report or feature request, check to make sure it hasn't
26
+ already been submitted.
27
+
28
+ When submitting a bug report, please include a [Gist][] that includes a *stack
29
+ trace* and any details that may be necessary to reproduce the bug, including
30
+ your *gem version*, *Ruby version*, and *operating system*. Ideally, a bug report
31
+ should include a pull request with failing specs.
32
+
33
+ [gist]: https://gist.github.com/
34
+
35
+ ## Submitting a Pull Request
36
+
37
+ 1. [Fork the repository.][fork]
38
+ 2. Create a topic [branch]. `git checkout -b local_topic_branch`
39
+ 3. Add specs for your unimplemented feature or bug fix.
40
+ 4. Run `bundle exec rake test`. If your specs pass, return to step 3.
41
+ 5. Implement your feature or bug fix.
42
+ 6. Run `bundle exec rake test`. If your specs fail, return to step 5.
43
+ 7. Add, commit, and push your changes. To push your topic branch use `git push -u origin local_topic_branch`.
44
+ 8. [Submit a pull request.][pr]
45
+
46
+ Here are some reasons why a pull request may not be merged:
47
+
48
+ 1. It hasn’t been reviewed.
49
+ 2. It doesn’t include specs for new functionality.
50
+ 3. It doesn’t include documentation for new functionality.
51
+ 4. It changes behavior without changing the relevant documentation, comments, or specs.
52
+ 5. It changes behavior of an existing public API, breaking backward compatibility.
53
+ 6. It breaks the tests on a supported platform.
54
+ 7. It doesn’t merge cleanly (requiring Git rebasing and conflict resolution).
55
+
56
+ Include this emoji in the top of your ticket to signal to us that you read this
57
+ file: :memo:
58
+
59
+ [fork]: http://help.github.com/fork-a-repo/
60
+ [branch]: https://help.github.com/articles/fork-a-repo#create-branches
61
+ [pr]: http://help.github.com/send-pull-requests/
data/Gemfile CHANGED
@@ -9,8 +9,8 @@ group :debug do
9
9
 
10
10
  gem 'pry-doc', require: false
11
11
  gem 'pry-stack_explorer', require: false
12
- gem 'pry-exception_explorer', require: false
13
- gem 'pry-rescue', require: false
12
+ # gem 'pry-exception_explorer', require: false
13
+ # gem 'pry-rescue', require: false
14
14
  gem 'pry-byebug', require: false
15
15
  end
16
16
 
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- proxy_pac_rb (0.4.1)
4
+ proxy_pac_rb (0.4.2)
5
5
  activesupport
6
6
  addressable
7
7
  uglifier
@@ -28,7 +28,7 @@ GEM
28
28
  debug_inspector (>= 0.0.1)
29
29
  blockenspiel (0.4.5)
30
30
  builder (3.2.2)
31
- byebug (4.0.4)
31
+ byebug (4.0.5)
32
32
  columnize (= 0.9.0)
33
33
  childprocess (0.5.5)
34
34
  ffi (~> 1.0, >= 1.0.11)
@@ -38,7 +38,7 @@ GEM
38
38
  activesupport
39
39
  smart_colored
40
40
  xml-simple
41
- coveralls (0.7.12)
41
+ coveralls (0.8.0)
42
42
  multi_json (~> 1.10)
43
43
  rest-client (>= 1.6.8, < 2)
44
44
  simplecov (~> 0.9.1)
@@ -61,7 +61,7 @@ GEM
61
61
  domain_name (0.5.23)
62
62
  unf (>= 0.0.5, < 1.0.0)
63
63
  erubis (2.7.0)
64
- execjs (2.4.0)
64
+ execjs (2.5.0)
65
65
  fedux_org-stdlib (0.7.33)
66
66
  activesupport
67
67
  ffi (1.9.8)
@@ -86,7 +86,6 @@ GEM
86
86
  sparkr (>= 0.2.0)
87
87
  term-ansicolor
88
88
  yard (~> 0.8.7.5)
89
- interception (0.5)
90
89
  json (1.8.2)
91
90
  launchy (2.4.3)
92
91
  addressable (~> 2.3)
@@ -116,11 +115,6 @@ GEM
116
115
  pry-doc (0.6.0)
117
116
  pry (~> 0.9)
118
117
  yard (~> 0.8)
119
- pry-exception_explorer (0.2.3)
120
- pry-stack_explorer (>= 0.4.6)
121
- pry-rescue (1.4.1)
122
- interception (>= 0.5)
123
- pry
124
118
  pry-stack_explorer (0.4.9.2)
125
119
  binding_of_caller (>= 0.7)
126
120
  pry (>= 0.9.11)
@@ -150,7 +144,7 @@ GEM
150
144
  diff-lcs (>= 1.2.0, < 2.0)
151
145
  rspec-support (~> 3.2.0)
152
146
  rspec-support (3.2.2)
153
- rubocop (0.29.1)
147
+ rubocop (0.30.0)
154
148
  astrolabe (~> 1.3)
155
149
  parser (>= 2.2.0.1, < 3.0)
156
150
  powerpack (~> 0.1)
@@ -196,7 +190,7 @@ GEM
196
190
  unf_ext (0.0.6)
197
191
  versionomy (0.4.4)
198
192
  blockenspiel (>= 0.4.5)
199
- webmock (1.20.4)
193
+ webmock (1.21.0)
200
194
  addressable (>= 2.3.6)
201
195
  crack (>= 0.3.2)
202
196
  xml-simple (1.1.5)
@@ -227,8 +221,6 @@ DEPENDENCIES
227
221
  pry
228
222
  pry-byebug
229
223
  pry-doc
230
- pry-exception_explorer
231
- pry-rescue
232
224
  pry-stack_explorer
233
225
  rack
234
226
  rack-test
data/README.md CHANGED
@@ -70,7 +70,7 @@ pprb find proxy -c 127.0.0.1 -t "2014-03-09 12:00:00" -p sample.pac -u https://g
70
70
  You can compress a proxy.pac with `pprb` to reduce the amount of data
71
71
  transferred to download the proxy.pac.
72
72
 
73
- ```
73
+ ```bash
74
74
  # Download pac
75
75
  curl -L -o sample.pac https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample.pac
76
76
 
@@ -82,7 +82,7 @@ pprb compress proxy_pac -p sample.pac
82
82
 
83
83
  You can lint a proxy.pac with `pprb` to check a proxy.pac before deploying it.
84
84
 
85
- ```
85
+ ```bash
86
86
  # Download pac
87
87
  curl -L -o sample.pac https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample.pac
88
88
 
@@ -90,10 +90,46 @@ curl -L -o sample.pac https://github.com/fedux-org/proxy_pac_rb/raw/master/files
90
90
  pprb lint proxy_pac -p sample.pac
91
91
  ```
92
92
 
93
- ### Rack-based servers
93
+ #### Init new proxy.pac
94
+
95
+ You can use the following command to start a new proxy.pac:
96
+
97
+ *Plain*
98
+
99
+ ```bash
100
+ pprb init proxy_pac
101
+ ```
102
+
103
+ *Add rspec*
104
+
105
+ To test your proxy.pac you can use `rspec`.
106
+
107
+ ```bash
108
+ pprb init proxy_pac --test rspec
94
109
  ```
95
110
 
96
- *Warning*
111
+ *Add middleman*
112
+
113
+ To build your proxy.pac you can use `middleman`.
114
+
115
+ ```bash
116
+ pprb init proxy_pac --build middleman
117
+ ```
118
+
119
+ ### "rack"-middleware
120
+
121
+ The middleware which comes with `proxy_pac_rb` is compliant with the
122
+ `rack`-specification - tested via
123
+ [`rack/lint`](https://github.com/rack/rack/blob/master/lib/rack/lint.rb) and
124
+ should work with every `rack`-compliant-server.
125
+
126
+ #### Prerequisites
127
+
128
+ Make sure the content is served with `"Content-Type":
129
+ 'application/x-ns-proxy-autoconfig'`. Otherwise the content is ignored by both
130
+ middlewares.
131
+
132
+ #### Warning
97
133
 
98
134
  The linter-`rack`-middleware needs to be activated before ANY other
99
135
  middleman-extension, `rack`-middleware or whatever framework you are using
@@ -122,18 +158,52 @@ Error
122
158
  There were errors during this build
123
159
  ```
124
160
 
125
- *Linter Middleware*
161
+
162
+ #### Linter Middleware
126
163
 
127
164
  ```ruby
128
165
  require 'proxy_pac_rb/rack/proxy_pac_linter'
129
166
  use ProxyPacRb::Rack::ProxyPacLinter
130
167
  ```
131
168
 
132
- *Compressor Middleware*
169
+ #### Compressor Middleware
133
170
 
134
171
  ```ruby
135
172
  require 'proxy_pac_rb/rack/proxy_pac_compressor'
136
173
  use ProxyPacRb::Rack::ProxyPacCompressor
174
+ ```
175
+
176
+ #### Using "rack"-middleware with "middleman"
177
+
178
+ If you want to use the `rack`-middleware with `middleman` look at the following
179
+ code snippet captured from the `middleman`-configuration file `config.rb`:
180
+
181
+ * `config.rb`:
182
+
183
+ ```ruby
184
+ # Important needs to come first
185
+ # See Warning above for a full explanation
186
+ require 'proxy_pac_rb/rack/proxy_pac_linter'
187
+ use ProxyPacRb::Rack::ProxyPacLinter
188
+
189
+ require 'proxy_pac_rb/rack/proxy_pac_compressor'
190
+ use ProxyPacRb::Rack::ProxyPacCompressor
191
+
192
+ # The middleware works on content served with
193
+ # "Content-Type" 'application/x-ns-proxy-autoconfig'
194
+ page "*.pac", content_type: 'application/x-ns-proxy-autoconfig'
195
+
196
+ # This provides an uncompressed copy of the proxy.pac to make it
197
+ # possible for your support to review it by hand
198
+ Dir.glob(File.join(source_dir, '**', '*.pac')).each do |f|
199
+ # Path should be relative to source dir
200
+ relative_path = Pathname.new(f).relative_path_from(Pathname.new(source_dir))
201
+
202
+ # "text/plain" prevents the middlewares to handle it
203
+ proxy(format('%s.raw', relative_path), relative_path.to_s, content_type: 'text/plain')
204
+ end
205
+
206
+ ```
137
207
 
138
208
  ### Ruby
139
209
 
@@ -142,7 +212,7 @@ use ProxyPacRb::Rack::ProxyPacCompressor
142
212
  ```ruby
143
213
  require 'proxy_pac_rb'
144
214
 
145
- file = ProxyPacRb::Parser.new.load('https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample.pac')
215
+ file = ProxyPacRb::Parser.new.parse('https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample.pac')
146
216
  file.find('https://github.com') # => "DIRECT"
147
217
  ```
148
218
 
@@ -155,7 +225,7 @@ curl -L -o sample.pac https://github.com/fedux-org/proxy_pac_rb/raw/master/files
155
225
  ```ruby
156
226
  require 'proxy_pac_rb'
157
227
 
158
- file = ProxyPacRb::Parser.new.read("sample.pac")
228
+ file = ProxyPacRb::Parser.new.parse("sample.pac")
159
229
  file.find('https://github.com') # => "DIRECT"
160
230
  ```
161
231
 
@@ -164,7 +234,7 @@ file.find('https://github.com') # => "DIRECT"
164
234
  ```ruby
165
235
  require 'proxy_pac_rb'
166
236
 
167
- file = ProxyPacRb::Parser.new.source <<-JS
237
+ file = ProxyPacRb::Parser.new.parse <<-JS
168
238
  function FindProxyForURL(url, host) {
169
239
  return "DIRECT";
170
240
  }
@@ -179,11 +249,11 @@ file.find('http://localhost') # => "DIRECT"
179
249
  require 'proxy_pac_rb'
180
250
 
181
251
  environment = ProxyPacRb::Environment.new(client_ip: '127.0.0.1')
182
- file = ProxyPacRb::Parser.new(environment).load('https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample2.pac')
252
+ file = ProxyPacRb::Parser.new(environment).parse('https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample2.pac')
183
253
  file.find('https://github.com') # => "PROXY localhost:8080"
184
254
 
185
255
  environment = ProxyPacRb::Environment.new(client_ip: '127.0.0.2')
186
- file = ProxyPacRb::Parser.new(environment).load('https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample2.pac')
256
+ file = ProxyPacRb::Parser.new(environment).parse('https://github.com/fedux-org/proxy_pac_rb/raw/master/files/sample2.pac')
187
257
  file.find('https://github.com') # => "DIRECT"
188
258
  ```
189
259
 
@@ -203,11 +273,11 @@ function FindProxyForURL(url, host) {
203
273
  EOS
204
274
 
205
275
  environment = ProxyPacRb::Environment.new(time: Time.parse('2014-07-06 12:00'))
206
- file = ProxyPacRb::Parser.new(environment).source(string)
276
+ file = ProxyPacRb::Parser.new(environment).parse(string)
207
277
  file.find('http://localhost') # => 'PROXY localhost:8080'
208
278
 
209
279
  environment = ProxyPacRb::Environment.new(time: Time.parse('2014-03-08 6:00'))
210
- file = ProxyPacRb::Parser.new(environment).source(string)
280
+ file = ProxyPacRb::Parser.new(environment).parse(string)
211
281
  file.find('http://localhost') # => 'DIRECT'
212
282
  ```
213
283
 
@@ -227,11 +297,246 @@ file.find('http://localhost') # => 'DIRECT'
227
297
  * timeRange(*args)
228
298
  * alert(msg) (output on stderr by default)
229
299
 
300
+ ## RSpec-integration
301
+
302
+ `proxy_pac_rb` comes with helpers and matchers for `rspec`. To make those
303
+ helpers and matchers available in your project, add this code snippet in your
304
+ project:
305
+
306
+ ```
307
+ require 'proxy_pac_rb/rspec'
308
+ ```
309
+
310
+ ### Helpers
311
+
312
+ * `proxy_pac`:
313
+
314
+ This helper makes a proxy.pac available. It requires a source for your
315
+ proxy.pac given in `subject { }` - e.g. a file, a string, or a url. It
316
+ represents a [`ProxyPacFile`](lib/proxy_pac_rb/proxy_pac_file.rb).
317
+
318
+ * `time`:
319
+
320
+ The `time`-helper makes `1970-01-01 00:00:00` as time available. Overwrite
321
+ this helper at will with another time string or a time-object - e.g
322
+ `let(:time) { Time.now }`.
323
+
324
+ * `client_ip`:
325
+
326
+ The `client_ip`-helper makes `127.0.0.1` available. Overwrite it with a
327
+ different ip-address as string or an object which returns an ip-address on
328
+ `#to_s`.
329
+
330
+ * `root_path`:
331
+
332
+ The `root_path`-helper is meant for overriding. It is used to find your
333
+ "proxy.pac"-files. By default its value is `Dir.getwd` which is set by
334
+ `rspec`.
335
+
336
+ ### Examples
337
+
338
+ To make it easier for you to start, you find some examples below.
339
+
340
+ **Type for specs**
341
+
342
+ It is important that you flag your specs with `type: :proxy_pac`. Otherwise the
343
+ helpers are not included and not available in your examples.
344
+
345
+ ```ruby
346
+ RSpec.describe 'proxy.pac', type: :proxy_pac do
347
+ ```
348
+
349
+ **Supported sources**
350
+
351
+ *String*
352
+
353
+ ```ruby
354
+ RSpec.describe 'String', type: :proxy_pac do
355
+ subject do
356
+ <<-EOS.strip_heredoc.chomp
357
+ function FindProxyForURL(url, host) {
358
+ return "DIRECT";
359
+ }
360
+ EOS
361
+ end
362
+ end
363
+ ```
364
+
365
+ *Local File*
366
+
367
+ ```ruby
368
+ RSpec.describe 'proxy.pac', type: :proxy_pac do
369
+ subject { 'proxy.pac' }
370
+ end
371
+ ```
372
+
373
+ *URL*
374
+
375
+ ```ruby
376
+ RSpec.describe 'http://server/proxy.pac', type: :proxy_pac do
377
+ subject { 'http://server/proxy.pac' }
378
+ end
379
+ ```
380
+
381
+ **Matchers**
382
+
383
+ *Readable*
384
+
385
+ To check if a proxy.pac could be read from filesystem or downloaded via HTTP,
386
+ check `be_readable`.
387
+
388
+ ```ruby
389
+ require 'proxy_pac_rb/rspec'
390
+
391
+ RSpec.describe 'proxy.pac', type: :proxy_pac do
392
+ context 'when proxy pac exist' do
393
+ context 'when is file' do
394
+ subject { 'proxy.pac' }
395
+ it { expect(proxy_pac).to be_readable }
396
+ end
397
+
398
+ context 'when is url' do
399
+ subject { 'http://www.example.com/proxy.pac' }
400
+ it { expect(proxy_pac).to be_readable }
401
+ end
402
+ end
403
+ end
404
+ ```
405
+
406
+ *Equal*
407
+
408
+ If you want to check if a proxy.pac is the same you can use the
409
+ `be_the_same_proxy_pac_file`-matcher.
410
+
411
+ ```ruby
412
+ require 'proxy_pac_rb/rspec'
413
+
414
+ RSpec.describe 'proxy.pac', type: :proxy_pac do
415
+ subject do
416
+ <<-EOS.strip_heredoc.chomp
417
+ function FindProxyForURL(url, host) {
418
+ return "DIRECT";
419
+ }
420
+ EOS
421
+ end
422
+ context 'Check equality of proxy pac' do
423
+ context 'when proxy.pac is eq' do
424
+ it { expect(proxy_pac).to be_the_same_proxy_pac_file 'proxy.pac' }
425
+ end
426
+
427
+ context 'when proxy.pac is not eq' do
428
+ it { expect(proxy_pac).not_to be_the_same_proxy_pac_file 'proxy.pac' }
429
+ end
430
+ end
431
+ end
432
+ ```
433
+
434
+ This is quite handy to compare a local proxy.pac with a remote one - e.g. a
435
+ deployed one.
436
+
437
+ ```ruby
438
+ require 'proxy_pac_rb/rspec'
439
+
440
+ RSpec.describe 'proxy.pac', type: :proxy_pac do
441
+ let(:local_proxy_pac) { ProxyPacRb::ProxyPacFile.new(source: file) }
442
+
443
+ before(:each) do
444
+ ProxyPacRb::ProxyPacLoader.new.load(local_proxy_pac)
445
+ ProxyPacRb::ProxyPacCompressor.new.compress(local_proxy_pac) if local_proxy_pac.readable?
446
+ end
447
+
448
+ context 'when no proxy.pac is given' do
449
+ subject { 'http://server.example.com/proxy.pac' }
450
+ let(:file) { 'source/proxy.pac' }
451
+
452
+ it { expect(proxy_pac).to be_the_same_proxy_pac_file(local_proxy_pac) }
453
+ end
454
+ end
455
+ ```
456
+
457
+ *Valid*
458
+
459
+ You want to check if your proxy.pac is valid. This will find `reference errors`
460
+ (e.g. unknown variables) and `syntax errors`.
461
+
462
+ ```ruby
463
+ require 'proxy_pac_rb/rspec'
464
+
465
+ RSpec.describe 'proxy.pac', type: :proxy_pac do
466
+ subject do
467
+ <<-EOS.strip_heredoc.chomp
468
+ function FindProxyForURL(url, host) {
469
+ return "DIRECT";
470
+ }
471
+ EOS
472
+ end
473
+ context 'Check validity of proxy pac' do
474
+ context 'when proxy.pac is valid' do
475
+ it { expect(proxy_pac).to be_valid }
476
+ end
477
+
478
+ context 'when proxy.pac is not valid' do
479
+ subject do
480
+ <<-EOS.strip_heredoc.chomp
481
+ function FindProxyForURL(url, host) {
482
+ return adsf;
483
+ }
484
+ EOS
485
+ end
486
+ it { expect(proxy_pac).not_to be_valid }
487
+ end
488
+ end
489
+ end
490
+ ```
491
+
492
+ *Parse proxy.pac*
493
+
494
+ To make some logic checks use the `be_downloaded_via`-matcher. This will parse
495
+ the proxy.pac and returns the proxy to be used for a given url.
496
+
497
+ ```ruby
498
+ require 'proxy_pac_rb/rspec'
499
+ RSpec.describe 'proxy.pac', type: :proxy_pac do
500
+ subject do
501
+ <<-EOS.strip_heredoc.chomp
502
+ function FindProxyForURL(url, host) {
503
+ if (dnsDomainIs(host, 'www1.example.com'')) {
504
+ return "PROXY proxy1.example.com:8080";
505
+ } else {
506
+ return "PROXY proxy2.example.net:8080";
507
+ }
508
+ }
509
+ EOS
510
+ end
511
+ context 'Parse Proxy Pac' do
512
+ context 'when url is forwarded via' do
513
+ let(:url) { 'http://www1.example.com' }
514
+ it { expect(url).to be_downloaded_via 'PROXY proxy.example.com:8080' }
515
+ end
516
+
517
+ context 'when url is not forwarded via' do
518
+ let(:url) { 'http://www2.example.com' }
519
+ it { expect(url).not_to be_downloaded_via 'PROXY proxy.example.com:8080' }
520
+ end
521
+ end
522
+ end
523
+ ```
524
+
230
525
  ## Developers
231
526
 
527
+ After checking out the repo, run `script/bootstrap` to install dependencies. Then, run
528
+ `script/console` for an interactive prompt that will allow you to experiment.
529
+
530
+ To install this gem onto your local machine, run `bundle exec rake gem:install`. To
531
+ release a new version, update the version number in `version.rb`, and then run
532
+ `bundle exec rake gem:release` to create a git tag for the version, push git
533
+ commits and tags, and push the `.gem` file to
534
+ [rubygems.org](https://rubygems.org).
535
+
232
536
  ### Contributing
233
537
 
234
- If you want to contribute: fork, branch & pull request.
538
+ If you want to contribute: fork, branch & pull request and please see
539
+ [CONTRIBUTING.md](CONTRIBUTING.md).
235
540
 
236
541
  ### Running Tests
237
542