yar 1.0.0

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.
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