ics_validator 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9094e99d026a2ca1cc6bacb08196e71b77c12413
4
- data.tar.gz: c323b4ff0934c548e092f8d03708ab85513a0e06
3
+ metadata.gz: 3249f96eb2cf709c4b6e9830d7d8a20aca8ed6cf
4
+ data.tar.gz: 2f246a81f10745def035c8d62efac59b01f70dd7
5
5
  SHA512:
6
- metadata.gz: b2e9ca885f5d02941cdf7e8cc37cd907fd5e81ad28e5a8c26a5b1115d034c388cdf0f26f1f8ed0200dbda261f46d4fc8e5522cb68e92da6028cafc754345253a
7
- data.tar.gz: e83811376c87f8fcbeb66d9150d247e51ea43b5a0d21a4e726aac3f400fbf2a07d72e0c75122bcdc4a3cad93bc56d5f0d3dd22e6ef1cd4333ff7b8f03615d788
6
+ metadata.gz: 0d6fedeea266e83773102b4136eda9a5eb237653d5dd3f6e59d9abd16b57e31db8c227a28c17a128364c787c1ade18695e02adddc75b2493362bb00b31887155
7
+ data.tar.gz: b998aadfa0fa5ebb46f3ccedaeefcbd87ff54e879722b6ddd6880352e16845d4f6360d70ee662f197c1a479bb336d9048d133a0a0865ad11058d14da5bc0c845
data/.coveralls.yml ADDED
@@ -0,0 +1 @@
1
+ repo_token: POVJtaPdxTb2L4HoSBmMc19qnPt2ZopOp
data/Gemfile CHANGED
@@ -2,3 +2,5 @@ source 'https://rubygems.org'
2
2
 
3
3
  # Specify your gem's dependencies in ics_validator.gemspec
4
4
  gemspec
5
+
6
+ gem 'coveralls', require: false
data/README.md CHANGED
@@ -1,12 +1,15 @@
1
1
  # IcsValidator
2
2
 
3
3
  [![Build Status](https://travis-ci.org/mattgillooly/ics_validator.png?branch=master)](https://travis-ci.org/mattgillooly/ics_validator)
4
+ [![Gem Version](https://badge.fury.io/rb/ics_validator.png)](http://badge.fury.io/rb/ics_validator)
5
+ [![Code Climate](https://codeclimate.com/github/mattgillooly/ics_validator.png)](https://codeclimate.com/github/mattgillooly/ics_validator)
6
+ [![Coverage Status](https://coveralls.io/repos/mattgillooly/ics_validator/badge.png)](https://coveralls.io/r/mattgillooly/ics_validator)
4
7
 
5
- Validate iCalendar feeds by URL, using icalvalid.cloudapp.net
8
+ Validate iCalendar content, using [http://icalvalid.cloudapp.net/](http://icalvalid.cloudapp.net/).
9
+ If this gem reports a failed validation, your best bet is to manually re-validate your content via the website for more actionable feedback.
6
10
 
7
- Used by [http://pvdtechevents.com](http://pvdtechevents.com) to validate its generated feed.
11
+ Used by [http://pvdtechevents.com/](http://pvdtechevents.com/) to validate its generated feed.
8
12
 
9
- TODO: Support validating iCalendar snippets and files.
10
13
 
11
14
  ## Installation
12
15
 
@@ -25,8 +28,15 @@ Or install it yourself as:
25
28
  ## Usage
26
29
 
27
30
  ```ruby
31
+ # validate an online feed by URL
28
32
  IcsValidator.valid_feed?("http://example.com/valid_feed.ics") # => true
29
33
  IcsValidator.valid_feed?("http://example.com/invalid_feed.ics") # => false
34
+
35
+ # validate a String snippet of iCalendar content
36
+ IcsValidator.valid_snippet?("BEGIN:VCALENDAR...")
37
+
38
+ # validate an iCalendar file
39
+ IcsValidator.valid_file?("path/to/local/feed.ics")
30
40
  ```
31
41
 
32
42
  ## Contributing
@@ -0,0 +1,26 @@
1
+ require 'nokogiri'
2
+
3
+ module IcsValidator
4
+
5
+ # Response from icalvalid.cloudapp.net API
6
+ #
7
+ class ApiResponse
8
+
9
+ def self.build(markup)
10
+ doc = Nokogiri::XML(markup)
11
+ new(doc.at('validationResults'))
12
+ end
13
+
14
+ def initialize(validation_results)
15
+ @validation_results = validation_results
16
+ end
17
+
18
+ def valid?
19
+ results = @validation_results.children.map{|c| c.attr(:result)}
20
+ results.compact.uniq == ['pass']
21
+ end
22
+
23
+ end
24
+ end
25
+
26
+
@@ -1,3 +1,3 @@
1
1
  module IcsValidator
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -0,0 +1,41 @@
1
+ require 'capybara/poltergeist'
2
+ require 'ics_validator/api_response'
3
+
4
+ module IcsValidator
5
+
6
+ # Capybara session for interacting with icalvalid.cloudapp.net
7
+ #
8
+ class WebSession
9
+
10
+ def initialize
11
+ @session = Capybara::Session.new(:poltergeist)
12
+
13
+ @session.driver.headers = {
14
+ 'User-Agent' => "Mozilla/5.0 (Macintosh; Intel Mac OS X)"
15
+ }
16
+
17
+ @session.visit('http://icalvalid.cloudapp.net/')
18
+ end
19
+
20
+ def validate_snippet(snippet)
21
+ @session.fill_in('Content_tbSnippet', with: snippet)
22
+ @session.click_button "Content_btnValidateSnippet"
23
+ end
24
+
25
+ def validate_file(path)
26
+ @session.attach_file('Content_fileUpload', path)
27
+ @session.click_button "Content_btnUpload"
28
+ end
29
+
30
+ def get_api_response
31
+ response = nil
32
+
33
+ Capybara.send(:timeout, 20, @session.driver) do
34
+ response = ApiResponse.build(@session.html)
35
+ end
36
+
37
+ response
38
+ end
39
+
40
+ end
41
+ end
data/lib/ics_validator.rb CHANGED
@@ -1,22 +1,28 @@
1
1
  require "ics_validator/version"
2
- require "ics_validator/feed_validator"
3
- require "ics_validator/snippet_validator"
4
- require "ics_validator/file_validator"
2
+ require "ics_validator/web_session"
3
+ require "ics_validator/api_response"
4
+ require "rest-client"
5
5
 
6
6
  # Use http://icalvalid.cloudapp.net/ to validate iCalendar content.
7
7
  #
8
8
  module IcsValidator
9
9
 
10
10
  def self.valid_feed?(url)
11
- FeedValidator.new(url).valid?
11
+ ApiResponse.build(
12
+ RestClient.get("http://icalvalid.cloudapp.net/?uri=#{url}")
13
+ ).valid?
12
14
  end
13
15
 
14
16
  def self.valid_snippet?(snippet)
15
- SnippetValidator.new(snippet).valid?
17
+ session = WebSession.new
18
+ session.validate_snippet(snippet)
19
+ session.get_api_response.valid?
16
20
  end
17
21
 
18
22
  def self.valid_file?(path)
19
- FileValidator.new(path).valid?
23
+ session = WebSession.new
24
+ session.validate_file(File.expand_path(path))
25
+ session.get_api_response.valid?
20
26
  end
21
27
 
22
28
  end
@@ -0,0 +1,256 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: http://icalvalid.cloudapp.net/?uri=http://elmcity.cloudapp.net/elmcity/ics?view=art
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - '*/*; q=0.5, application/xml'
12
+ Accept-Encoding:
13
+ - gzip, deflate
14
+ User-Agent:
15
+ - Ruby
16
+ response:
17
+ status:
18
+ code: 200
19
+ message: OK
20
+ headers:
21
+ Cache-Control:
22
+ - private
23
+ Content-Type:
24
+ - text/xml; charset=utf-8
25
+ Server:
26
+ - Microsoft-IIS/7.0
27
+ X-Aspnet-Version:
28
+ - 4.0.30319
29
+ X-Powered-By:
30
+ - ASP.NET
31
+ Date:
32
+ - Thu, 02 Jan 2014 06:46:51 GMT
33
+ Content-Length:
34
+ - '9691'
35
+ body:
36
+ encoding: ASCII-8BIT
37
+ string: !binary |-
38
+ 77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjw/
39
+ eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9InJlc3VsdHMu
40
+ eHNsdCI/Pg0KPHJlc3VsdHMNCiAgICBsYW5ndWFnZT0iZW4iDQogICAgZGF0
41
+ ZXRpbWU9IjIwMTQtMDEtMDJUMDY6NDY6NDkiDQogICAgcGVybWFsaW5rPSIv
42
+ P2lkPTYzNTI0MjQyMDA5MTQ4MzgyOSIgeG1sbnM9Imh0dHA6Ly9pY2FsdmFs
43
+ aWQud2lraWRvdC5jb20vdmFsaWRhdGlvbiI+DQogICAgPHVzaW5nDQogICAg
44
+ ICAgIG5hbWU9IkREYXkuaUNhbCINCiAgICAgICAgdXJsPSJodHRwOi8vd3d3
45
+ LmRkYXlzb2Z0d2FyZS5jb20vUGFnZXMvUHJvamVjdHMvRERheS5pQ2FsLyIN
46
+ CiAgICAgICAgdmVyc2lvbj0iMS4wLjEuMCIgLz4NCiAgICA8dXNpbmcNCiAg
47
+ ICAgICAgbmFtZT0iaWNhbHZhbGlkIg0KICAgICAgICB1cmw9Imh0dHA6Ly9p
48
+ Y2FsdmFsaWQuY2xvdWRhcHAubmV0Ig0KICAgICAgICB2ZXJzaW9uPSIxLjAu
49
+ MC4zIiAvPg0KICAgIDxjYWxlbmRhckxpbmVzDQogICAgICAgIHBhdGg9Imh0
50
+ dHA6Ly9lbG1jaXR5LmNsb3VkYXBwLm5ldC9lbG1jaXR5L2ljcz92aWV3PWFy
51
+ dCINCiAgICAgICAgYnl0ZUNvdW50PSIxOTU4Ig0KICAgICAgICBsaW1pdD0i
52
+ NTAwIj4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEiPkJFR0lO
53
+ OlZDQUxFTkRBUjwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
54
+ IG49IjIiPlZFUlNJT046Mi4wPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAg
55
+ ICAgICAgICAgbj0iMyI+UFJPRElEOi0vL2RkYXlzb2Z0d2FyZS5jb20vL05P
56
+ TlNHTUwgRERheS5pQ2FsIDEuMC8vRU48L2xpbmU+DQogICAgICAgIDxsaW5l
57
+ DQogICAgICAgICAgICBuPSI0Ij5CRUdJTjpWVElNRVpPTkU8L2xpbmU+DQog
58
+ ICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1Ij5UWklEOkVhc3Rlcm4g
59
+ U3RhbmRhcmQgVGltZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAg
60
+ ICAgIG49IjYiPkJFR0lOOlNUQU5EQVJEPC9saW5lPg0KICAgICAgICA8bGlu
61
+ ZQ0KICAgICAgICAgICAgbj0iNyI+RFRTVEFSVDoyMDEzMTEwMlQwMjAwMDA8
62
+ L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI4Ij5SUlVM
63
+ RTpGUkVRPVlFQVJMWTtCWURBWT0xU1U7QllIT1VSPTI7QllNSU5VVEU9MDtC
64
+ WU1PTlRIPTExPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
65
+ bj0iOSI+VFpOQU1FOkVhc3Rlcm4gU3RhbmRhcmQgVGltZTwvbGluZT4NCiAg
66
+ ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEwIj5UWk9GRlNFVEZST006
67
+ LTA0MDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIx
68
+ MSI+VFpPRkZTRVRUTzotMDUwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAg
69
+ ICAgICAgICAgIG49IjEyIj5FTkQ6U1RBTkRBUkQ8L2xpbmU+DQogICAgICAg
70
+ IDxsaW5lDQogICAgICAgICAgICBuPSIxMyI+QkVHSU46REFZTElHSFQ8L2xp
71
+ bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxNCI+RFRTVEFS
72
+ VDoyMDEzMDMwMVQwMjAwMDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAg
73
+ ICAgICAgICBuPSIxNSI+UlJVTEU6RlJFUT1ZRUFSTFk7QllEQVk9MlNVO0JZ
74
+ SE9VUj0yO0JZTUlOVVRFPTA7QllNT05USD0zPC9saW5lPg0KICAgICAgICA8
75
+ bGluZQ0KICAgICAgICAgICAgbj0iMTYiPlRaTkFNRTpFYXN0ZXJuIERheWxp
76
+ Z2h0IFRpbWU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
77
+ PSIxNyI+VFpPRkZTRVRGUk9NOi0wNTAwPC9saW5lPg0KICAgICAgICA8bGlu
78
+ ZQ0KICAgICAgICAgICAgbj0iMTgiPlRaT0ZGU0VUVE86LTA0MDA8L2xpbmU+
79
+ DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxOSI+RU5EOkRBWUxJ
80
+ R0hUPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjAi
81
+ PkVORDpWVElNRVpPTkU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAg
82
+ ICAgICBuPSIyMSI+QkVHSU46VkVWRU5UPC9saW5lPg0KICAgICAgICA8bGlu
83
+ ZQ0KICAgICAgICAgICAgbj0iMjIiPkNBVEVHT1JJRVM6YXJ0PC9saW5lPg0K
84
+ ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjMiPkNBVEVHT1JJRVM6
85
+ a3NjPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjQi
86
+ PkNBVEVHT1JJRVM6dW5pdmVyc2l0eTwvbGluZT4NCiAgICAgICAgPGxpbmUN
87
+ CiAgICAgICAgICAgIG49IjI1Ij5ERVNDUklQVElPTjoyMDEzw6/Cv8K9MTQg
88
+ UmVkZmVybiBDaG9yZW9ncmFwaGVyLWluLVJlc2lkZW5jZSBSZWJlY2NhIFN0
89
+ ZW5uIGhhcyBwZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
90
+ IG49IjI2Ij4gcmZvcm1lZCBhbmQgdG91cmVkIHRocm91Z2hvdXQgdGhlIHdv
91
+ cmxkIGFzIGEgcHJpbmNpcGFsIGRhbmNlciB3aXRoIE1vbWl4IGE8L2xpbmU+
92
+ DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIyNyI+IG5kIFBpbG9i
93
+ b2x1cy4gU3Rlbm4gY3JlYXRlcyBkaXN0aW5jdGl2ZSBkYW5jZSBwaWVjZXMg
94
+ YW5kIHNvbG8gd29ya3MgdGhhdCBjPC9saW5lPg0KICAgICAgICA8bGluZQ0K
95
+ ICAgICAgICAgICAgbj0iMjgiPiBoYWxsZW5nZSB0aGUgdW5pcXVlIHdheXMg
96
+ dGhhdCBsaXZlIG11c2ljIGFuZCBkYW5jZVxuY29tbXVuaWNhdGUgYW5kIGlu
97
+ dGVyYTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjI5
98
+ Ij4gY3QuPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0i
99
+ MzAiPkRURU5EO1RaSUQ9RWFzdGVybiBTdGFuZGFyZCBUaW1lOjIwMTQwMTI3
100
+ VDIxMzAwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49
101
+ IjMxIj5EVFNUQU1QOjIwMTQwMTAyVDA2MjEyN1o8L2xpbmU+DQogICAgICAg
102
+ IDxsaW5lDQogICAgICAgICAgICBuPSIzMiI+RFRTVEFSVDtUWklEPUVhc3Rl
103
+ cm4gU3RhbmRhcmQgVGltZToyMDE0MDEyN1QxOTMwMDA8L2xpbmU+DQogICAg
104
+ ICAgIDxsaW5lDQogICAgICAgICAgICBuPSIzMyI+TE9DQVRJT046PC9saW5l
105
+ Pg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMzQiPlNFUVVFTkNF
106
+ OjA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIzNSI+
107
+ U1VNTUFSWTpSZWJlY2NhIFN0ZW5uIE1vZGVybiBEYW5jZTwvbGluZT4NCiAg
108
+ ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM2Ij5VSUQ6MmYxMDEzZjEt
109
+ ZjEwMy00ZWY4LTk2NDgtZTdjNjRmNDM5NzdiPC9saW5lPg0KICAgICAgICA8
110
+ bGluZQ0KICAgICAgICAgICAgbj0iMzciPlVSTDpodHRwOi8vd3d3LmtlZW5l
111
+ LmVkdS9uZXdzL2V2ZW50cy9kZXRhaWwvMTIzMi88L2xpbmU+DQogICAgICAg
112
+ IDxsaW5lDQogICAgICAgICAgICBuPSIzOCI+RU5EOlZFVkVOVDwvbGluZT4N
113
+ CiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM5Ij5CRUdJTjpWRVZF
114
+ TlQ8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0MCI+
115
+ Q0FURUdPUklFUzphcnQ8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAg
116
+ ICAgICBuPSI0MSI+Q0FURUdPUklFUzprc2M8L2xpbmU+DQogICAgICAgIDxs
117
+ aW5lDQogICAgICAgICAgICBuPSI0MiI+Q0FURUdPUklFUzp0aGVhdGVyPC9s
118
+ aW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNDMiPkNBVEVH
119
+ T1JJRVM6dW5pdmVyc2l0eTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAg
120
+ ICAgICAgIG49IjQ0Ij5ERVNDUklQVElPTjpJbiB0aGVpciBwcmVtaWVyZSBB
121
+ bWVyaWNhbiB0b3VyXCwgdGhpcyBoaWxhcmlvdXMgY2lyY3VzXG50cm91cGU8
122
+ L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0NSI+ICBm
123
+ ZWF0dXJlcyBsb2ctd2Fsa2luZ1wsIHNwb29uLWNsYWNraW5nXCwgaGF0Y2hl
124
+ dC1qdWdnbGluZ1wsIGNsb2ctZGFuY2luZ1wsPC9saW5lPg0KICAgICAgICA8
125
+ bGluZQ0KICAgICAgICAgICAgbj0iNDYiPiAgYW5kIGV2ZW4gaGlqaW5rcyBv
126
+ biBhbiBvdXRob3VzZSEgQSBzbW9yZ2FzYm9yZCBvZiBmYW1pbHkgZnVuIGJh
127
+ c2VkIG9uIHRoZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
128
+ IG49IjQ3Ij4gIGxvZ2dpbmcgdHJhZGl0aW9uIHdpdGggdHJvdXBlcnMgcGVy
129
+ Zm9ybWluZyBkYXJpbmcga25pZmUgdHJpY2tzIGFuZCBhY3JvYmE8L2xpbmU+
130
+ DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0OCI+IHRpYyBmZWF0
131
+ cyB0byB0aGUgdG9lLXRhcHBpbmcgc291bmRzIG9mIFF1ZWJlY29pcyBmb2xr
132
+ IG11c2ljLjwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49
133
+ IjQ5Ij5EVEVORDtUWklEPUVhc3Rlcm4gU3RhbmRhcmQgVGltZToyMDE0MDIw
134
+ MVQxNjAwMDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
135
+ PSI1MCI+RFRTVEFNUDoyMDE0MDEwMlQwNjIxMjdaPC9saW5lPg0KICAgICAg
136
+ ICA8bGluZQ0KICAgICAgICAgICAgbj0iNTEiPkRUU1RBUlQ7VFpJRD1FYXN0
137
+ ZXJuIFN0YW5kYXJkIFRpbWU6MjAxNDAyMDFUMTQwMDAwPC9saW5lPg0KICAg
138
+ ICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTIiPkxPQ0FUSU9OOjwvbGlu
139
+ ZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjUzIj5TRVFVRU5D
140
+ RTowPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTQi
141
+ PlNVTU1BUlk6Q2lycXVlIEFsZm9uc2UgaW4gIlRpbWJlciEiPC9saW5lPg0K
142
+ ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTUiPlVJRDoyYzgyZGQz
143
+ OC05N2ZmLTRhZDAtOTg3OS00ZDllZDQxZWJiYzU8L2xpbmU+DQogICAgICAg
144
+ IDxsaW5lDQogICAgICAgICAgICBuPSI1NiI+VVJMOmh0dHA6Ly93d3cua2Vl
145
+ bmUuZWR1L25ld3MvZXZlbnRzL2RldGFpbC8xMjMzLzwvbGluZT4NCiAgICAg
146
+ ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjU3Ij5FTkQ6VkVWRU5UPC9saW5l
147
+ Pg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTgiPkVORDpWQ0FM
148
+ RU5EQVI8L2xpbmU+DQogICAgPC9jYWxlbmRhckxpbmVzPg0KICAgIDx2YWxp
149
+ ZGF0aW9uUmVzdWx0cw0KICAgICAgICBydWxlc2V0PSJTdHJpY3RfMl8wIg0K
150
+ ICAgICAgICBydWxlc2V0U3RyaW5nPSJpQ2FsZW5kYXIgMi4wIFN0cmljdCIN
151
+ CiAgICAgICAgcnVsZXNldERlc2NyaXB0aW9uPSImI3hEOyYjeEE7ICAgICAg
152
+ ICBWYWxpZGF0ZXMgaUNhbGVuZGFycyBhZ2FpbnN0IHRoZSBJRVRGIHN0YW5k
153
+ YXJkcyBpbiBhIHN0cmljdCBmYXNoaW9uLiAgQW55IHZhcmlhdGlvbnMgZnJv
154
+ bSB0aGUgc3RhbmRhcmQmI3hEOyYjeEE7ICAgICAgICB3aWxsIGJlIHJlcG9y
155
+ dGVkLiYjeEQ7JiN4QTsgICAgIg0KICAgICAgICBzY29yZT0iMTAwIj4NCiAg
156
+ ICAgICAgPGNhbGVuZGFySW5mb3M+DQogICAgICAgICAgICA8Y2FsZW5kYXJJ
157
+ bmZvDQogICAgICAgICAgICAgICAgdGltZVpvbmVDb3VudD0iMSINCiAgICAg
158
+ ICAgICAgICAgICBldmVudENvdW50PSIyIg0KICAgICAgICAgICAgICAgIHRv
159
+ ZG9Db3VudD0iMCINCiAgICAgICAgICAgICAgICBqb3VybmFsQ291bnQ9IjAi
160
+ DQogICAgICAgICAgICAgICAgZnJlZUJ1c3lDb3VudD0iMCINCiAgICAgICAg
161
+ ICAgICAgICBjYWxlbmRhclZlcnNpb249IjIuMCINCiAgICAgICAgICAgICAg
162
+ ICBwcm9kSUQ9Ii0vL2RkYXlzb2Z0d2FyZS5jb20vL05PTlNHTUwgRERheS5p
163
+ Q2FsIDEuMC8vRU4iIC8+DQogICAgICAgIDwvY2FsZW5kYXJJbmZvcz4NCiAg
164
+ ICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImVt
165
+ cHR5TGluZSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
166
+ ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImNybGZQ
167
+ YWlycyINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAg
168
+ PHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImxpbmVGb2xk
169
+ aW5nIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8
170
+ dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0idmVyc2lvbiIN
171
+ CiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlk
172
+ YXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9InByb2RJRCINCiAgICAg
173
+ ICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25S
174
+ ZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImNhbFNjYWxlIg0KICAgICAgICAg
175
+ ICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3Vs
176
+ dA0KICAgICAgICAgICAgcnVsZT0ibWV0aG9kIg0KICAgICAgICAgICAgcmVz
177
+ dWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAg
178
+ ICAgICAgICAgcnVsZT0iY29tcG9uZW50Ig0KICAgICAgICAgICAgcmVzdWx0
179
+ PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAg
180
+ ICAgICAgcnVsZT0iIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0K
181
+ ICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0i
182
+ ZXZlbnRBdHRhY2hQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFz
183
+ cyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAg
184
+ IHJ1bGU9ImV2ZW50QXR0ZW5kZWVQcm9wZXJ0eSINCiAgICAgICAgICAgIHJl
185
+ c3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAg
186
+ ICAgICAgICAgIHJ1bGU9ImV2ZW50Q2F0ZWdvcmllc1Byb3BlcnR5Ig0KICAg
187
+ ICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlv
188
+ blJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRDbGFzc1Byb3BlcnR5
189
+ Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
190
+ aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRDb21tZW50
191
+ UHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAg
192
+ ICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVu
193
+ dENvbnRhY3RQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIg
194
+ Lz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1
195
+ bGU9ImV2ZW50Q3JlYXRlZFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0
196
+ PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAg
197
+ ICAgICAgcnVsZT0iZXZlbnREZXNjcmlwdGlvblByb3BlcnR5Ig0KICAgICAg
198
+ ICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJl
199
+ c3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnREVEVuZER1cmF0aW9uQ29u
200
+ ZmxpY3QiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
201
+ IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudERU
202
+ RW5kUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQog
203
+ ICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJl
204
+ dmVudERUU3RhcnRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFz
205
+ cyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAg
206
+ IHJ1bGU9ImV2ZW50RFRTdGFtcFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVz
207
+ dWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAg
208
+ ICAgICAgICAgcnVsZT0iZXZlbnREdXJhdGlvblByb3BlcnR5Ig0KICAgICAg
209
+ ICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJl
210
+ c3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRFeERhdGVQcm9wZXJ0eSIN
211
+ CiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlk
212
+ YXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50RXhSdWxlUHJv
213
+ cGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
214
+ IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudEdl
215
+ b1Byb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAg
216
+ ICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZl
217
+ bnRMYXN0TW9kUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3Mi
218
+ IC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBy
219
+ dWxlPSJldmVudExvY2F0aW9uUHJvcGVydHkiDQogICAgICAgICAgICByZXN1
220
+ bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAg
221
+ ICAgICAgICBydWxlPSJldmVudE9yZ2FuaXplclByb3BlcnR5Ig0KICAgICAg
222
+ ICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJl
223
+ c3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRQcmlvcml0eVByb3BlcnR5
224
+ Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
225
+ aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRSRGF0ZVBy
226
+ b3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAg
227
+ ICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRS
228
+ ZWN1cklEUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+
229
+ DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxl
230
+ PSJldmVudFJlbGF0ZWRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0i
231
+ cGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAg
232
+ ICAgIHJ1bGU9ImV2ZW50UmVzb3VyY2VzUHJvcGVydHkiDQogICAgICAgICAg
233
+ ICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0
234
+ DQogICAgICAgICAgICBydWxlPSJldmVudFJTdGF0dXNQcm9wZXJ0eSINCiAg
235
+ ICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRp
236
+ b25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50UlJ1bGVQcm9wZXJ0
237
+ eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZh
238
+ bGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50U2VxUHJv
239
+ cGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
240
+ IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudFN0
241
+ YXR1c1Byb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0K
242
+ ICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0i
243
+ ZXZlbnRTdW1tYXJ5UHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBh
244
+ c3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAg
245
+ ICBydWxlPSJldmVudFRyYW5zcFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVz
246
+ dWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAg
247
+ ICAgICAgICAgcnVsZT0iZXZlbnRVaWRQcm9wZXJ0eSINCiAgICAgICAgICAg
248
+ IHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQN
249
+ CiAgICAgICAgICAgIHJ1bGU9ImV2ZW50VXJsUHJvcGVydHkiDQogICAgICAg
250
+ ICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVz
251
+ dWx0DQogICAgICAgICAgICBydWxlPSJldmVudFhQcm9wZXJ0eSINCiAgICAg
252
+ ICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICA8L3ZhbGlkYXRpb25SZXN1
253
+ bHRzPg0KPC9yZXN1bHRzPg==
254
+ http_version:
255
+ recorded_at: Thu, 02 Jan 2014 06:46:51 GMT
256
+ recorded_with: VCR 2.5.0
@@ -29,7 +29,7 @@ http_interactions:
29
29
  X-Powered-By:
30
30
  - ASP.NET
31
31
  Date:
32
- - Wed, 01 Jan 2014 03:14:21 GMT
32
+ - Thu, 02 Jan 2014 06:46:47 GMT
33
33
  Content-Length:
34
34
  - '9314'
35
35
  body:
@@ -38,8 +38,8 @@ http_interactions:
38
38
  77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjw/
39
39
  eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9InJlc3VsdHMu
40
40
  eHNsdCI/Pg0KPHJlc3VsdHMNCiAgICBsYW5ndWFnZT0iZW4iDQogICAgZGF0
41
- ZXRpbWU9IjIwMTQtMDEtMDFUMDM6MTQ6MjAiDQogICAgcGVybWFsaW5rPSIv
42
- P2lkPTYzNTI0MTQyODU5NjUyNjc2MyIgeG1sbnM9Imh0dHA6Ly9pY2FsdmFs
41
+ ZXRpbWU9IjIwMTQtMDEtMDJUMDY6NDY6NDUiDQogICAgcGVybWFsaW5rPSIv
42
+ P2lkPTYzNTI0MjQyMDA1MDM5MTkyMCIgeG1sbnM9Imh0dHA6Ly9pY2FsdmFs
43
43
  aWQud2lraWRvdC5jb20vdmFsaWRhdGlvbiI+DQogICAgPHVzaW5nDQogICAg
44
44
  ICAgIG5hbWU9IkREYXkuaUNhbCINCiAgICAgICAgdXJsPSJodHRwOi8vd3d3
45
45
  LmRkYXlzb2Z0d2FyZS5jb20vUGFnZXMvUHJvamVjdHMvRERheS5pQ2FsLyIN
@@ -243,5 +243,5 @@ http_interactions:
243
243
  cnVsZT0iZXZlbnRYUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBh
244
244
  c3MiIC8+DQogICAgPC92YWxpZGF0aW9uUmVzdWx0cz4NCjwvcmVzdWx0cz4=
245
245
  http_version:
246
- recorded_at: Wed, 01 Jan 2014 03:14:21 GMT
246
+ recorded_at: Thu, 02 Jan 2014 06:46:47 GMT
247
247
  recorded_with: VCR 2.5.0
@@ -0,0 +1,113 @@
1
+ require 'spec_helper'
2
+
3
+ describe IcsValidator, :vcr do
4
+
5
+ describe ".valid_feed?(url)" do
6
+
7
+ context "given a valid ICS feed" do
8
+ let(:valid_ics_feed_url) {
9
+ "http://elmcity.cloudapp.net/elmcity/ics?view=art"
10
+ }
11
+
12
+ it "returns true" do
13
+ expect(
14
+ described_class.valid_feed?(valid_ics_feed_url)
15
+ ).to be_true
16
+ end
17
+ end
18
+
19
+ context "given an invalid ICS feed" do
20
+ let(:invalid_ics_feed_url) {
21
+ "http://example.com/"
22
+ }
23
+
24
+ it "returns false" do
25
+ expect(
26
+ described_class.valid_feed?(invalid_ics_feed_url)
27
+ ).to be_false
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ describe ".valid_file?(path)" do
34
+
35
+ context "given a valid ICS file" do
36
+ let(:valid_ics_file) {
37
+ File.expand_path('../fixtures/icalendar/valid.ics', __FILE__)
38
+ }
39
+
40
+ it "returns true" do
41
+ expect(
42
+ described_class.valid_file?(valid_ics_file)
43
+ ).to be_true
44
+ end
45
+ end
46
+
47
+ context "given an invalid ICS file" do
48
+ let(:invalid_ics_file) {
49
+ File.expand_path('../fixtures/icalendar/invalid.ics', __FILE__)
50
+ }
51
+
52
+ it "returns false" do
53
+ expect(
54
+ described_class.valid_file?(invalid_ics_file)
55
+ ).to be_false
56
+ end
57
+ end
58
+
59
+ end
60
+
61
+ describe ".valid_snippet?(snippet)" do
62
+
63
+ context "given a valid ICS snippet" do
64
+ let(:valid_ics_snippet) {
65
+ <<-EOF
66
+ BEGIN:VCALENDAR
67
+ VERSION:2.0
68
+ CALSCALE:GREGORIAN
69
+ METHOD:PUBLISH
70
+ PRODID:iCalendar-Ruby
71
+ BEGIN:VTIMEZONE
72
+ TZID:America/New_York
73
+ BEGIN:DAYLIGHT
74
+ DTSTART:19700308T020000
75
+ RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
76
+ TZNAME:EDT
77
+ TZOFFSETFROM:-0500
78
+ TZOFFSETTO:-0400
79
+ END:DAYLIGHT
80
+ BEGIN:STANDARD
81
+ DTSTART:19701101T020000
82
+ RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
83
+ TZNAME:EST
84
+ TZOFFSETFROM:-0400
85
+ TZOFFSETTO:-0500
86
+ END:STANDARD
87
+ END:VTIMEZONE
88
+ END:VCALENDAR
89
+ EOF
90
+ }
91
+
92
+ it "returns true" do
93
+ expect(
94
+ described_class.valid_snippet?(valid_ics_snippet)
95
+ ).to be_true
96
+ end
97
+ end
98
+
99
+ context "given an invalid ICS snippet" do
100
+ let(:invalid_ics_snippet) {
101
+ "LOL. THIS ISN'T EVEN CLOSE"
102
+ }
103
+
104
+ it "returns false" do
105
+ expect(
106
+ described_class.valid_snippet?(invalid_ics_snippet)
107
+ ).to be_false
108
+ end
109
+ end
110
+
111
+ end
112
+
113
+ end
data/spec/spec_helper.rb CHANGED
@@ -1,6 +1,9 @@
1
1
  require 'ics_validator'
2
- require 'vcr'
3
2
 
3
+ require 'coveralls'
4
+ Coveralls.wear!
5
+
6
+ require 'vcr'
4
7
  VCR.configure do |c|
5
8
  c.cassette_library_dir = 'spec/cassettes'
6
9
  c.hook_into :webmock
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ics_validator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Gillooly
@@ -143,6 +143,7 @@ executables: []
143
143
  extensions: []
144
144
  extra_rdoc_files: []
145
145
  files:
146
+ - .coveralls.yml
146
147
  - .gitignore
147
148
  - .rspec
148
149
  - .travis.yml
@@ -152,17 +153,14 @@ files:
152
153
  - Rakefile
153
154
  - ics_validator.gemspec
154
155
  - lib/ics_validator.rb
155
- - lib/ics_validator/feed_validator.rb
156
- - lib/ics_validator/file_validator.rb
157
- - lib/ics_validator/snippet_validator.rb
156
+ - lib/ics_validator/api_response.rb
158
157
  - lib/ics_validator/version.rb
159
- - spec/cassettes/IcsValidator_FeedValidator/given_a_valid_ICS_feed/_valid_/returns_true.yml
160
- - spec/cassettes/IcsValidator_FeedValidator/given_an_invalid_ICS_feed/_valid_/returns_false.yml
158
+ - lib/ics_validator/web_session.rb
159
+ - spec/cassettes/IcsValidator/_valid_feed_url_/given_a_valid_ICS_feed/returns_true.yml
160
+ - spec/cassettes/IcsValidator/_valid_feed_url_/given_an_invalid_ICS_feed/returns_false.yml
161
161
  - spec/fixtures/icalendar/invalid.ics
162
162
  - spec/fixtures/icalendar/valid.ics
163
- - spec/ics_validator/feed_validator_spec.rb
164
- - spec/ics_validator/file_validator_spec.rb
165
- - spec/ics_validator/snippet_validator_spec.rb
163
+ - spec/ics_validator_spec.rb
166
164
  - spec/spec_helper.rb
167
165
  homepage: http://github.com/mattgillooly/ics_validator
168
166
  licenses:
@@ -189,11 +187,9 @@ signing_key:
189
187
  specification_version: 4
190
188
  summary: Validate iCalendar content
191
189
  test_files:
192
- - spec/cassettes/IcsValidator_FeedValidator/given_a_valid_ICS_feed/_valid_/returns_true.yml
193
- - spec/cassettes/IcsValidator_FeedValidator/given_an_invalid_ICS_feed/_valid_/returns_false.yml
190
+ - spec/cassettes/IcsValidator/_valid_feed_url_/given_a_valid_ICS_feed/returns_true.yml
191
+ - spec/cassettes/IcsValidator/_valid_feed_url_/given_an_invalid_ICS_feed/returns_false.yml
194
192
  - spec/fixtures/icalendar/invalid.ics
195
193
  - spec/fixtures/icalendar/valid.ics
196
- - spec/ics_validator/feed_validator_spec.rb
197
- - spec/ics_validator/file_validator_spec.rb
198
- - spec/ics_validator/snippet_validator_spec.rb
194
+ - spec/ics_validator_spec.rb
199
195
  - spec/spec_helper.rb
@@ -1,40 +0,0 @@
1
- require 'nokogiri'
2
- require 'rest-client'
3
-
4
- module IcsValidator
5
-
6
- # Validate an iCalendar feed by URL.
7
- #
8
- class FeedValidator
9
-
10
- def initialize(feed_url)
11
- @feed_url = feed_url
12
- end
13
-
14
- def valid?
15
- if r = validation_results
16
- results = r.children.map{|c| c.attr(:result)}
17
- results.compact.uniq == ['pass']
18
- end
19
- end
20
-
21
- private
22
-
23
- def validator_url
24
- "http://icalvalid.cloudapp.net/?uri=#{@feed_url}"
25
- end
26
-
27
- def validator_response
28
- RestClient.get(validator_url)
29
- end
30
-
31
- def validator_response_doc
32
- Nokogiri::XML(validator_response)
33
- end
34
-
35
- def validation_results
36
- validator_response_doc.at('validationResults')
37
- end
38
-
39
- end
40
- end
@@ -1,49 +0,0 @@
1
- require 'capybara/poltergeist'
2
-
3
- module IcsValidator
4
-
5
- # Validate an iCalendar file.
6
- #
7
- class FileValidator
8
-
9
- def initialize(path)
10
- @path = path
11
- end
12
-
13
- def valid?
14
- if r = validation_results
15
- results = validation_results.children.map{|c| c.attr(:result)}
16
- results.compact.uniq == ['pass']
17
- else
18
- raise "unexpected markup"
19
- end
20
- end
21
-
22
- private
23
-
24
- def validator_response
25
- session = Capybara::Session.new(:poltergeist)
26
-
27
- session.driver.headers = { 'User-Agent' =>
28
- "Mozilla/5.0 (Macintosh; Intel Mac OS X)" }
29
-
30
- session.visit('http://icalvalid.cloudapp.net/')
31
-
32
- session.attach_file('Content_fileUpload', File.expand_path(@path))
33
-
34
- session.click_button "Content_btnUpload"
35
-
36
- session.html
37
- end
38
-
39
- def validator_response_doc
40
- Nokogiri::XML(validator_response)
41
- end
42
-
43
- def validation_results
44
- validator_response_doc.at('validationResults')
45
- end
46
-
47
- end
48
- end
49
-
@@ -1,48 +0,0 @@
1
- require 'capybara/poltergeist'
2
-
3
- module IcsValidator
4
-
5
- # Validate a snippet of iCalendar content.
6
- #
7
- class SnippetValidator
8
-
9
- def initialize(snippet)
10
- @snippet = snippet
11
- end
12
-
13
- def valid?
14
- if r = validation_results
15
- results = validation_results.children.map{|c| c.attr(:result)}
16
- results.compact.uniq == ['pass']
17
- else
18
- raise "unexpected markup"
19
- end
20
- end
21
-
22
- private
23
-
24
- def validator_response
25
- session = Capybara::Session.new(:poltergeist)
26
-
27
- session.driver.headers = { 'User-Agent' =>
28
- "Mozilla/5.0 (Macintosh; Intel Mac OS X)" }
29
-
30
- session.visit('http://icalvalid.cloudapp.net/')
31
-
32
- session.fill_in('Content_tbSnippet', with: @snippet)
33
-
34
- session.click_button "Content_btnValidateSnippet"
35
-
36
- session.html
37
- end
38
-
39
- def validator_response_doc
40
- Nokogiri::XML(validator_response)
41
- end
42
-
43
- def validation_results
44
- validator_response_doc.at('validationResults')
45
- end
46
-
47
- end
48
- end
@@ -1,256 +0,0 @@
1
- ---
2
- http_interactions:
3
- - request:
4
- method: get
5
- uri: http://icalvalid.cloudapp.net/?uri=http://elmcity.cloudapp.net/elmcity/ics?view=art
6
- body:
7
- encoding: US-ASCII
8
- string: ''
9
- headers:
10
- Accept:
11
- - '*/*; q=0.5, application/xml'
12
- Accept-Encoding:
13
- - gzip, deflate
14
- User-Agent:
15
- - Ruby
16
- response:
17
- status:
18
- code: 200
19
- message: OK
20
- headers:
21
- Cache-Control:
22
- - private
23
- Content-Type:
24
- - text/xml; charset=utf-8
25
- Server:
26
- - Microsoft-IIS/7.0
27
- X-Aspnet-Version:
28
- - 4.0.30319
29
- X-Powered-By:
30
- - ASP.NET
31
- Date:
32
- - Wed, 01 Jan 2014 03:14:18 GMT
33
- Content-Length:
34
- - '9693'
35
- body:
36
- encoding: ASCII-8BIT
37
- string: !binary |-
38
- 77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjw/
39
- eG1sLXN0eWxlc2hlZXQgdHlwZT0idGV4dC94c2wiIGhyZWY9InJlc3VsdHMu
40
- eHNsdCI/Pg0KPHJlc3VsdHMNCiAgICBsYW5ndWFnZT0iZW4iDQogICAgZGF0
41
- ZXRpbWU9IjIwMTQtMDEtMDFUMDM6MTQ6MTYiDQogICAgcGVybWFsaW5rPSIv
42
- P2lkPTYzNTI0MTQyODU2NDY1NDAwNyIgeG1sbnM9Imh0dHA6Ly9pY2FsdmFs
43
- aWQud2lraWRvdC5jb20vdmFsaWRhdGlvbiI+DQogICAgPHVzaW5nDQogICAg
44
- ICAgIG5hbWU9IkREYXkuaUNhbCINCiAgICAgICAgdXJsPSJodHRwOi8vd3d3
45
- LmRkYXlzb2Z0d2FyZS5jb20vUGFnZXMvUHJvamVjdHMvRERheS5pQ2FsLyIN
46
- CiAgICAgICAgdmVyc2lvbj0iMS4wLjEuMCIgLz4NCiAgICA8dXNpbmcNCiAg
47
- ICAgICAgbmFtZT0iaWNhbHZhbGlkIg0KICAgICAgICB1cmw9Imh0dHA6Ly9p
48
- Y2FsdmFsaWQuY2xvdWRhcHAubmV0Ig0KICAgICAgICB2ZXJzaW9uPSIxLjAu
49
- MC4zIiAvPg0KICAgIDxjYWxlbmRhckxpbmVzDQogICAgICAgIHBhdGg9Imh0
50
- dHA6Ly9lbG1jaXR5LmNsb3VkYXBwLm5ldC9lbG1jaXR5L2ljcz92aWV3PWFy
51
- dCINCiAgICAgICAgYnl0ZUNvdW50PSIxOTYwIg0KICAgICAgICBsaW1pdD0i
52
- NTAwIj4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEiPkJFR0lO
53
- OlZDQUxFTkRBUjwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
54
- IG49IjIiPlZFUlNJT046Mi4wPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAg
55
- ICAgICAgICAgbj0iMyI+UFJPRElEOi0vL2RkYXlzb2Z0d2FyZS5jb20vL05P
56
- TlNHTUwgRERheS5pQ2FsIDEuMC8vRU48L2xpbmU+DQogICAgICAgIDxsaW5l
57
- DQogICAgICAgICAgICBuPSI0Ij5CRUdJTjpWVElNRVpPTkU8L2xpbmU+DQog
58
- ICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1Ij5UWklEOkVhc3Rlcm4g
59
- U3RhbmRhcmQgVGltZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAg
60
- ICAgIG49IjYiPkJFR0lOOlNUQU5EQVJEPC9saW5lPg0KICAgICAgICA8bGlu
61
- ZQ0KICAgICAgICAgICAgbj0iNyI+RFRTVEFSVDoyMDEzMTEwMlQwMjAwMDA8
62
- L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI4Ij5SUlVM
63
- RTpGUkVRPVlFQVJMWTtCWURBWT0xU1U7QllIT1VSPTI7QllNSU5VVEU9MDtC
64
- WU1PTlRIPTExPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
65
- bj0iOSI+VFpOQU1FOkVhc3Rlcm4gU3RhbmRhcmQgVGltZTwvbGluZT4NCiAg
66
- ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjEwIj5UWk9GRlNFVEZST006
67
- LTA0MDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIx
68
- MSI+VFpPRkZTRVRUTzotMDUwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAg
69
- ICAgICAgICAgIG49IjEyIj5FTkQ6U1RBTkRBUkQ8L2xpbmU+DQogICAgICAg
70
- IDxsaW5lDQogICAgICAgICAgICBuPSIxMyI+QkVHSU46REFZTElHSFQ8L2xp
71
- bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxNCI+RFRTVEFS
72
- VDoyMDEzMDMwMVQwMjAwMDA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAg
73
- ICAgICAgICBuPSIxNSI+UlJVTEU6RlJFUT1ZRUFSTFk7QllEQVk9MlNVO0JZ
74
- SE9VUj0yO0JZTUlOVVRFPTA7QllNT05USD0zPC9saW5lPg0KICAgICAgICA8
75
- bGluZQ0KICAgICAgICAgICAgbj0iMTYiPlRaTkFNRTpFYXN0ZXJuIERheWxp
76
- Z2h0IFRpbWU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
77
- PSIxNyI+VFpPRkZTRVRGUk9NOi0wNTAwPC9saW5lPg0KICAgICAgICA8bGlu
78
- ZQ0KICAgICAgICAgICAgbj0iMTgiPlRaT0ZGU0VUVE86LTA0MDA8L2xpbmU+
79
- DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIxOSI+RU5EOkRBWUxJ
80
- R0hUPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjAi
81
- PkVORDpWVElNRVpPTkU8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAg
82
- ICAgICBuPSIyMSI+QkVHSU46VkVWRU5UPC9saW5lPg0KICAgICAgICA8bGlu
83
- ZQ0KICAgICAgICAgICAgbj0iMjIiPkNBVEVHT1JJRVM6YXJ0PC9saW5lPg0K
84
- ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjMiPkNBVEVHT1JJRVM6
85
- a3NjPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMjQi
86
- PkNBVEVHT1JJRVM6dW5pdmVyc2l0eTwvbGluZT4NCiAgICAgICAgPGxpbmUN
87
- CiAgICAgICAgICAgIG49IjI1Ij5ERVNDUklQVElPTjoyMDEzw6LigqzigJwx
88
- NCBSZWRmZXJuIENob3Jlb2dyYXBoZXItaW4tUmVzaWRlbmNlIFJlYmVjY2Eg
89
- U3Rlbm4gaGFzIHBlPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAg
90
- ICAgbj0iMjYiPiByZm9ybWVkIGFuZCB0b3VyZWQgdGhyb3VnaG91dCB0aGUg
91
- d29ybGQgYXMgYSBwcmluY2lwYWwgZGFuY2VyIHdpdGggTW9taXggYTwvbGlu
92
- ZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjI3Ij4gbmQgUGls
93
- b2JvbHVzLiBTdGVubiBjcmVhdGVzIGRpc3RpbmN0aXZlIGRhbmNlIHBpZWNl
94
- cyBhbmQgc29sbyB3b3JrcyB0aGF0IGM8L2xpbmU+DQogICAgICAgIDxsaW5l
95
- DQogICAgICAgICAgICBuPSIyOCI+IGhhbGxlbmdlIHRoZSB1bmlxdWUgd2F5
96
- cyB0aGF0IGxpdmUgbXVzaWMgYW5kIGRhbmNlXG5jb21tdW5pY2F0ZSBhbmQg
97
- aW50ZXJhPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0i
98
- MjkiPiBjdC48L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBu
99
- PSIzMCI+RFRFTkQ7VFpJRD1FYXN0ZXJuIFN0YW5kYXJkIFRpbWU6MjAxNDAx
100
- MjdUMjEzMDAwPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
101
- bj0iMzEiPkRUU1RBTVA6MjAxNDAxMDFUMDMxNDE2WjwvbGluZT4NCiAgICAg
102
- ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjMyIj5EVFNUQVJUO1RaSUQ9RWFz
103
- dGVybiBTdGFuZGFyZCBUaW1lOjIwMTQwMTI3VDE5MzAwMDwvbGluZT4NCiAg
104
- ICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjMzIj5MT0NBVElPTjo8L2xp
105
- bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSIzNCI+U0VRVUVO
106
- Q0U6MDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM1
107
- Ij5TVU1NQVJZOlJlYmVjY2EgU3Rlbm4gTW9kZXJuIERhbmNlPC9saW5lPg0K
108
- ICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMzYiPlVJRDo4ZTQwNWJm
109
- Yi0yY2RkLTQ0MzMtOTE4Ni1kOGIwODg0NTY0NDM8L2xpbmU+DQogICAgICAg
110
- IDxsaW5lDQogICAgICAgICAgICBuPSIzNyI+VVJMOmh0dHA6Ly93d3cua2Vl
111
- bmUuZWR1L25ld3MvZXZlbnRzL2RldGFpbC8xMjMyLzwvbGluZT4NCiAgICAg
112
- ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjM4Ij5FTkQ6VkVWRU5UPC9saW5l
113
- Pg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iMzkiPkJFR0lOOlZF
114
- VkVOVDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjQw
115
- Ij5DQVRFR09SSUVTOmFydDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAg
116
- ICAgICAgIG49IjQxIj5DQVRFR09SSUVTOmtzYzwvbGluZT4NCiAgICAgICAg
117
- PGxpbmUNCiAgICAgICAgICAgIG49IjQyIj5DQVRFR09SSUVTOnRoZWF0ZXI8
118
- L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI0MyI+Q0FU
119
- RUdPUklFUzp1bml2ZXJzaXR5PC9saW5lPg0KICAgICAgICA8bGluZQ0KICAg
120
- ICAgICAgICAgbj0iNDQiPkRFU0NSSVBUSU9OOkluIHRoZWlyIHByZW1pZXJl
121
- IEFtZXJpY2FuIHRvdXJcLCB0aGlzIGhpbGFyaW91cyBjaXJjdXNcbnRyb3Vw
122
- ZTwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjQ1Ij4g
123
- IGZlYXR1cmVzIGxvZy13YWxraW5nXCwgc3Bvb24tY2xhY2tpbmdcLCBoYXRj
124
- aGV0LWp1Z2dsaW5nXCwgY2xvZy1kYW5jaW5nXCw8L2xpbmU+DQogICAgICAg
125
- IDxsaW5lDQogICAgICAgICAgICBuPSI0NiI+ICBhbmQgZXZlbiBoaWppbmtz
126
- IG9uIGFuIG91dGhvdXNlISBBIHNtb3JnYXNib3JkIG9mIGZhbWlseSBmdW4g
127
- YmFzZWQgb24gdGhlPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAg
128
- ICAgbj0iNDciPiAgbG9nZ2luZyB0cmFkaXRpb24gd2l0aCB0cm91cGVycyBw
129
- ZXJmb3JtaW5nIGRhcmluZyBrbmlmZSB0cmlja3MgYW5kIGFjcm9iYTwvbGlu
130
- ZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAgIG49IjQ4Ij4gdGljIGZl
131
- YXRzIHRvIHRoZSB0b2UtdGFwcGluZyBzb3VuZHMgb2YgUXVlYmVjb2lzIGZv
132
- bGsgbXVzaWMuPC9saW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAg
133
- bj0iNDkiPkRURU5EO1RaSUQ9RWFzdGVybiBTdGFuZGFyZCBUaW1lOjIwMTQw
134
- MjAxVDE2MDAwMDwvbGluZT4NCiAgICAgICAgPGxpbmUNCiAgICAgICAgICAg
135
- IG49IjUwIj5EVFNUQU1QOjIwMTQwMTAxVDAzMTQxNlo8L2xpbmU+DQogICAg
136
- ICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1MSI+RFRTVEFSVDtUWklEPUVh
137
- c3Rlcm4gU3RhbmRhcmQgVGltZToyMDE0MDIwMVQxNDAwMDA8L2xpbmU+DQog
138
- ICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1MiI+TE9DQVRJT046PC9s
139
- aW5lPg0KICAgICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTMiPlNFUVVF
140
- TkNFOjA8L2xpbmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1
141
- NCI+U1VNTUFSWTpDaXJxdWUgQWxmb25zZSBpbiAiVGltYmVyISI8L2xpbmU+
142
- DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1NSI+VUlEOjUyOGMx
143
- MzhlLWYwMGYtNDgxYi05N2JjLTc0N2FlMTdjMDI4MjwvbGluZT4NCiAgICAg
144
- ICAgPGxpbmUNCiAgICAgICAgICAgIG49IjU2Ij5VUkw6aHR0cDovL3d3dy5r
145
- ZWVuZS5lZHUvbmV3cy9ldmVudHMvZGV0YWlsLzEyMzMvPC9saW5lPg0KICAg
146
- ICAgICA8bGluZQ0KICAgICAgICAgICAgbj0iNTciPkVORDpWRVZFTlQ8L2xp
147
- bmU+DQogICAgICAgIDxsaW5lDQogICAgICAgICAgICBuPSI1OCI+RU5EOlZD
148
- QUxFTkRBUjwvbGluZT4NCiAgICA8L2NhbGVuZGFyTGluZXM+DQogICAgPHZh
149
- bGlkYXRpb25SZXN1bHRzDQogICAgICAgIHJ1bGVzZXQ9IlN0cmljdF8yXzAi
150
- DQogICAgICAgIHJ1bGVzZXRTdHJpbmc9ImlDYWxlbmRhciAyLjAgU3RyaWN0
151
- Ig0KICAgICAgICBydWxlc2V0RGVzY3JpcHRpb249IiYjeEQ7JiN4QTsgICAg
152
- ICAgIFZhbGlkYXRlcyBpQ2FsZW5kYXJzIGFnYWluc3QgdGhlIElFVEYgc3Rh
153
- bmRhcmRzIGluIGEgc3RyaWN0IGZhc2hpb24uICBBbnkgdmFyaWF0aW9ucyBm
154
- cm9tIHRoZSBzdGFuZGFyZCYjeEQ7JiN4QTsgICAgICAgIHdpbGwgYmUgcmVw
155
- b3J0ZWQuJiN4RDsmI3hBOyAgICAiDQogICAgICAgIHNjb3JlPSIxMDAiPg0K
156
- ICAgICAgICA8Y2FsZW5kYXJJbmZvcz4NCiAgICAgICAgICAgIDxjYWxlbmRh
157
- ckluZm8NCiAgICAgICAgICAgICAgICB0aW1lWm9uZUNvdW50PSIxIg0KICAg
158
- ICAgICAgICAgICAgIGV2ZW50Q291bnQ9IjIiDQogICAgICAgICAgICAgICAg
159
- dG9kb0NvdW50PSIwIg0KICAgICAgICAgICAgICAgIGpvdXJuYWxDb3VudD0i
160
- MCINCiAgICAgICAgICAgICAgICBmcmVlQnVzeUNvdW50PSIwIg0KICAgICAg
161
- ICAgICAgICAgIGNhbGVuZGFyVmVyc2lvbj0iMi4wIg0KICAgICAgICAgICAg
162
- ICAgIHByb2RJRD0iLS8vZGRheXNvZnR3YXJlLmNvbS8vTk9OU0dNTCBERGF5
163
- LmlDYWwgMS4wLy9FTiIgLz4NCiAgICAgICAgPC9jYWxlbmRhckluZm9zPg0K
164
- ICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0i
165
- ZW1wdHlMaW5lIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAg
166
- ICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iY3Js
167
- ZlBhaXJzIg0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAg
168
- ICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0ibGluZUZv
169
- bGRpbmciDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAg
170
- IDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJ2ZXJzaW9u
171
- Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
172
- aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0icHJvZElEIg0KICAg
173
- ICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlv
174
- blJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iY2FsU2NhbGUiDQogICAgICAg
175
- ICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVz
176
- dWx0DQogICAgICAgICAgICBydWxlPSJtZXRob2QiDQogICAgICAgICAgICBy
177
- ZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQog
178
- ICAgICAgICAgICBydWxlPSJjb21wb25lbnQiDQogICAgICAgICAgICByZXN1
179
- bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAg
180
- ICAgICAgICBydWxlPSIiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+
181
- DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxl
182
- PSJldmVudEF0dGFjaFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJw
183
- YXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAg
184
- ICAgcnVsZT0iZXZlbnRBdHRlbmRlZVByb3BlcnR5Ig0KICAgICAgICAgICAg
185
- cmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0K
186
- ICAgICAgICAgICAgcnVsZT0iZXZlbnRDYXRlZ29yaWVzUHJvcGVydHkiDQog
187
- ICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0
188
- aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudENsYXNzUHJvcGVy
189
- dHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2
190
- YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudENvbW1l
191
- bnRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAg
192
- ICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2
193
- ZW50Q29udGFjdFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNz
194
- IiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAg
195
- cnVsZT0iZXZlbnRDcmVhdGVkUHJvcGVydHkiDQogICAgICAgICAgICByZXN1
196
- bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAg
197
- ICAgICAgICBydWxlPSJldmVudERlc2NyaXB0aW9uUHJvcGVydHkiDQogICAg
198
- ICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9u
199
- UmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudERURW5kRHVyYXRpb25D
200
- b25mbGljdCINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
201
- ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50
202
- RFRFbmRQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4N
203
- CiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9
204
- ImV2ZW50RFRTdGFydFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJw
205
- YXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAg
206
- ICAgcnVsZT0iZXZlbnREVFN0YW1wUHJvcGVydHkiDQogICAgICAgICAgICBy
207
- ZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQog
208
- ICAgICAgICAgICBydWxlPSJldmVudER1cmF0aW9uUHJvcGVydHkiDQogICAg
209
- ICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9u
210
- UmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudEV4RGF0ZVByb3BlcnR5
211
- Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFs
212
- aWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRFeFJ1bGVQ
213
- cm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
214
- ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50
215
- R2VvUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQog
216
- ICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJl
217
- dmVudExhc3RNb2RQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFz
218
- cyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAg
219
- IHJ1bGU9ImV2ZW50TG9jYXRpb25Qcm9wZXJ0eSINCiAgICAgICAgICAgIHJl
220
- c3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAg
221
- ICAgICAgICAgIHJ1bGU9ImV2ZW50T3JnYW5pemVyUHJvcGVydHkiDQogICAg
222
- ICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9u
223
- UmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudFByaW9yaXR5UHJvcGVy
224
- dHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2
225
- YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVudFJEYXRl
226
- UHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+DQogICAg
227
- ICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxlPSJldmVu
228
- dFJlY3VySURQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIg
229
- Lz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1
230
- bGU9ImV2ZW50UmVsYXRlZFByb3BlcnR5Ig0KICAgICAgICAgICAgcmVzdWx0
231
- PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3VsdA0KICAgICAg
232
- ICAgICAgcnVsZT0iZXZlbnRSZXNvdXJjZXNQcm9wZXJ0eSINCiAgICAgICAg
233
- ICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1
234
- bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50UlN0YXR1c1Byb3BlcnR5Ig0K
235
- ICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRh
236
- dGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRSUnVsZVByb3Bl
237
- cnR5Ig0KICAgICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8
238
- dmFsaWRhdGlvblJlc3VsdA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRTZXFQ
239
- cm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAg
240
- ICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50
241
- U3RhdHVzUHJvcGVydHkiDQogICAgICAgICAgICByZXN1bHQ9InBhc3MiIC8+
242
- DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQogICAgICAgICAgICBydWxl
243
- PSJldmVudFN1bW1hcnlQcm9wZXJ0eSINCiAgICAgICAgICAgIHJlc3VsdD0i
244
- cGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25SZXN1bHQNCiAgICAgICAg
245
- ICAgIHJ1bGU9ImV2ZW50VHJhbnNwUHJvcGVydHkiDQogICAgICAgICAgICBy
246
- ZXN1bHQ9InBhc3MiIC8+DQogICAgICAgIDx2YWxpZGF0aW9uUmVzdWx0DQog
247
- ICAgICAgICAgICBydWxlPSJldmVudFVpZFByb3BlcnR5Ig0KICAgICAgICAg
248
- ICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgICAgICA8dmFsaWRhdGlvblJlc3Vs
249
- dA0KICAgICAgICAgICAgcnVsZT0iZXZlbnRVcmxQcm9wZXJ0eSINCiAgICAg
250
- ICAgICAgIHJlc3VsdD0icGFzcyIgLz4NCiAgICAgICAgPHZhbGlkYXRpb25S
251
- ZXN1bHQNCiAgICAgICAgICAgIHJ1bGU9ImV2ZW50WFByb3BlcnR5Ig0KICAg
252
- ICAgICAgICAgcmVzdWx0PSJwYXNzIiAvPg0KICAgIDwvdmFsaWRhdGlvblJl
253
- c3VsdHM+DQo8L3Jlc3VsdHM+
254
- http_version:
255
- recorded_at: Wed, 01 Jan 2014 03:14:18 GMT
256
- recorded_with: VCR 2.5.0
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe IcsValidator::FeedValidator, :vcr do
4
-
5
- context "given a valid ICS feed" do
6
- let(:valid_ics_feed_url) {
7
- "http://elmcity.cloudapp.net/elmcity/ics?view=art"
8
- }
9
-
10
- subject { described_class.new(valid_ics_feed_url) }
11
-
12
- describe "#valid?" do
13
- it "returns true" do
14
- subject.should be_valid
15
- end
16
- end
17
- end
18
-
19
- context "given an invalid ICS feed" do
20
- let(:invalid_ics_feed_url) {
21
- "http://example.com/"
22
- }
23
-
24
- subject { described_class.new(invalid_ics_feed_url) }
25
-
26
- describe "#valid?" do
27
- it "returns false" do
28
- subject.should_not be_valid
29
- end
30
- end
31
- end
32
-
33
- end
@@ -1,33 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe IcsValidator::FileValidator, :vcr do
4
-
5
- context "given a valid ICS file" do
6
- let(:valid_ics_file) {
7
- File.expand_path('../../fixtures/icalendar/valid.ics', __FILE__)
8
- }
9
-
10
- subject { described_class.new(valid_ics_file) }
11
-
12
- describe "#valid?" do
13
- it "returns true" do
14
- subject.should be_valid
15
- end
16
- end
17
- end
18
-
19
- context "given an invalid ICS file" do
20
- let(:invalid_ics_file) {
21
- File.expand_path('../../fixtures/icalendar/invalid.ics', __FILE__)
22
- }
23
-
24
- subject { described_class.new(invalid_ics_file) }
25
-
26
- describe "#valid?" do
27
- it "returns false" do
28
- subject.should_not be_valid
29
- end
30
- end
31
- end
32
-
33
- end
@@ -1,57 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe IcsValidator::SnippetValidator, :vcr do
4
-
5
- context "given a valid ICS snippet" do
6
- let(:valid_ics_snippet) {
7
- <<-EOF
8
- BEGIN:VCALENDAR
9
- VERSION:2.0
10
- CALSCALE:GREGORIAN
11
- METHOD:PUBLISH
12
- PRODID:iCalendar-Ruby
13
- BEGIN:VTIMEZONE
14
- TZID:America/New_York
15
- BEGIN:DAYLIGHT
16
- DTSTART:19700308T020000
17
- RRULE:FREQ=YEARLY;BYMONTH=3;BYDAY=2SU
18
- TZNAME:EDT
19
- TZOFFSETFROM:-0500
20
- TZOFFSETTO:-0400
21
- END:DAYLIGHT
22
- BEGIN:STANDARD
23
- DTSTART:19701101T020000
24
- RRULE:FREQ=YEARLY;BYMONTH=11;BYDAY=1SU
25
- TZNAME:EST
26
- TZOFFSETFROM:-0400
27
- TZOFFSETTO:-0500
28
- END:STANDARD
29
- END:VTIMEZONE
30
- END:VCALENDAR
31
- EOF
32
- }
33
-
34
- subject { described_class.new(valid_ics_snippet) }
35
-
36
- describe "#valid?" do
37
- it "returns true" do
38
- subject.should be_valid
39
- end
40
- end
41
- end
42
-
43
- context "given an invalid ICS snippet" do
44
- let(:invalid_ics_snippet) {
45
- "LOL. THIS ISN'T EVEN CLOSE"
46
- }
47
-
48
- subject { described_class.new(invalid_ics_snippet) }
49
-
50
- describe "#valid?" do
51
- it "returns false" do
52
- subject.should_not be_valid
53
- end
54
- end
55
- end
56
-
57
- end