vacation_rentals_ical_adapters 0.1.1 → 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Changelog.md +6 -1
- data/README.md +3 -1
- data/lib/vacation_rentals_ical_adapters/adapters.rb +4 -0
- data/lib/vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter.rb +61 -0
- data/lib/vacation_rentals_ical_adapters/adapters/json_availability_map_adapter.rb +66 -0
- data/lib/vacation_rentals_ical_adapters/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4259c4711c3db9de4cad1c918948a4dbb9f4bafa
|
4
|
+
data.tar.gz: cf96ec04b08aae31e71d03bda91efda50cad3f3a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d922df7ed7861121fb5a6a25bfd221660150c858244d7834f1b2ed79b05a08c2c0504cf6955e175573fa8738d771bef1a279be33f9b1f06a7a2bc8d6ee1369f
|
7
|
+
data.tar.gz: 8b622ebfe7a508b263082a2b1fbabb9232553faadecf25c2f3b097abdcc2387ad935d57f5d883b28ac7b13cf306b9cbaca48f9a5c9ab22555031c53b736e0471
|
data/Changelog.md
CHANGED
@@ -1,7 +1,12 @@
|
|
1
|
-
#
|
1
|
+
# VacationRentalsIcalAdapters Changelog
|
2
2
|
|
3
3
|
## master
|
4
4
|
|
5
|
+
## 0.1.2
|
6
|
+
|
7
|
+
- [Feature] Add CsvBookedDays adapter by @ZenCocoon
|
8
|
+
- [Feature] Add JsonAvailabilityMap adapter by @ZenCocoon
|
9
|
+
|
5
10
|
## 0.1.1
|
6
11
|
|
7
12
|
Update notes:
|
data/README.md
CHANGED
@@ -2,8 +2,10 @@
|
|
2
2
|
|
3
3
|
Gem for converting different formats from various vacation rental distribution channels to iCal format. So far it handles the following adapters:
|
4
4
|
|
5
|
-
- iCal
|
5
|
+
- iCal Adapter: returns not changed iCal body if it is indeed iCal format
|
6
6
|
- XML Arkiane Adapter - transforms XML response from xml.arkiane.com for given property into iCal format
|
7
|
+
- CSV BookedDays Adapter - check the code for example payload
|
8
|
+
- JSON Availability Map Adapter - check the code for example payload
|
7
9
|
|
8
10
|
## Installation
|
9
11
|
|
@@ -19,7 +19,11 @@ class VacationRentalsIcalAdapters::Adapters
|
|
19
19
|
|
20
20
|
require "vacation_rentals_ical_adapters/adapters/ical_adapter"
|
21
21
|
require "vacation_rentals_ical_adapters/adapters/xml_arkiane_adapter"
|
22
|
+
require "vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter"
|
23
|
+
require "vacation_rentals_ical_adapters/adapters/json_availability_map_adapter"
|
22
24
|
|
23
25
|
register(IcalAdapter.new) # must be first
|
24
26
|
register(XmlArkianeAdapter.new)
|
27
|
+
register(CsvBookedDaysAdapter.new)
|
28
|
+
register(JsonAvailabilityMapAdapter.new)
|
25
29
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require "vacation_rentals_ical_adapters/event"
|
2
|
+
require "vacation_rentals_ical_adapters/ical_converter"
|
3
|
+
|
4
|
+
#
|
5
|
+
# CSV Booked Days response format should be similar to:
|
6
|
+
#
|
7
|
+
# 2016-12-08,2016-12-09,2016-12-15
|
8
|
+
#
|
9
|
+
class VacationRentalsIcalAdapters::Adapters::CsvBookedDaysAdapter
|
10
|
+
def applicable?(body:, source:)
|
11
|
+
return false if source.nil?
|
12
|
+
source.split(".").last == "booked_days"
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_ical(body)
|
16
|
+
events = parse_events(body)
|
17
|
+
VacationRentalsIcalAdapters::IcalConverter.to_ical(events)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
def parse_events(body)
|
23
|
+
extract_ranges(body).map do |range|
|
24
|
+
VacationRentalsIcalAdapters::Event.new(
|
25
|
+
start_date: range[:start_date].iso8601,
|
26
|
+
end_date: range[:end_date].iso8601
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def extract_ranges(body)
|
32
|
+
return [] if body.nil?
|
33
|
+
|
34
|
+
merge_booked_days body.strip.split(",").map(&:to_date)
|
35
|
+
end
|
36
|
+
|
37
|
+
def merge_booked_days(days)
|
38
|
+
ranges = []
|
39
|
+
days_length = days.length
|
40
|
+
|
41
|
+
current_start_date = nil
|
42
|
+
previous_end_date = nil
|
43
|
+
|
44
|
+
days.each_with_index do |day, index|
|
45
|
+
current_start_date ||= day
|
46
|
+
|
47
|
+
if previous_end_date && day > previous_end_date.advance(days: 1)
|
48
|
+
ranges << { start_date: current_start_date, end_date: previous_end_date.advance(days: 1) }
|
49
|
+
current_start_date = day
|
50
|
+
previous_end_date = day
|
51
|
+
else
|
52
|
+
previous_end_date = day
|
53
|
+
end
|
54
|
+
|
55
|
+
if index + 1 == days_length
|
56
|
+
ranges << { start_date: current_start_date, end_date: previous_end_date.advance(days: 1) }
|
57
|
+
end
|
58
|
+
end
|
59
|
+
ranges
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "vacation_rentals_ical_adapters/event"
|
2
|
+
require "vacation_rentals_ical_adapters/ical_converter"
|
3
|
+
|
4
|
+
#
|
5
|
+
# Availability map response format should be similar to
|
6
|
+
#
|
7
|
+
# {
|
8
|
+
# "availabilities": [
|
9
|
+
# {
|
10
|
+
# "map":"1111100000000011",
|
11
|
+
# "start_date":"2016-12-08"
|
12
|
+
# }
|
13
|
+
# ]
|
14
|
+
# }
|
15
|
+
#
|
16
|
+
class VacationRentalsIcalAdapters::Adapters::JsonAvailabilityMapAdapter
|
17
|
+
def applicable?(body:, source:)
|
18
|
+
begin
|
19
|
+
availability = JSON.parse(body)["availabilities"][0]
|
20
|
+
!!(availability["map"].present? && availability["start_date"].to_date)
|
21
|
+
rescue
|
22
|
+
false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def to_ical(body)
|
27
|
+
events = parse_events(body)
|
28
|
+
VacationRentalsIcalAdapters::IcalConverter.to_ical(events)
|
29
|
+
end
|
30
|
+
|
31
|
+
private
|
32
|
+
|
33
|
+
def parse_events(body)
|
34
|
+
extract_ranges(body).map do |range|
|
35
|
+
VacationRentalsIcalAdapters::Event.new(
|
36
|
+
start_date: range[:start_date].iso8601,
|
37
|
+
end_date: range[:end_date].iso8601
|
38
|
+
)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def extract_ranges(body)
|
43
|
+
availability = JSON.parse(body)["availabilities"][0]
|
44
|
+
days = availability["map"].split(//)
|
45
|
+
start_date = availability["start_date"].to_date
|
46
|
+
end_date = start_date.advance(days: days.length)
|
47
|
+
|
48
|
+
ranges = []
|
49
|
+
previous_state = nil
|
50
|
+
range_start_date = start_date
|
51
|
+
|
52
|
+
(start_date..end_date).each_with_index do |day, index|
|
53
|
+
previous_state ||= days[index]
|
54
|
+
current_state = days[index]
|
55
|
+
|
56
|
+
if current_state != previous_state
|
57
|
+
ranges << { start_date: range_start_date, end_date: day, state: previous_state }
|
58
|
+
|
59
|
+
range_start_date = day
|
60
|
+
previous_state = current_state
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
ranges.find_all { |range| range[:state] != "0" }
|
65
|
+
end
|
66
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vacation_rentals_ical_adapters
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Karol Galanciak
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-11
|
11
|
+
date: 2016-12-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -142,7 +142,9 @@ files:
|
|
142
142
|
- bin/setup
|
143
143
|
- lib/vacation_rentals_ical_adapters.rb
|
144
144
|
- lib/vacation_rentals_ical_adapters/adapters.rb
|
145
|
+
- lib/vacation_rentals_ical_adapters/adapters/csv_booked_days_adapter.rb
|
145
146
|
- lib/vacation_rentals_ical_adapters/adapters/ical_adapter.rb
|
147
|
+
- lib/vacation_rentals_ical_adapters/adapters/json_availability_map_adapter.rb
|
146
148
|
- lib/vacation_rentals_ical_adapters/adapters/xml_arkiane_adapter.rb
|
147
149
|
- lib/vacation_rentals_ical_adapters/event.rb
|
148
150
|
- lib/vacation_rentals_ical_adapters/ical_converter.rb
|