yar 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +61 -0
- data/.rspec +5 -0
- data/.rubocop.yml +142 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +91 -0
- data/LICENSE +21 -0
- data/README.md +45 -0
- data/Rakefile +16 -0
- data/lib/Yar/client.rb +52 -0
- data/lib/Yar/collection.rb +22 -0
- data/lib/Yar/error.rb +5 -0
- data/lib/Yar/object.rb +37 -0
- data/lib/Yar/objects/carrier.rb +5 -0
- data/lib/Yar/objects/city.rb +5 -0
- data/lib/Yar/objects/copyright.rb +5 -0
- data/lib/Yar/objects/schedule.rb +5 -0
- data/lib/Yar/objects/station.rb +5 -0
- data/lib/Yar/resource.rb +61 -0
- data/lib/Yar/resources/carrier.rb +9 -0
- data/lib/Yar/resources/copyright.rb +9 -0
- data/lib/Yar/resources/nearest.rb +14 -0
- data/lib/Yar/resources/schedule.rb +15 -0
- data/lib/Yar/resources/stations.rb +23 -0
- data/lib/Yar/version.rb +8 -0
- data/lib/yar.rb +27 -0
- data/spec/client_spec.rb +19 -0
- data/spec/lib/resources/carrier_spec.rb +16 -0
- data/spec/lib/resources/copyright_spec.rb +16 -0
- data/spec/lib/resources/nearest_spec.rb +30 -0
- data/spec/lib/resources/schedule_spec.rb +26 -0
- data/spec/lib/resources/stations_spec.rb +26 -0
- data/spec/spec_helper.rb +60 -0
- data/spec/vcr/carrier/schedule.yml +44 -0
- data/spec/vcr/copyright/info.yml +51 -0
- data/spec/vcr/nearest/city.yml +39 -0
- data/spec/vcr/nearest/stations.yml +139 -0
- data/spec/vcr/schedule/between.yml +130 -0
- data/spec/vcr/schedule/schedule.yml +95 -0
- data/spec/vcr/stations/between.yml +130 -0
- data/spec/vcr/stations/schedule.yml +95 -0
- data/yar.gemspec +36 -0
- metadata +236 -0
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Yar
|
4
|
+
class StationsResource < Resource
|
5
|
+
# def list
|
6
|
+
# resp = get("stations_list/")
|
7
|
+
# Collection.from_response(resp, key: "countries", type: Region)
|
8
|
+
# end
|
9
|
+
def list
|
10
|
+
Object.new get("stations_list/").body
|
11
|
+
end
|
12
|
+
|
13
|
+
# TODO: move to Schedule.info station: -> Schedule
|
14
|
+
def schedule(station:)
|
15
|
+
Schedule.new get("schedule/?station=#{station}").body
|
16
|
+
end
|
17
|
+
|
18
|
+
# TODO: move to Schedule.between(from: to:) -> Schedule
|
19
|
+
def between(from:, to:)
|
20
|
+
Schedule.new get("search/?from=#{from}&to=#{to}").body
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
data/lib/Yar/version.rb
ADDED
data/lib/yar.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "addressable/uri"
|
4
|
+
require "faraday"
|
5
|
+
require "yar/version"
|
6
|
+
|
7
|
+
module Yar
|
8
|
+
autoload :Client, "yar/client"
|
9
|
+
autoload :Object, "yar/object"
|
10
|
+
autoload :Resource, "yar/resource"
|
11
|
+
autoload :Collection, "yar/collection"
|
12
|
+
autoload :Error, "yar/error"
|
13
|
+
|
14
|
+
# objects
|
15
|
+
autoload :Copyright, "yar/objects/copyright"
|
16
|
+
autoload :Station, "yar/objects/station"
|
17
|
+
autoload :Schedule, "yar/objects/schedule"
|
18
|
+
autoload :Carrier, "yar/objects/carrier"
|
19
|
+
autoload :City, "yar/objects/city"
|
20
|
+
|
21
|
+
# resources
|
22
|
+
autoload :CopyrightResource, "yar/resources/copyright"
|
23
|
+
autoload :StationsResource, "yar/resources/stations"
|
24
|
+
autoload :ScheduleResource, "yar/resources/schedule"
|
25
|
+
autoload :CarrierResource, "yar/resources/carrier"
|
26
|
+
autoload :NearestResource, "yar/resources/nearest"
|
27
|
+
end
|
data/spec/client_spec.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
RSpec.describe Yar::Client do
|
4
|
+
subject(:client) { described_class.new token: "TOKEN" }
|
5
|
+
|
6
|
+
context "with default format" do
|
7
|
+
it { expect(client).to be_an Yar::Client }
|
8
|
+
it { expect(client.format).to eq "json" }
|
9
|
+
end
|
10
|
+
|
11
|
+
context "with format XML" do
|
12
|
+
subject(:client) { described_class.new token: "TOKEN", format: "xml" }
|
13
|
+
it { expect(client.format).to eq "xml" }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe "VERSION" do
|
17
|
+
it { expect(Yar::VERSION).to eq "1.0.0" }
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "yar"
|
5
|
+
|
6
|
+
RSpec.describe "#carrier" do
|
7
|
+
describe ".info" do
|
8
|
+
subject(:resp) do
|
9
|
+
VCR.use_cassette("carrier/schedule") do
|
10
|
+
@yar.carrier.info code: "TK", system: "iata"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it { expect(resp).to be_an Yar::Carrier }
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "yar"
|
5
|
+
|
6
|
+
RSpec.describe "#copyright" do
|
7
|
+
describe ".info" do
|
8
|
+
subject(:resp) do
|
9
|
+
VCR.use_cassette("copyright/info") do
|
10
|
+
@yar.copyright.info
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it { expect(resp).to be_an Yar::Copyright }
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "yar"
|
5
|
+
|
6
|
+
RSpec.describe "#nearest" do
|
7
|
+
let(:lat) { 55.733970 }
|
8
|
+
let(:long) { 37.586780 }
|
9
|
+
|
10
|
+
describe ".stations" do
|
11
|
+
subject(:resp) do
|
12
|
+
VCR.use_cassette("nearest/stations") do
|
13
|
+
@yar.nearest.stations lat: 55.733970, long: 37.586780, distance: 10
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
it { expect(resp).to be_an Yar::Collection }
|
18
|
+
it { expect(resp.data.first).to be_an Yar::Station }
|
19
|
+
end
|
20
|
+
|
21
|
+
describe ".city" do
|
22
|
+
subject(:resp) do
|
23
|
+
VCR.use_cassette("nearest/city") do
|
24
|
+
@yar.nearest.city(lat: lat, long: long)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
it { expect(resp).to be_an Yar::City }
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "yar"
|
5
|
+
|
6
|
+
RSpec.describe "#schedule" do
|
7
|
+
describe ".info" do
|
8
|
+
subject(:resp) do
|
9
|
+
VCR.use_cassette("schedule/schedule") do
|
10
|
+
@yar.schedule.info station: "s9848585"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it { expect(resp).to be_an Yar::Schedule }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".between" do
|
18
|
+
subject(:resp) do
|
19
|
+
VCR.use_cassette("schedule/between") do
|
20
|
+
@yar.schedule.between from: "s9848585", to: "s9848577"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it { expect(resp).to be_an Yar::Schedule }
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "spec_helper"
|
4
|
+
require "yar"
|
5
|
+
|
6
|
+
RSpec.describe "#stations" do
|
7
|
+
describe ".schedule" do
|
8
|
+
subject(:resp) do
|
9
|
+
VCR.use_cassette("stations/schedule") do
|
10
|
+
@yar.stations.schedule station: "s9848585"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
it { expect(resp).to be_an Yar::Schedule }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe ".between" do
|
18
|
+
subject(:resp) do
|
19
|
+
VCR.use_cassette("stations/between") do
|
20
|
+
@yar.stations.between from: "s9848585", to: "s9848577"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
it { expect(resp).to be_an Yar::Schedule }
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "bundler/setup"
|
4
|
+
require "simplecov"
|
5
|
+
require "simplecov-lcov"
|
6
|
+
require "webmock/rspec"
|
7
|
+
require "vcr"
|
8
|
+
|
9
|
+
require "yar"
|
10
|
+
|
11
|
+
SimpleCov::Formatter::LcovFormatter.config.report_with_single_file = true
|
12
|
+
SimpleCov.formatter = SimpleCov::Formatter::LcovFormatter
|
13
|
+
|
14
|
+
SimpleCov.start do
|
15
|
+
add_filter "spec/"
|
16
|
+
add_group "Lib", "lib"
|
17
|
+
minimum_coverage 80.0
|
18
|
+
end
|
19
|
+
|
20
|
+
ACCESS_TOKEN = ENV["YAR_ACCESS_TOKEN"] || "SECRET_TOKEN"
|
21
|
+
|
22
|
+
RSpec.configure do |config|
|
23
|
+
config.before(:each) do
|
24
|
+
@yar = Yar::Client.new(token: ACCESS_TOKEN)
|
25
|
+
end
|
26
|
+
|
27
|
+
config.example_status_persistence_file_path = ".rspec_status"
|
28
|
+
config.disable_monkey_patching!
|
29
|
+
|
30
|
+
config.expect_with :rspec do |c|
|
31
|
+
c.syntax = :expect
|
32
|
+
c.include_chain_clauses_in_custom_matcher_descriptions = true
|
33
|
+
end
|
34
|
+
|
35
|
+
config.mock_with :rspec do |mocks|
|
36
|
+
mocks.verify_partial_doubles = true
|
37
|
+
end
|
38
|
+
config.shared_context_metadata_behavior = :apply_to_host_groups
|
39
|
+
end
|
40
|
+
|
41
|
+
VCR.configure do |c|
|
42
|
+
c.before_record do |i|
|
43
|
+
i.response.body.force_encoding("UTF-8")
|
44
|
+
end
|
45
|
+
|
46
|
+
c.ignore_localhost = true
|
47
|
+
c.cassette_library_dir = "spec/vcr"
|
48
|
+
c.hook_into :webmock
|
49
|
+
|
50
|
+
c.default_cassette_options = {
|
51
|
+
decode_compressed_response: true,
|
52
|
+
allow_unused_http_interactions: false
|
53
|
+
}
|
54
|
+
|
55
|
+
c.filter_sensitive_data("TOKEN") do |i|
|
56
|
+
i.request["headers"]["Authorization"].first
|
57
|
+
end
|
58
|
+
|
59
|
+
c.configure_rspec_metadata!
|
60
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.rasp.yandex.net/v3.0/carrier/?code=TK&system=iata
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v1.10.2
|
12
|
+
Authorization:
|
13
|
+
- TOKEN
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Allow:
|
24
|
+
- GET
|
25
|
+
Content-Length:
|
26
|
+
- '311'
|
27
|
+
Content-Type:
|
28
|
+
- application/json; charset=utf-8
|
29
|
+
Date:
|
30
|
+
- Sun, 23 Oct 2022 08:19:21 GMT
|
31
|
+
Vary:
|
32
|
+
- Accept, Accept-Encoding
|
33
|
+
X-Content-Type-Options:
|
34
|
+
- nosniff
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"carriers":[{"code":5483,"title":"AnadoluJet","codes":{"sirena":null,"iata":"TK","icao":"AJA"},"address":"Bakırköy/
|
38
|
+
İstanbul","url":"http://www.anadolujet.com/","email":"musteri@anadolujet.com","contacts":"","phone":"444
|
39
|
+
25 38","logo":"https://yastat.net/s3/rasp/media/data/company/logo/anadolujet.png","offices":[]},{"code":680,"title":"Turkish
|
40
|
+
Airlines","codes":{"sirena":null,"iata":"TK","icao":"THY"},"address":"Bakırköy/
|
41
|
+
İstanbul","url":"http://www.turkishairlines.com/","email":"","contacts":"","phone":"444
|
42
|
+
08 49","logo":"https://yastat.net/s3/rasp/media/data/company/logo/thy_kopya.jpg","offices":[]}]}'
|
43
|
+
recorded_at: Sun, 23 Oct 2022 08:19:21 GMT
|
44
|
+
recorded_with: VCR 6.1.0
|
@@ -0,0 +1,51 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.rasp.yandex.net/v3.0/copyright/
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v1.10.2
|
12
|
+
Authorization:
|
13
|
+
- TOKEN
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Allow:
|
24
|
+
- GET
|
25
|
+
Content-Length:
|
26
|
+
- '338'
|
27
|
+
Content-Type:
|
28
|
+
- application/json; charset=utf-8
|
29
|
+
Date:
|
30
|
+
- Sun, 23 Oct 2022 08:19:21 GMT
|
31
|
+
Vary:
|
32
|
+
- Accept, Accept-Encoding
|
33
|
+
X-Content-Type-Options:
|
34
|
+
- nosniff
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"copyright":{"text":"Данные предоставлены сервисом Яндекс.Расписания","url":"http://rasp.yandex.ru/","logo_vy":"<iframe
|
38
|
+
frameborder=\"0\" style=\"overflow: hidden; border: 0; width: 240px; height:
|
39
|
+
130px;\" src=\"//yandex.st/rasp/media/apicc/copyright_vert_yellow.html\"></iframe>","logo_vm":"<iframe
|
40
|
+
frameborder=\"0\" style=\"overflow: hidden; border: 0; width: 240px; height:
|
41
|
+
130px;\" src=\"//yandex.st/rasp/media/apicc/copyright_vert_mono.html\"></iframe>","logo_vd":"<iframe
|
42
|
+
frameborder=\"0\" style=\"overflow: hidden; border: 0; width: 240px; height:
|
43
|
+
130px;\" src=\"//yandex.st/rasp/media/apicc/copyright_vert_dark.html\"></iframe>","logo_hy":"<iframe
|
44
|
+
frameborder=\"0\" style=\"overflow: hidden; border: 0; width: 740px; height:
|
45
|
+
51px;\" src=\"//yandex.st/rasp/media/apicc/copyright_horiz_yellow.html\"></iframe>","logo_hm":"<iframe
|
46
|
+
frameborder=\"0\" style=\"overflow: hidden; border: 0; width: 740px; height:
|
47
|
+
51px;\" src=\"//yandex.st/rasp/media/apicc/copyright_horiz_mono.html\"></iframe>","logo_hd":"<iframe
|
48
|
+
frameborder=\"0\" style=\"overflow: hidden; border: 0; width: 740px; height:
|
49
|
+
51px;\" src=\"//yandex.st/rasp/media/apicc/copyright_horiz_dark.html\"></iframe>"}}'
|
50
|
+
recorded_at: Sun, 23 Oct 2022 08:19:21 GMT
|
51
|
+
recorded_with: VCR 6.1.0
|
@@ -0,0 +1,39 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: https://api.rasp.yandex.net/v3.0/nearest_settlement/?lat=55.73397&lng=37.58678
|
6
|
+
body:
|
7
|
+
encoding: US-ASCII
|
8
|
+
string: ''
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v1.10.2
|
12
|
+
Authorization:
|
13
|
+
- TOKEN
|
14
|
+
Accept-Encoding:
|
15
|
+
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
|
16
|
+
Accept:
|
17
|
+
- "*/*"
|
18
|
+
response:
|
19
|
+
status:
|
20
|
+
code: 200
|
21
|
+
message: OK
|
22
|
+
headers:
|
23
|
+
Allow:
|
24
|
+
- GET
|
25
|
+
Content-Length:
|
26
|
+
- '179'
|
27
|
+
Content-Type:
|
28
|
+
- application/json; charset=utf-8
|
29
|
+
Date:
|
30
|
+
- Sun, 23 Oct 2022 08:19:22 GMT
|
31
|
+
Vary:
|
32
|
+
- Accept
|
33
|
+
X-Content-Type-Options:
|
34
|
+
- nosniff
|
35
|
+
body:
|
36
|
+
encoding: UTF-8
|
37
|
+
string: '{"type":"settlement","title":"Москва","short_title":"Москва","popular_title":"Москва","code":"c213","lat":55.753676,"lng":37.619899,"distance":3.016378011063095}'
|
38
|
+
recorded_at: Sun, 23 Oct 2022 08:19:22 GMT
|
39
|
+
recorded_with: VCR 6.1.0
|