calendarium-romanum-remote 0.1.0 → 0.2.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.
- checksums.yaml +4 -4
- data/lib/calendarium-romanum/remote.rb +6 -5
- data/lib/calendarium-romanum/remote/calendar.rb +9 -12
- data/lib/calendarium-romanum/remote/driver.rb +47 -0
- data/lib/calendarium-romanum/remote/errors.rb +5 -6
- data/lib/calendarium-romanum/remote/v0/denormalizer.rb +61 -0
- data/lib/calendarium-romanum/remote/v0/uri_scheme.rb +21 -0
- data/lib/calendarium-romanum/remote/version.rb +4 -2
- data/spec/calendar_spec.rb +71 -18
- data/spec/spec_helper.rb +5 -0
- metadata +48 -7
- data/lib/calendarium-romanum/remote/drivers.rb +0 -17
- data/lib/calendarium-romanum/remote/drivers/net_http_driver.rb +0 -52
- data/lib/calendarium-romanum/remote/v0/deserializer.rb +0 -28
- data/spec/drivers_spec.rb +0 -94
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a5888b0e5f69d9b5ce0050ffb65e7ce87049d411
|
4
|
+
data.tar.gz: 7a98baf6c8de7f79988fa9a92ef310f239509ef4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 28ca711f6238c89197d45df0c11f655484570a953eae40c57b72e6f7de0760b607569216cddc076616a9a50014e5daf7e267ab5e5820641a4e2cec270189f42e
|
7
|
+
data.tar.gz: 3a2fb22ceddb56e7d97f48726865f7892d95198d46285beaa2a411bc974379257f98e8e30cb914e28e40501ed0135489b6f077a6154b9c52f938fcb226eb3c24
|
@@ -2,16 +2,17 @@ module CalendariumRomanum
|
|
2
2
|
module Remote; end
|
3
3
|
end
|
4
4
|
|
5
|
-
require '
|
6
|
-
require '
|
5
|
+
require 'httpi'
|
6
|
+
require 'multi_json'
|
7
|
+
require 'dry-schema'
|
7
8
|
|
8
9
|
%w(
|
9
10
|
version
|
10
11
|
calendar
|
11
|
-
|
12
|
-
drivers/net_http_driver
|
12
|
+
driver
|
13
13
|
errors
|
14
|
-
v0/
|
14
|
+
v0/denormalizer
|
15
|
+
v0/uri_scheme
|
15
16
|
).each do |path|
|
16
17
|
require_relative File.join('remote', path)
|
17
18
|
end
|
@@ -8,18 +8,16 @@ module CalendariumRomanum
|
|
8
8
|
class Calendar
|
9
9
|
extend Forwardable
|
10
10
|
|
11
|
-
def initialize(year, calendar_uri,
|
11
|
+
def initialize(year, calendar_uri, driver: nil)
|
12
12
|
@year = year
|
13
13
|
@calendar_uri = calendar_uri
|
14
|
+
|
14
15
|
@driver =
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
driver
|
21
|
-
end
|
22
|
-
@deserializer = V0::Deserializer.new
|
16
|
+
driver ||
|
17
|
+
Driver.new(
|
18
|
+
V0::UriScheme.new(calendar_uri),
|
19
|
+
V0::Denormalizer.new
|
20
|
+
)
|
23
21
|
|
24
22
|
# only for most fundamental computations made locally
|
25
23
|
@temporale = Temporale.new(year)
|
@@ -47,8 +45,7 @@ module CalendariumRomanum
|
|
47
45
|
#range_check date
|
48
46
|
end
|
49
47
|
|
50
|
-
|
51
|
-
@deserializer.call serialized
|
48
|
+
@driver.day date
|
52
49
|
end
|
53
50
|
|
54
51
|
def lectionary
|
@@ -68,7 +65,7 @@ module CalendariumRomanum
|
|
68
65
|
private
|
69
66
|
|
70
67
|
def year_spec
|
71
|
-
@year_spec ||=
|
68
|
+
@year_spec ||= @driver.year(@year)
|
72
69
|
end
|
73
70
|
end
|
74
71
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module CalendariumRomanum
|
2
|
+
module Remote
|
3
|
+
# Orchestrates retrieval and deserialization of calendar data
|
4
|
+
# from a server accessed throught HTTP GET requests
|
5
|
+
# and returning JSON responses.
|
6
|
+
class Driver
|
7
|
+
def initialize(uri_scheme, denormalizer)
|
8
|
+
@uri_scheme = uri_scheme
|
9
|
+
@denormalizer = denormalizer
|
10
|
+
end
|
11
|
+
|
12
|
+
def day(date)
|
13
|
+
process :day, date
|
14
|
+
end
|
15
|
+
|
16
|
+
def year(year)
|
17
|
+
process :year, year
|
18
|
+
end
|
19
|
+
|
20
|
+
protected
|
21
|
+
|
22
|
+
def process(action, argument)
|
23
|
+
uri = @uri_scheme.public_send action, argument
|
24
|
+
response = request uri
|
25
|
+
handle_errors response
|
26
|
+
data = MultiJson.load response.body
|
27
|
+
|
28
|
+
@denormalizer.public_send action, data
|
29
|
+
end
|
30
|
+
|
31
|
+
def request(uri)
|
32
|
+
request = HTTPI::Request.new uri
|
33
|
+
request.headers['Accept'] = 'application/json'
|
34
|
+
request.headers['User-Agent'] =
|
35
|
+
'calendarium-romanum-remote/' + Remote::VERSION
|
36
|
+
|
37
|
+
HTTPI.get request
|
38
|
+
end
|
39
|
+
|
40
|
+
def handle_errors(response)
|
41
|
+
if response.code != 200
|
42
|
+
raise UnexpectedResponseError.new("Unexpected HTTP status #{response.code.inspect}")
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -4,12 +4,11 @@ module CalendariumRomanum
|
|
4
4
|
# never itself instantiated
|
5
5
|
class Error < ::RuntimeError; end
|
6
6
|
|
7
|
-
# server
|
8
|
-
|
7
|
+
# the server responded with a response which cannot be
|
8
|
+
# transformed to valid calendar data
|
9
|
+
class UnexpectedResponseError < Error; end
|
9
10
|
|
10
|
-
# server
|
11
|
-
class
|
12
|
-
|
13
|
-
class TransportError < Error; end
|
11
|
+
# the server returned data which we don't understand
|
12
|
+
class InvalidDataError < Error; end
|
14
13
|
end
|
15
14
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module CalendariumRomanum
|
2
|
+
module Remote
|
3
|
+
module V0
|
4
|
+
class Denormalizer
|
5
|
+
def day(day_json)
|
6
|
+
check day_json, DaySchema
|
7
|
+
|
8
|
+
season_sym = day_json['season'].to_sym
|
9
|
+
|
10
|
+
CalendariumRomanum::Day.new(
|
11
|
+
date: Date.parse(day_json['date']),
|
12
|
+
season: CalendariumRomanum::Seasons.all.find {|s| s.symbol == season_sym},
|
13
|
+
season_week: day_json['season_week'],
|
14
|
+
celebrations: day_json['celebrations'].collect do |c|
|
15
|
+
colour_sym = c['colour'].to_sym
|
16
|
+
|
17
|
+
CalendariumRomanum::Celebration.new(
|
18
|
+
c['title'],
|
19
|
+
CalendariumRomanum::Ranks[c['rank_num']],
|
20
|
+
CalendariumRomanum::Colours.all.find {|c| c.symbol == colour_sym }
|
21
|
+
)
|
22
|
+
end
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
def year(year_json)
|
27
|
+
check year_json, YearSchema
|
28
|
+
|
29
|
+
# no denormalization takes place
|
30
|
+
year_json
|
31
|
+
end
|
32
|
+
|
33
|
+
protected
|
34
|
+
|
35
|
+
def check(data, schema)
|
36
|
+
errors = schema.call(data).errors
|
37
|
+
|
38
|
+
unless errors.empty?
|
39
|
+
raise InvalidDataError.new "Invalid data: #{errors.to_h}"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
DaySchema = Dry::Schema.JSON do
|
44
|
+
required(:date).filled(:string, format?: /^\d{4}-\d{2}-\d{2}$/)
|
45
|
+
required(:season).filled(:string)
|
46
|
+
required(:season_week).filled(:integer)
|
47
|
+
required(:celebrations).array(:hash) do
|
48
|
+
required(:title).filled(:string)
|
49
|
+
required(:colour).filled(:string)
|
50
|
+
required(:rank_num).filled(:float)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
YearSchema = Dry::Schema.JSON do
|
55
|
+
required(:lectionary).filled(:string, included_in?: %w(A B C))
|
56
|
+
required(:ferial_lectionary).filled(:integer, included_in?: [1, 2])
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module CalendariumRomanum
|
2
|
+
module Remote
|
3
|
+
module V0
|
4
|
+
class UriScheme
|
5
|
+
def initialize(calendar_uri)
|
6
|
+
@calendar_uri =
|
7
|
+
calendar_uri +
|
8
|
+
(calendar_uri.end_with?('/') ? '' : '/')
|
9
|
+
end
|
10
|
+
|
11
|
+
def day(date)
|
12
|
+
@calendar_uri + "#{date.year}/#{date.month}/#{date.day}"
|
13
|
+
end
|
14
|
+
|
15
|
+
def year(year)
|
16
|
+
@calendar_uri + year.to_s
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/spec/calendar_spec.rb
CHANGED
@@ -1,16 +1,19 @@
|
|
1
1
|
require_relative 'spec_helper'
|
2
2
|
|
3
|
+
# integration tests exercizing the whole stack and
|
4
|
+
# making (a lot of) actual HTTP requests!
|
3
5
|
describe CalendariumRomanum::Remote::Calendar do
|
4
6
|
CR = CalendariumRomanum
|
5
|
-
|
7
|
+
CRRemote = CalendariumRomanum::Remote
|
6
8
|
|
7
9
|
let(:year) { 2016 }
|
8
|
-
let(:
|
10
|
+
let(:uri) { REMOTE_CALENDAR_URI }
|
11
|
+
let(:calendar) { described_class.new year, uri }
|
9
12
|
|
10
13
|
describe '#year' do
|
11
14
|
it 'returns the year passed to the constructor' do
|
12
15
|
y = 2200
|
13
|
-
cal = described_class.new y,
|
16
|
+
cal = described_class.new y, uri
|
14
17
|
expect(cal.year).to eq y
|
15
18
|
end
|
16
19
|
end
|
@@ -25,7 +28,7 @@ describe CalendariumRomanum::Remote::Calendar do
|
|
25
28
|
|
26
29
|
describe '#==' do
|
27
30
|
describe 'same year and URI' do
|
28
|
-
let(:c) { described_class.new year,
|
31
|
+
let(:c) { described_class.new year, uri }
|
29
32
|
|
30
33
|
it 'is same' do
|
31
34
|
expect(c == calendar).to be true
|
@@ -33,7 +36,7 @@ describe CalendariumRomanum::Remote::Calendar do
|
|
33
36
|
end
|
34
37
|
|
35
38
|
describe 'year differs' do
|
36
|
-
let(:c) { described_class.new year + 1,
|
39
|
+
let(:c) { described_class.new year + 1, uri }
|
37
40
|
|
38
41
|
it 'is different' do
|
39
42
|
expect(c == calendar).to be false
|
@@ -50,15 +53,13 @@ describe CalendariumRomanum::Remote::Calendar do
|
|
50
53
|
end
|
51
54
|
|
52
55
|
describe 'API-compatibility with Calendar' do
|
53
|
-
cls = CR::Calendar
|
54
|
-
|
55
56
|
describe 'instance methods' do
|
56
57
|
let(:year) { 2000 }
|
57
58
|
|
58
59
|
let(:origin) { CR::Calendar.new(year) }
|
59
|
-
let(:mirror) {
|
60
|
+
let(:mirror) { CRRemote::Calendar.new(year, uri) }
|
60
61
|
|
61
|
-
|
62
|
+
CR::Calendar.public_instance_methods.each do |method|
|
62
63
|
describe method do
|
63
64
|
it 'is defined by origin' do
|
64
65
|
expect(origin).to respond_to method
|
@@ -81,24 +82,76 @@ describe CalendariumRomanum::Remote::Calendar do
|
|
81
82
|
end
|
82
83
|
|
83
84
|
describe 'returns the same data as Calendar' do
|
84
|
-
|
85
|
-
|
86
|
-
# classical calendar
|
85
|
+
# classical calendar with the same settings as `calendar`
|
87
86
|
let(:sanctorale) { CR::Data::GENERAL_ROMAN_ENGLISH.load }
|
88
|
-
let(:
|
87
|
+
let(:local_calendar) { CR::Calendar.new(year, sanctorale) }
|
89
88
|
|
90
|
-
|
91
|
-
let(:uri) { REMOTE_CALENDAR_URI }
|
92
|
-
let(:remote) { described_class.new(year, uri) }
|
89
|
+
let(:remote_calendar) { calendar }
|
93
90
|
|
94
91
|
days = (CR::Temporale::Dates.first_advent_sunday(2016) ... CR::Temporale::Dates.first_advent_sunday(2017))
|
95
92
|
days.each do |date|
|
96
93
|
it date do
|
97
|
-
c =
|
98
|
-
r =
|
94
|
+
c = local_calendar.day date
|
95
|
+
r = remote_calendar.day date
|
99
96
|
|
100
97
|
expect(r).to eq c
|
101
98
|
end
|
102
99
|
end
|
103
100
|
end
|
101
|
+
|
102
|
+
describe 'errors' do
|
103
|
+
let(:date) { Date.new year, 1, 1 }
|
104
|
+
|
105
|
+
describe 'server does not exist' do
|
106
|
+
let(:uri) { 'http://does-not-exist.local/' }
|
107
|
+
|
108
|
+
it 'throws SocketError' do
|
109
|
+
expect do
|
110
|
+
calendar.day date
|
111
|
+
end.to raise_exception ::SocketError
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
describe 'server exists, wrong calendar URI' do
|
116
|
+
let(:wrong_calendar_uri) { uri + 'another-path-segment/' }
|
117
|
+
let(:calendar) { described_class.new year, wrong_calendar_uri }
|
118
|
+
|
119
|
+
it 'throws CalendariumRomanum::Remote::UnexpectedResponseError' do
|
120
|
+
expect do
|
121
|
+
calendar.day date
|
122
|
+
end.to raise_exception CRRemote::UnexpectedResponseError, /Unexpected HTTP status 404/
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
describe 'bad request - invalid date' do
|
127
|
+
# this shouldn't ever happen, but it's the easiest way
|
128
|
+
# to check how the calendar behaves in bad request scenarios
|
129
|
+
let(:date) do
|
130
|
+
d = Date.new
|
131
|
+
d.stub(:year) { 2000 }
|
132
|
+
d.stub(:month) { 13 }
|
133
|
+
d.stub(:day) { 40 }
|
134
|
+
|
135
|
+
d
|
136
|
+
end
|
137
|
+
|
138
|
+
it 'throws CalendariumRomanum::Remote::UnexpectedResponseError' do
|
139
|
+
expect do
|
140
|
+
calendar.day date
|
141
|
+
end.to raise_exception CRRemote::UnexpectedResponseError, /Unexpected HTTP status 400/
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
describe 'unsupported response content' do
|
146
|
+
it 'fails' do
|
147
|
+
# HTTP request will return empty JSON
|
148
|
+
response = HTTPI::Response.new 200, {}, '{}'
|
149
|
+
allow(HTTPI).to receive(:get).and_return(response)
|
150
|
+
|
151
|
+
expect do
|
152
|
+
calendar.day date
|
153
|
+
end.to raise_exception CRRemote::InvalidDataError, /Invalid data: {:date=>\["is missing"/
|
154
|
+
end
|
155
|
+
end
|
156
|
+
end
|
104
157
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,3 +1,6 @@
|
|
1
|
+
require 'simplecov'
|
2
|
+
SimpleCov.start
|
3
|
+
|
1
4
|
# This file was generated by the `rspec --init` command. Conventionally, all
|
2
5
|
# specs live under a `spec` directory, which RSpec adds to the `$LOAD_PATH`.
|
3
6
|
# The generated `.rspec` file contains `--require spec_helper` which will cause
|
@@ -103,3 +106,5 @@ require_relative '../lib/calendarium-romanum-remote'
|
|
103
106
|
|
104
107
|
REMOTE_CALENDAR_URI =
|
105
108
|
ENV['REMOTE_CALENDAR'] || 'http://calapi.inadiutorium.cz/api/v0/en/calendars/general-en/'
|
109
|
+
|
110
|
+
HTTPI.log = false
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: calendarium-romanum-remote
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jakub Pavlík
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2019-09-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: calendarium-romanum
|
@@ -24,6 +24,48 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 0.4.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: httpi
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '2.0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '2.0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: multi_json
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '1.13'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '1.13'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: dry-schema
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.3'
|
27
69
|
- !ruby/object:Gem::Dependency
|
28
70
|
name: rake
|
29
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -61,13 +103,12 @@ files:
|
|
61
103
|
- lib/calendarium-romanum-remote.rb
|
62
104
|
- lib/calendarium-romanum/remote.rb
|
63
105
|
- lib/calendarium-romanum/remote/calendar.rb
|
64
|
-
- lib/calendarium-romanum/remote/
|
65
|
-
- lib/calendarium-romanum/remote/drivers/net_http_driver.rb
|
106
|
+
- lib/calendarium-romanum/remote/driver.rb
|
66
107
|
- lib/calendarium-romanum/remote/errors.rb
|
67
|
-
- lib/calendarium-romanum/remote/v0/
|
108
|
+
- lib/calendarium-romanum/remote/v0/denormalizer.rb
|
109
|
+
- lib/calendarium-romanum/remote/v0/uri_scheme.rb
|
68
110
|
- lib/calendarium-romanum/remote/version.rb
|
69
111
|
- spec/calendar_spec.rb
|
70
|
-
- spec/drivers_spec.rb
|
71
112
|
- spec/readme_spec.rb
|
72
113
|
- spec/spec_helper.rb
|
73
114
|
homepage: http://github.com/igneus/calendarium-romanum-remote
|
@@ -91,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
91
132
|
version: '0'
|
92
133
|
requirements: []
|
93
134
|
rubyforge_project:
|
94
|
-
rubygems_version: 2.
|
135
|
+
rubygems_version: 2.6.11
|
95
136
|
signing_key:
|
96
137
|
specification_version: 4
|
97
138
|
summary: remote calendar extension for calendarium-romanum
|
@@ -1,17 +0,0 @@
|
|
1
|
-
module CalendariumRomanum
|
2
|
-
module Remote
|
3
|
-
module Drivers
|
4
|
-
def self.get(api_version, driver_id)
|
5
|
-
if api_version == :v0
|
6
|
-
if driver_id == :net_http
|
7
|
-
return NetHttpDriver.new
|
8
|
-
else
|
9
|
-
raise ArgumentError.new("Unsupported driver #{driver_id}")
|
10
|
-
end
|
11
|
-
else
|
12
|
-
raise ArgumentError.new("Unsupported API version #{api_version.inspect}")
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
@@ -1,52 +0,0 @@
|
|
1
|
-
module CalendariumRomanum
|
2
|
-
module Remote
|
3
|
-
module Drivers
|
4
|
-
# Communicates with the remote API using Ruby standard library
|
5
|
-
class NetHttpDriver
|
6
|
-
def get(date, calendar_uri)
|
7
|
-
uri_str =
|
8
|
-
calendar_uri +
|
9
|
-
(calendar_uri.end_with?('/') ? '' : '/') +
|
10
|
-
"#{date.year}/#{date.month}/#{date.day}"
|
11
|
-
uri = URI(uri_str)
|
12
|
-
|
13
|
-
get_request uri
|
14
|
-
end
|
15
|
-
|
16
|
-
def year(year, calendar_uri)
|
17
|
-
uri_str =
|
18
|
-
calendar_uri +
|
19
|
-
(calendar_uri.end_with?('/') ? '' : '/') +
|
20
|
-
year.to_s
|
21
|
-
uri = URI(uri_str)
|
22
|
-
|
23
|
-
get_request uri
|
24
|
-
end
|
25
|
-
|
26
|
-
private
|
27
|
-
|
28
|
-
def get_request(uri)
|
29
|
-
begin
|
30
|
-
response = Net::HTTP.get_response uri
|
31
|
-
rescue SocketError, Errno::ECONNREFUSED => err
|
32
|
-
raise ServerNotFoundError.new err.message
|
33
|
-
rescue Timeout::Error, Errno::EINVAL,
|
34
|
-
Errno::ECONNRESET, EOFError,
|
35
|
-
Net::HTTPBadResponse, Net::HTTPHeaderSyntaxError,
|
36
|
-
Net::ProtocolError => err
|
37
|
-
raise TransportError.new err.message
|
38
|
-
end
|
39
|
-
|
40
|
-
if response.code == '200'
|
41
|
-
return response.body
|
42
|
-
elsif response.code == '400'
|
43
|
-
json = JSON.parse(response.body)
|
44
|
-
raise BadRequestError.new(json['error'])
|
45
|
-
else
|
46
|
-
raise Error.new("Unexpected status #{response.code.inspect}")
|
47
|
-
end
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
module CalendariumRomanum
|
2
|
-
module Remote
|
3
|
-
module V0
|
4
|
-
class Deserializer
|
5
|
-
def call(day_str)
|
6
|
-
parsed = JSON.parse day_str
|
7
|
-
|
8
|
-
season_sym = parsed['season'].to_sym
|
9
|
-
|
10
|
-
CalendariumRomanum::Day.new(
|
11
|
-
date: Date.parse(parsed['date']),
|
12
|
-
season: CalendariumRomanum::Seasons.all.find {|s| s.symbol == season_sym},
|
13
|
-
season_week: parsed['season_week'],
|
14
|
-
celebrations: parsed['celebrations'].collect do |c|
|
15
|
-
colour_sym = c['colour'].to_sym
|
16
|
-
|
17
|
-
CalendariumRomanum::Celebration.new(
|
18
|
-
c['title'],
|
19
|
-
CalendariumRomanum::Ranks[c['rank_num']],
|
20
|
-
CalendariumRomanum::Colours.all.find {|c| c.symbol == colour_sym }
|
21
|
-
)
|
22
|
-
end
|
23
|
-
)
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
data/spec/drivers_spec.rb
DELETED
@@ -1,94 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe CalendariumRomanum::Remote::Drivers do
|
4
|
-
CRRem = CalendariumRomanum::Remote
|
5
|
-
|
6
|
-
let(:base_uri) { REMOTE_CALENDAR_URI }
|
7
|
-
let(:date) { Date.new 2000, 1, 1 }
|
8
|
-
|
9
|
-
shared_examples 'any driver' do
|
10
|
-
describe 'success' do
|
11
|
-
it 'returns a string' do
|
12
|
-
r = driver.get date, base_uri
|
13
|
-
expect(r).to be_a String
|
14
|
-
expect(r).not_to be_empty
|
15
|
-
end
|
16
|
-
|
17
|
-
it 'returns a valid JSON' do
|
18
|
-
r = driver.get date, base_uri
|
19
|
-
expect do
|
20
|
-
JSON.parse(r)
|
21
|
-
end.not_to raise_exception
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
describe 'server not found' do
|
26
|
-
let(:base_uri) { 'http://unknown.server.xyz' }
|
27
|
-
|
28
|
-
it 'fails' do
|
29
|
-
expect do
|
30
|
-
driver.get date, base_uri
|
31
|
-
end.to raise_exception CRRem::ServerNotFoundError
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
describe 'connection refused' do
|
36
|
-
let(:base_uri) { 'http://localhost:33333' }
|
37
|
-
|
38
|
-
it 'fails' do
|
39
|
-
expect do
|
40
|
-
driver.get date, base_uri
|
41
|
-
end.to raise_exception CRRem::ServerNotFoundError
|
42
|
-
end
|
43
|
-
end
|
44
|
-
|
45
|
-
describe 'calendar not found' do
|
46
|
-
let(:base_uri) { REMOTE_CALENDAR_URI.sub(/(?<=calendars\/).*$/, 'unknown-calendar') }
|
47
|
-
|
48
|
-
it 'fails' do
|
49
|
-
expect do
|
50
|
-
driver.get date, base_uri
|
51
|
-
end.to raise_exception CRRem::BadRequestError
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
describe 'invalid date' do
|
56
|
-
# this won't ever happen, but the driver must be prepared
|
57
|
-
# to handle bad request scenarios
|
58
|
-
let(:date) { double(year: 2000, month: 13, day: 40) }
|
59
|
-
|
60
|
-
it 'fails' do
|
61
|
-
expect do
|
62
|
-
driver.get date, base_uri
|
63
|
-
end.to raise_exception CRRem::BadRequestError
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
describe CalendariumRomanum::Remote::Drivers::NetHttpDriver do
|
69
|
-
let(:driver) { described_class.new }
|
70
|
-
|
71
|
-
it_behaves_like 'any driver'
|
72
|
-
|
73
|
-
# implementation-specific error handling
|
74
|
-
describe 'network error' do
|
75
|
-
[
|
76
|
-
Timeout::Error,
|
77
|
-
Errno::EINVAL,
|
78
|
-
Errno::ECONNRESET,
|
79
|
-
EOFError,
|
80
|
-
Net::HTTPBadResponse,
|
81
|
-
Net::HTTPHeaderSyntaxError,
|
82
|
-
Net::ProtocolError
|
83
|
-
].each do |etype|
|
84
|
-
it 'fails' do
|
85
|
-
allow(Net::HTTP).to receive(:get_response).and_raise(etype)
|
86
|
-
|
87
|
-
expect do
|
88
|
-
driver.get date, base_uri
|
89
|
-
end.to raise_exception CRRem::TransportError
|
90
|
-
end
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
end
|