yar 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (43) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +61 -0
  3. data/.rspec +5 -0
  4. data/.rubocop.yml +142 -0
  5. data/Gemfile +5 -0
  6. data/Gemfile.lock +91 -0
  7. data/LICENSE +21 -0
  8. data/README.md +45 -0
  9. data/Rakefile +16 -0
  10. data/lib/Yar/client.rb +52 -0
  11. data/lib/Yar/collection.rb +22 -0
  12. data/lib/Yar/error.rb +5 -0
  13. data/lib/Yar/object.rb +37 -0
  14. data/lib/Yar/objects/carrier.rb +5 -0
  15. data/lib/Yar/objects/city.rb +5 -0
  16. data/lib/Yar/objects/copyright.rb +5 -0
  17. data/lib/Yar/objects/schedule.rb +5 -0
  18. data/lib/Yar/objects/station.rb +5 -0
  19. data/lib/Yar/resource.rb +61 -0
  20. data/lib/Yar/resources/carrier.rb +9 -0
  21. data/lib/Yar/resources/copyright.rb +9 -0
  22. data/lib/Yar/resources/nearest.rb +14 -0
  23. data/lib/Yar/resources/schedule.rb +15 -0
  24. data/lib/Yar/resources/stations.rb +23 -0
  25. data/lib/Yar/version.rb +8 -0
  26. data/lib/yar.rb +27 -0
  27. data/spec/client_spec.rb +19 -0
  28. data/spec/lib/resources/carrier_spec.rb +16 -0
  29. data/spec/lib/resources/copyright_spec.rb +16 -0
  30. data/spec/lib/resources/nearest_spec.rb +30 -0
  31. data/spec/lib/resources/schedule_spec.rb +26 -0
  32. data/spec/lib/resources/stations_spec.rb +26 -0
  33. data/spec/spec_helper.rb +60 -0
  34. data/spec/vcr/carrier/schedule.yml +44 -0
  35. data/spec/vcr/copyright/info.yml +51 -0
  36. data/spec/vcr/nearest/city.yml +39 -0
  37. data/spec/vcr/nearest/stations.yml +139 -0
  38. data/spec/vcr/schedule/between.yml +130 -0
  39. data/spec/vcr/schedule/schedule.yml +95 -0
  40. data/spec/vcr/stations/between.yml +130 -0
  41. data/spec/vcr/stations/schedule.yml +95 -0
  42. data/yar.gemspec +36 -0
  43. 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
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Yar
4
+ major = 1
5
+ minor = 0
6
+ patch = 0
7
+ VERSION = "#{major}.#{minor}.#{patch}"
8
+ end
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
@@ -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
@@ -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