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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a27fa4a0800442586754792d55c361b9f5848cd0
4
- data.tar.gz: ca016fa6222541a8e4c8561c04490f629c3d4e34
3
+ metadata.gz: 4259c4711c3db9de4cad1c918948a4dbb9f4bafa
4
+ data.tar.gz: cf96ec04b08aae31e71d03bda91efda50cad3f3a
5
5
  SHA512:
6
- metadata.gz: 2b7c4b364ac625a4f1918ba4f9cbfd92aebccc15d4d9729e4f877cff2873b0dbd355d06bd9268eb8b6efd26878e28711c0a96a3e49a9f7d029b6c3df2ec268ec
7
- data.tar.gz: 7179bc447d34c6d02f629433c851c1c348b86e9618b944525d9299dc37b7543e738fe4c8d4e6ff4a78388a77c6a2aecf1c2100a0e11d08bb8937802fa250b548
6
+ metadata.gz: 8d922df7ed7861121fb5a6a25bfd221660150c858244d7834f1b2ed79b05a08c2c0504cf6955e175573fa8738d771bef1a279be33f9b1f06a7a2bc8d6ee1369f
7
+ data.tar.gz: 8b622ebfe7a508b263082a2b1fbabb9232553faadecf25c2f3b097abdcc2387ad935d57f5d883b28ac7b13cf306b9cbaca48f9a5c9ab22555031c53b736e0471
@@ -1,7 +1,12 @@
1
- # ember-data-partial-model Changelog
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 adapter: returns not changed iCal body if it is indeed iCal format
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
@@ -1,3 +1,3 @@
1
1
  module VacationRentalsIcalAdapters
2
- VERSION = "0.1.1"
2
+ VERSION = "0.1.2"
3
3
  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.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-04 00:00:00.000000000 Z
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