kenpo_api 0.1.1 → 0.1.2
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/.dockerignore +4 -0
- data/.ruby-version +1 -0
- data/.travis.yml +1 -1
- data/README.md +94 -6
- data/docker-compose.yml +10 -0
- data/docker/ruby/Dockerfile +16 -0
- data/kenpo_api.gemspec +6 -4
- data/lib/kenpo_api/client.rb +11 -6
- data/lib/kenpo_api/resort.rb +147 -26
- data/lib/kenpo_api/service_category.rb +1 -0
- data/lib/kenpo_api/version.rb +1 -1
- metadata +25 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 56f484d8e49df945bc18578d6128d2946ed24d23
|
4
|
+
data.tar.gz: 542ca13d65a0016f15ba443923765c1204e3f934
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a154c2cbe55dca226388bfbf8c1a68aefe8c69897e93b4f3bf881aa4f672357fa7e8afd1fb69141f276d292154b956df6ec59d3de9afb3cf24dfab9a23c5e8ae
|
7
|
+
data.tar.gz: 44fd1c0fcf38ae5d144744c9c8a5ddf4a6130338449379973e926c117c4add0aab87692301e6d1caf8c0f6de72863e6b9fecc195202202067b031bf84d8c061a
|
data/.dockerignore
ADDED
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.4.2
|
data/.travis.yml
CHANGED
data/README.md
CHANGED
@@ -24,12 +24,21 @@ Or install it yourself as:
|
|
24
24
|
|
25
25
|
## Usage
|
26
26
|
|
27
|
+
*PLEASE DO NOT ABUSE THE RESERVATION!!*
|
28
|
+
|
29
|
+
### Resort reservation by lottery
|
30
|
+
|
27
31
|
```ruby
|
28
|
-
#
|
32
|
+
# Request email.
|
29
33
|
resort_names = KenpoApi::Resort.resort_names
|
30
34
|
KenpoApi::Resort.request_reservation_url(resort_name: 'トスラブ箱根和奏林', email: 'matsuno_osomatsu@example.com')
|
35
|
+
|
36
|
+
# Check email and copy the url in the email.
|
31
37
|
url = 'https://as.its-kenpo.or.jp/apply/new?c=aaaaaaaa-bbbb-cccc-dddd-012345678901'
|
32
|
-
|
38
|
+
# Check criteria.
|
39
|
+
criteria = KenpoApi::Resort.check_reservation_criteria(url, type: :lottery)
|
40
|
+
|
41
|
+
# Apply for the reservation by lottery.
|
33
42
|
reservation_data = {
|
34
43
|
sign_no: 6666,
|
35
44
|
insured_no: 666,
|
@@ -44,20 +53,72 @@ reservation_data = {
|
|
44
53
|
postal_code: '180-0004',
|
45
54
|
state: 13,
|
46
55
|
address: '武蔵野市本町666-666',
|
47
|
-
join_time: '
|
56
|
+
join_time: '2018-02-15',
|
48
57
|
night_count: 1,
|
49
58
|
stay_persons: 6,
|
50
59
|
room_persons: 6, (1 room) # or [3, 3] (2 rooms) or [2, 2, 2] (3 rooms) ...
|
51
60
|
meeting_dates: nil, # (none) or [1] (first day only) or [1, 2] (both days) ...
|
52
61
|
must_meeting: false,
|
53
62
|
}
|
54
|
-
KenpoApi::Resort.apply_reservation(url, reservation_data)
|
63
|
+
KenpoApi::Resort.apply_reservation(url, reservation_data, type: :lottery)
|
64
|
+
```
|
65
|
+
|
66
|
+
### Resort reservation for vacant rooms
|
67
|
+
|
68
|
+
```ruby
|
69
|
+
# Check criteria.
|
70
|
+
resort_name = 'トスラブ箱根和奏林'
|
71
|
+
KenpoApi::Resort.check_vacant_search_criteria(resort_name: resort_name)
|
72
|
+
|
73
|
+
# Search vacant rooms.
|
74
|
+
search_condition = {
|
75
|
+
join_time: '2018-02-27',
|
76
|
+
night_count: 1,
|
77
|
+
stay_persons: 6,
|
78
|
+
room_persons: 6, # (1 room) or [3, 3] (2 rooms) or [2, 2, 2] (3 rooms) ...
|
79
|
+
}
|
80
|
+
KenpoApi::Resort.search_vacant_rooms(resort_name: resort_name, search_condition: search_condition)
|
81
|
+
|
82
|
+
# Request email.
|
83
|
+
res = KenpoApi::Resort.request_reservation_url_for_vacant_rooms(resort_name: resort_name, search_condition: search_condition, vacant_room_id: 525968, email: 'matsuno_osomatsu@example.com')
|
84
|
+
|
85
|
+
# Check email and copy the url in the email.
|
86
|
+
url = 'https://as.its-kenpo.or.jp/apply/new?c=aaaaaaaa-bbbb-cccc-dddd-234567890123'
|
87
|
+
# Check criteria.
|
88
|
+
KenpoApi::Resort.check_reservation_criteria(url, type: :vacant)
|
89
|
+
|
90
|
+
# Apply for the reservation by lottery.
|
91
|
+
reservation_data = {
|
92
|
+
sign_no: 6666,
|
93
|
+
insured_no: 666,
|
94
|
+
office_name: '株式会社FLAG',
|
95
|
+
kana_name: 'マツノ オソマツ',
|
96
|
+
birth_year: 1962,
|
97
|
+
birth_month: 5,
|
98
|
+
birth_day: 24,
|
99
|
+
gender: :man,
|
100
|
+
relationship: :myself,
|
101
|
+
contact_phone: '666-6666-6666',
|
102
|
+
postal_code: '180-0004',
|
103
|
+
state: 13,
|
104
|
+
address: '武蔵野市本町666-666',
|
105
|
+
}
|
106
|
+
KenpoApi::Resort.apply_reservation(url, reservation_data, type: :vacant)
|
107
|
+
```
|
108
|
+
|
109
|
+
### Sport reservation by lottery
|
55
110
|
|
56
|
-
|
111
|
+
```ruby
|
112
|
+
# Request email.
|
57
113
|
sport_names = KenpoApi::Sport.sport_names
|
58
114
|
KenpoApi::Sport.request_reservation_url(sport_name: 'サマディ門前仲町', email: 'matsuno_osomatsu@example.com')
|
115
|
+
|
116
|
+
# Check email and copy the url in the email.
|
59
117
|
url = 'https://as.its-kenpo.or.jp/apply/new?c=aaaaaaaa-bbbb-cccc-dddd-901234567890'
|
118
|
+
# Check criteria.
|
60
119
|
criteria = KenpoApi::Sport.check_reservation_criteria(url)
|
120
|
+
|
121
|
+
# Apply for the reservation by lottery.
|
61
122
|
reservation_data = {
|
62
123
|
sign_no: 6666,
|
63
124
|
insured_no: 666,
|
@@ -70,19 +131,46 @@ reservation_data = {
|
|
70
131
|
postal_code: '180-0004',
|
71
132
|
state: 13,
|
72
133
|
address: '武蔵野市本町666-666',
|
73
|
-
join_time: '
|
134
|
+
join_time: '2018-03-11',
|
74
135
|
use_time_from: '13:00',
|
75
136
|
use_time_to: '15:00',
|
76
137
|
}
|
77
138
|
KenpoApi::Sport.apply_reservation(url, reservation_data)
|
78
139
|
```
|
79
140
|
|
141
|
+
### Low-level APIs
|
142
|
+
|
143
|
+
```ruby
|
144
|
+
categories = KenpoApi::ServiceCategory.list
|
145
|
+
|
146
|
+
category = KenpoApi::ServiceCategory.find(:resort_reserve)
|
147
|
+
category.available?
|
148
|
+
category.service_groups
|
149
|
+
|
150
|
+
group = KenpoApi::ServiceGroup.find(category, 'トスラブ箱根ビオーレ')
|
151
|
+
group.available?
|
152
|
+
group.services
|
153
|
+
```
|
154
|
+
|
155
|
+
|
80
156
|
## Development
|
81
157
|
|
82
158
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
83
159
|
|
84
160
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
85
161
|
|
162
|
+
### Use Docker env
|
163
|
+
|
164
|
+
```sh
|
165
|
+
$ docker-compose up -d
|
166
|
+
$ docker-compose exec ruby sh
|
167
|
+
|
168
|
+
# # Start interactive console.
|
169
|
+
# pry --gem
|
170
|
+
# # Execute tests.
|
171
|
+
# rake spec
|
172
|
+
```
|
173
|
+
|
86
174
|
## Contributing
|
87
175
|
|
88
176
|
Bug reports and pull requests are welcome on GitHub at https://github.com/tearoom6/kenpo_api.
|
data/docker-compose.yml
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
FROM ruby:2.4.2-alpine3.6
|
2
|
+
|
3
|
+
ENV LANG=ja_JP.UTF-8\
|
4
|
+
APP_ROOT=/kenpo_api
|
5
|
+
|
6
|
+
RUN apk update && \
|
7
|
+
apk upgrade && \
|
8
|
+
apk add --update --no-cache --virtual build-dependencies build-base && \
|
9
|
+
apk add --update --no-cache tzdata git less && \
|
10
|
+
mkdir -p $APP_ROOT
|
11
|
+
|
12
|
+
WORKDIR $APP_ROOT
|
13
|
+
COPY . $APP_ROOT
|
14
|
+
|
15
|
+
RUN bundle install --jobs=4 && \
|
16
|
+
apk del build-dependencies
|
data/kenpo_api.gemspec
CHANGED
@@ -32,8 +32,10 @@ Gem::Specification.new do |spec|
|
|
32
32
|
spec.add_development_dependency 'bundler', '~> 1'
|
33
33
|
spec.add_development_dependency 'rake', '~> 10'
|
34
34
|
spec.add_development_dependency 'rspec', '~> 3'
|
35
|
-
spec.add_development_dependency '
|
36
|
-
|
37
|
-
spec.
|
38
|
-
spec.
|
35
|
+
spec.add_development_dependency 'pry', '~> 0.11.3'
|
36
|
+
|
37
|
+
spec.add_dependency 'faraday', '~> 0.10'
|
38
|
+
spec.add_dependency 'cookiejar', '~> 0.3'
|
39
|
+
spec.add_dependency 'nokogiri', '~> 1'
|
40
|
+
spec.add_dependency 'dry-validation', '~> 0.10'
|
39
41
|
end
|
data/lib/kenpo_api/client.rb
CHANGED
@@ -22,16 +22,21 @@ module KenpoApi
|
|
22
22
|
@cookiejar = CookieJar::Jar.new
|
23
23
|
end
|
24
24
|
|
25
|
-
def access(path:, method: :get, params: {})
|
25
|
+
def access(path:, method: :get, params: {}, headers: {}, redirect_limit: 0)
|
26
26
|
response = @conn.send(method, path, params) do |req|
|
27
27
|
req.options.timeout = @timeout
|
28
28
|
req.options.open_timeout = @open_timeout
|
29
|
+
req.headers = headers
|
29
30
|
req.headers['cookie'] = @cookiejar.get_cookie_header(@conn.url_prefix.to_s)
|
30
31
|
end
|
31
|
-
raise NetworkError.new("Failed to fetch http content. path: #{path} status_code: #{response.status}") unless response.
|
32
|
+
raise NetworkError.new("Failed to fetch http content. path: #{path} status_code: #{response.status}") unless (200...400).include?(response.status)
|
32
33
|
|
33
34
|
@cookiejar.set_cookie(@conn.url_prefix.to_s, response.headers['set-cookie']) if response.headers.has_key?('set-cookie')
|
34
35
|
|
36
|
+
if (redirect_limit > 0) && (location = response['location'])
|
37
|
+
response = self.access(path: location, method: method, params: params, headers: headers, redirect_limit: redirect_limit - 1)
|
38
|
+
end
|
39
|
+
|
35
40
|
return (yield response) if block_given?
|
36
41
|
response
|
37
42
|
rescue KenpoApiError => e
|
@@ -40,16 +45,16 @@ module KenpoApi
|
|
40
45
|
raise NetworkError.new("Failed to fetch http content. path: #{path} original_error: #{e.message}")
|
41
46
|
end
|
42
47
|
|
43
|
-
def fetch_document(path:, method: :get, params: {})
|
44
|
-
response = access(path: path, method: method, params: params)
|
48
|
+
def fetch_document(path:, method: :get, params: {}, headers: {})
|
49
|
+
response = access(path: path, method: method, params: params, headers: headers)
|
45
50
|
document = Nokogiri::HTML(response.body)
|
46
51
|
|
47
52
|
return (yield document) if block_given?
|
48
53
|
document
|
49
54
|
end
|
50
55
|
|
51
|
-
def parse_single_form_page(path:, method: :get, params: {})
|
52
|
-
document = fetch_document(path: path, method: method, params: params)
|
56
|
+
def parse_single_form_page(path:, method: :get, params: {}, headers: {})
|
57
|
+
document = fetch_document(path: path, method: method, params: params, headers: headers)
|
53
58
|
form_element = document.xpath('//form').first
|
54
59
|
|
55
60
|
next_page_info = nil
|
data/lib/kenpo_api/resort.rb
CHANGED
@@ -15,22 +15,85 @@ module KenpoApi
|
|
15
15
|
request_application_url(service_path: service.path, email: email)
|
16
16
|
end
|
17
17
|
|
18
|
-
def self.check_reservation_criteria(application_url)
|
18
|
+
def self.check_reservation_criteria(application_url, type: :lottery)
|
19
19
|
html_document = Client.instance.fetch_document(path: application_url)
|
20
20
|
raise NotAvailableError.new("Application URL is invalid: #{html_document.xpath('//p').first.content}") if html_document.xpath('//form').first.nil?
|
21
|
-
reservation_criteria(html_document)
|
21
|
+
reservation_criteria(html_document, type: type)
|
22
22
|
end
|
23
23
|
|
24
|
-
def self.apply_reservation(application_url, application_data)
|
24
|
+
def self.apply_reservation(application_url, application_data, type: :lottery)
|
25
25
|
apply(application_url: application_url) do |html_document|
|
26
|
-
reservation_data = self.validate_reservation_data(application_data, html_document)
|
27
|
-
convert_to_reservation_post_params(reservation_data)
|
26
|
+
reservation_data = self.validate_reservation_data(application_data, html_document, type: type)
|
27
|
+
convert_to_reservation_post_params(reservation_data, type: type)
|
28
28
|
end
|
29
29
|
end
|
30
30
|
|
31
|
+
def self.check_vacant_search_criteria(resort_name:)
|
32
|
+
service = find_service(category_code: :resort_search_vacant, group_name: resort_name)
|
33
|
+
html_document = Client.instance.fetch_document(path: service.path)
|
34
|
+
raise NotAvailableError.new("Application URL is invalid: #{html_document.xpath('//p').first.content}") if html_document.xpath('//form').first.nil?
|
35
|
+
vacant_search_criteria(html_document)
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.search_vacant_rooms(resort_name:, search_condition:)
|
39
|
+
vacant_rooms_info = prepare_for_vacant_rooms_reservation(resort_name, search_condition)
|
40
|
+
vacant_rooms_info[:vacant_rooms]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.request_reservation_url_for_vacant_rooms(resort_name:, search_condition:, vacant_room_id:, email:)
|
44
|
+
vacant_rooms_info = prepare_for_vacant_rooms_reservation(resort_name, search_condition)
|
45
|
+
params = vacant_rooms_info[:params].merge({"apply[coma[#{vacant_room_id}]]" => vacant_room_id})
|
46
|
+
response = Client.instance.access(path: vacant_rooms_info[:path], method: vacant_rooms_info[:method], params: params)
|
47
|
+
if response.status == 200
|
48
|
+
document = Nokogiri::HTML(response.body)
|
49
|
+
raise NotAvailableError.new("Application URL is invalid: #{document.xpath('id("errorExplanation")').first.content}")
|
50
|
+
end
|
51
|
+
request_application_url(service_path: response.headers['location'], email: email)
|
52
|
+
end
|
53
|
+
|
31
54
|
private
|
32
55
|
|
33
|
-
def self.
|
56
|
+
def self.prepare_for_vacant_rooms_reservation(resort_name, search_condition)
|
57
|
+
service = find_service(category_code: :resort_search_vacant, group_name: resort_name)
|
58
|
+
next_page_info, html_document = Client.instance.parse_single_form_page(path: service.path)
|
59
|
+
raise NotAvailableError.new("Application URL is invalid: #{html_document.xpath('//p').first.content}") if next_page_info.nil?
|
60
|
+
|
61
|
+
# Call Ajax API to search vacant rooms.
|
62
|
+
search_condition = self.validate_vacant_search_condition(search_condition, html_document)
|
63
|
+
params = convert_to_vacant_search_post_params(search_condition)
|
64
|
+
params = params.merge(next_page_info[:params])
|
65
|
+
query_params = URI::parse(next_page_info[:path]).query
|
66
|
+
headers = {'X-Requested-With' => 'XMLHttpRequest'}
|
67
|
+
ajax_response = Client.instance.access(path: "/apply/empty_new?#{query_params}", method: :post, params: params, headers: headers)
|
68
|
+
|
69
|
+
# Parse Ajax response.
|
70
|
+
matched = /\<\\\/script\>(.+)\"\)\;/.match(ajax_response.body)
|
71
|
+
ajax_document = Nokogiri::HTML(matched[1].gsub(/\\n/, '').gsub(/\s{2,}/, '').gsub(/\\/, ''))
|
72
|
+
ids = ajax_document.xpath('id("coma_search_result")/tr/td/input/@value').map {|attr| attr.value }
|
73
|
+
|
74
|
+
vacant_rooms = ajax_document.xpath('id("coma_search_result")/tr').map.with_index do |elem, index|
|
75
|
+
values = elem.xpath('td/text()').map {|text| text.content }
|
76
|
+
{
|
77
|
+
id: ids[index],
|
78
|
+
room_number: values[0],
|
79
|
+
join_time: values[1],
|
80
|
+
room_type: values[2],
|
81
|
+
room_persons: values[3],
|
82
|
+
room_status: values[4],
|
83
|
+
}
|
84
|
+
end
|
85
|
+
|
86
|
+
additional_params = ajax_document.xpath('//input[@type="hidden"]').select {|input| ! input['name'].nil?}.map {|input| [input['name'], input['value']]}.to_h
|
87
|
+
params = params.merge(additional_params)
|
88
|
+
{
|
89
|
+
path: next_page_info[:path],
|
90
|
+
method: next_page_info[:method],
|
91
|
+
params: params,
|
92
|
+
vacant_rooms: vacant_rooms,
|
93
|
+
}
|
94
|
+
end
|
95
|
+
|
96
|
+
def self.reservation_criteria(html_document, type: :lottery)
|
34
97
|
criteria = {}
|
35
98
|
criteria[:note] = html_document.xpath('//div[@class="note mb10"]').first.text
|
36
99
|
criteria[:service_name] = html_document.xpath('//form/div[@class="form_box"]//dd[@class="elements"]').first.text
|
@@ -40,26 +103,44 @@ module KenpoApi
|
|
40
103
|
criteria[:gender] = html_document.xpath('id("apply_gender")/*/@value') .map {|attr| attr.value }.map {|val| val.to_sym } # [:man, :woman]
|
41
104
|
criteria[:relationship] = html_document.xpath('id("apply_relationship")/*/@value').map {|attr| attr.value }.map {|val| val.to_sym } # [:myself, :family]
|
42
105
|
criteria[:state] = html_document.xpath('id("apply_state")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # (1..47)
|
106
|
+
if type == :lottery
|
107
|
+
criteria[:join_time] = html_document.xpath('id("apply_join_time")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # ['2017-04-01', .., '2017-04-30']
|
108
|
+
criteria[:night_count] = html_document.xpath('id("apply_night_count")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # (1..2)
|
109
|
+
criteria[:room_count] = html_document.xpath('id("house_select")/*/@value') .map {|attr| attr.value.to_i } # (1..10)
|
110
|
+
end
|
111
|
+
criteria
|
112
|
+
end
|
113
|
+
|
114
|
+
def self.vacant_search_criteria(html_document)
|
115
|
+
criteria = {}
|
43
116
|
criteria[:join_time] = html_document.xpath('id("apply_join_time")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # ['2017-04-01', .., '2017-04-30']
|
44
117
|
criteria[:night_count] = html_document.xpath('id("apply_night_count")/*/@value') .map {|attr| attr.value }.select {|val| val != '' } # (1..2)
|
45
|
-
criteria[:
|
118
|
+
criteria[:room_count] = html_document.xpath('id("house_select")/*/@value') .map {|attr| attr.value.to_i } # (1..10)
|
46
119
|
criteria
|
47
120
|
end
|
48
121
|
|
49
|
-
def self.preprocess_reservation_data(reservation_data)
|
122
|
+
def self.preprocess_reservation_data(reservation_data, type: :lottery)
|
50
123
|
reservation_data[:birth_year] = reservation_data[:birth_year].to_s
|
51
124
|
reservation_data[:birth_month] = reservation_data[:birth_month].to_s
|
52
125
|
reservation_data[:birth_day] = reservation_data[:birth_day].to_s
|
53
126
|
reservation_data[:state] = reservation_data[:state].to_s
|
54
|
-
|
55
|
-
|
56
|
-
|
127
|
+
if type == :lottery
|
128
|
+
reservation_data[:night_count] = reservation_data[:night_count].to_s
|
129
|
+
reservation_data[:room_persons] = Array(reservation_data[:room_persons])
|
130
|
+
reservation_data[:meeting_dates] = Array(reservation_data[:meeting_dates])
|
131
|
+
end
|
57
132
|
reservation_data
|
58
133
|
end
|
59
134
|
|
60
|
-
def self.
|
61
|
-
|
62
|
-
|
135
|
+
def self.preprocess_vacant_search_condition(search_condition)
|
136
|
+
search_condition[:night_count] = search_condition[:night_count].to_s
|
137
|
+
search_condition[:room_persons] = Array(search_condition[:room_persons])
|
138
|
+
search_condition
|
139
|
+
end
|
140
|
+
|
141
|
+
def self.validate_reservation_data(reservation_data, html_document, type: :lottery)
|
142
|
+
reservation_data = preprocess_reservation_data(reservation_data, type: type)
|
143
|
+
criteria = reservation_criteria(html_document, type: type)
|
63
144
|
|
64
145
|
schema = Dry::Validation.Schema do
|
65
146
|
required(:sign_no) .filled(:int?)
|
@@ -75,21 +156,40 @@ module KenpoApi
|
|
75
156
|
required(:postal_code) .filled(format?: /^[0-9]{3}-[0-9]{4}$/)
|
76
157
|
required(:state) .filled(included_in?: criteria[:state])
|
77
158
|
required(:address) .filled(:str?)
|
159
|
+
if type == :lottery
|
160
|
+
required(:join_time) .filled(included_in?: criteria[:join_time])
|
161
|
+
required(:night_count) .filled(included_in?: criteria[:night_count])
|
162
|
+
required(:stay_persons) .filled(:int?)
|
163
|
+
required(:room_persons) .filled{ array? & each(:int?) & size?(criteria[:room_count]) }
|
164
|
+
required(:meeting_dates).value{ array? & each{ int? & included_in?([1,2,3]) } & size?((0..3)) }
|
165
|
+
required(:must_meeting) .maybe(:bool?)
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
result = schema.call(reservation_data)
|
170
|
+
raise ValidationError.new("Reservation data is invalid. #{result.messages.to_s}") if result.failure?
|
171
|
+
raise ValidationError.new('Stay persons count should match the sum of room persons') unless reservation_data[:stay_persons] == reservation_data[:room_persons].inject(:+)
|
172
|
+
result.output
|
173
|
+
end
|
174
|
+
|
175
|
+
def self.validate_vacant_search_condition(search_condition, html_document)
|
176
|
+
search_condition = preprocess_vacant_search_condition(search_condition)
|
177
|
+
criteria = vacant_search_criteria(html_document)
|
178
|
+
|
179
|
+
schema = Dry::Validation.Schema do
|
78
180
|
required(:join_time) .filled(included_in?: criteria[:join_time])
|
79
181
|
required(:night_count) .filled(included_in?: criteria[:night_count])
|
80
182
|
required(:stay_persons) .filled(:int?)
|
81
|
-
required(:room_persons) .filled{ array? & each(:int?) & size?(criteria[:
|
82
|
-
required(:meeting_dates).value{ array? & each{ int? & included_in?([1,2,3]) } & size?((0..3)) }
|
83
|
-
required(:must_meeting) .maybe(:bool?)
|
183
|
+
required(:room_persons) .filled{ array? & each(:int?) & size?(criteria[:room_count]) }
|
84
184
|
end
|
85
185
|
|
86
|
-
result = schema.call(
|
87
|
-
raise ValidationError.new("
|
88
|
-
|
186
|
+
result = schema.call(search_condition)
|
187
|
+
raise ValidationError.new("Search condition is invalid. #{result.messages.to_s}") if result.failure?
|
188
|
+
raise ValidationError.new('Stay persons count should match the sum of room persons') unless search_condition[:stay_persons] == search_condition[:room_persons].inject(:+)
|
89
189
|
result.output
|
90
190
|
end
|
91
191
|
|
92
|
-
def self.convert_to_reservation_post_params(original_data)
|
192
|
+
def self.convert_to_reservation_post_params(original_data, type: :lottery)
|
93
193
|
post_params = {}
|
94
194
|
post_params['apply[sign_no]'] = original_data[:sign_no]
|
95
195
|
post_params['apply[insured_no]'] = original_data[:insured_no]
|
@@ -104,6 +204,32 @@ module KenpoApi
|
|
104
204
|
post_params['apply[postal]'] = original_data[:postal_code]
|
105
205
|
post_params['apply[state]'] = original_data[:state]
|
106
206
|
post_params['apply[address]'] = original_data[:address]
|
207
|
+
if type == :lottery
|
208
|
+
post_params['apply[join_time]'] = original_data[:join_time]
|
209
|
+
post_params['apply[night_count]'] = original_data[:night_count]
|
210
|
+
post_params['apply[stay_persons]'] = original_data[:stay_persons]
|
211
|
+
post_params['apply[hope_rooms]'] = original_data[:room_persons].size()
|
212
|
+
post_params['apply[hope_room1]'] = original_data[:room_persons][0]
|
213
|
+
post_params['apply[hope_room2]'] = original_data[:room_persons][1] || ''
|
214
|
+
post_params['apply[hope_room3]'] = original_data[:room_persons][2] || ''
|
215
|
+
post_params['apply[hope_room4]'] = original_data[:room_persons][3] || ''
|
216
|
+
post_params['apply[hope_room5]'] = original_data[:room_persons][4] || ''
|
217
|
+
post_params['apply[hope_room6]'] = original_data[:room_persons][5] || ''
|
218
|
+
post_params['apply[hope_room7]'] = original_data[:room_persons][6] || ''
|
219
|
+
post_params['apply[hope_room8]'] = original_data[:room_persons][7] || ''
|
220
|
+
post_params['apply[hope_room9]'] = original_data[:room_persons][8] || ''
|
221
|
+
post_params['apply[hope_room10]'] = original_data[:room_persons][9] || ''
|
222
|
+
post_params['apply[use_meeting_flag]'] = original_data[:meeting_dates].any? ? 'use' : 'no_use'
|
223
|
+
post_params['apply[use_meeting1]'] = original_data[:meeting_dates].include?(1) ? '1' : '0'
|
224
|
+
post_params['apply[use_meeting2]'] = original_data[:meeting_dates].include?(2) ? '1' : '0'
|
225
|
+
post_params['apply[use_meeting3]'] = (original_data[:meeting_dates].include?(3) && original_data[:night_count] >= 2) ? '1' : '0'
|
226
|
+
post_params['apply[must_meeting]'] = original_data[:must_meeting] ? 'must' : 'not_must'
|
227
|
+
end
|
228
|
+
post_params
|
229
|
+
end
|
230
|
+
|
231
|
+
def self.convert_to_vacant_search_post_params(original_data)
|
232
|
+
post_params = {}
|
107
233
|
post_params['apply[join_time]'] = original_data[:join_time]
|
108
234
|
post_params['apply[night_count]'] = original_data[:night_count]
|
109
235
|
post_params['apply[stay_persons]'] = original_data[:stay_persons]
|
@@ -118,11 +244,6 @@ module KenpoApi
|
|
118
244
|
post_params['apply[hope_room8]'] = original_data[:room_persons][7] || ''
|
119
245
|
post_params['apply[hope_room9]'] = original_data[:room_persons][8] || ''
|
120
246
|
post_params['apply[hope_room10]'] = original_data[:room_persons][9] || ''
|
121
|
-
post_params['apply[use_meeting_flag]'] = original_data[:meeting_dates].any? ? 'use' : 'no_use'
|
122
|
-
post_params['apply[use_meeting1]'] = original_data[:meeting_dates].include?(1) ? '1' : '0'
|
123
|
-
post_params['apply[use_meeting2]'] = original_data[:meeting_dates].include?(2) ? '1' : '0'
|
124
|
-
post_params['apply[use_meeting3]'] = (original_data[:meeting_dates].include?(3) && original_data[:night_count] >= 2) ? '1' : '0'
|
125
|
-
post_params['apply[must_meeting]'] = original_data[:must_meeting] ? 'must' : 'not_must'
|
126
247
|
post_params
|
127
248
|
end
|
128
249
|
|
data/lib/kenpo_api/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kenpo_api
|
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
|
- tearoom6
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-12-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '3'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: pry
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.11.3
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.11.3
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: faraday
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -59,7 +73,7 @@ dependencies:
|
|
59
73
|
- - "~>"
|
60
74
|
- !ruby/object:Gem::Version
|
61
75
|
version: '0.10'
|
62
|
-
type: :
|
76
|
+
type: :runtime
|
63
77
|
prerelease: false
|
64
78
|
version_requirements: !ruby/object:Gem::Requirement
|
65
79
|
requirements:
|
@@ -73,7 +87,7 @@ dependencies:
|
|
73
87
|
- - "~>"
|
74
88
|
- !ruby/object:Gem::Version
|
75
89
|
version: '0.3'
|
76
|
-
type: :
|
90
|
+
type: :runtime
|
77
91
|
prerelease: false
|
78
92
|
version_requirements: !ruby/object:Gem::Requirement
|
79
93
|
requirements:
|
@@ -87,7 +101,7 @@ dependencies:
|
|
87
101
|
- - "~>"
|
88
102
|
- !ruby/object:Gem::Version
|
89
103
|
version: '1'
|
90
|
-
type: :
|
104
|
+
type: :runtime
|
91
105
|
prerelease: false
|
92
106
|
version_requirements: !ruby/object:Gem::Requirement
|
93
107
|
requirements:
|
@@ -101,7 +115,7 @@ dependencies:
|
|
101
115
|
- - "~>"
|
102
116
|
- !ruby/object:Gem::Version
|
103
117
|
version: '0.10'
|
104
|
-
type: :
|
118
|
+
type: :runtime
|
105
119
|
prerelease: false
|
106
120
|
version_requirements: !ruby/object:Gem::Requirement
|
107
121
|
requirements:
|
@@ -115,8 +129,10 @@ executables: []
|
|
115
129
|
extensions: []
|
116
130
|
extra_rdoc_files: []
|
117
131
|
files:
|
132
|
+
- ".dockerignore"
|
118
133
|
- ".gitignore"
|
119
134
|
- ".rspec"
|
135
|
+
- ".ruby-version"
|
120
136
|
- ".travis.yml"
|
121
137
|
- Gemfile
|
122
138
|
- LICENSE
|
@@ -124,6 +140,8 @@ files:
|
|
124
140
|
- Rakefile
|
125
141
|
- bin/console
|
126
142
|
- bin/setup
|
143
|
+
- docker-compose.yml
|
144
|
+
- docker/ruby/Dockerfile
|
127
145
|
- kenpo_api.gemspec
|
128
146
|
- lib/kenpo_api.rb
|
129
147
|
- lib/kenpo_api/client.rb
|
@@ -153,7 +171,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
153
171
|
version: '0'
|
154
172
|
requirements: []
|
155
173
|
rubyforge_project:
|
156
|
-
rubygems_version: 2.
|
174
|
+
rubygems_version: 2.6.13
|
157
175
|
signing_key:
|
158
176
|
specification_version: 4
|
159
177
|
summary: Unofficial API for ITS kenpo reservation system.
|