shuffler_fm 0.0.1
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.
- data/.gitignore +21 -0
- data/.rspec +1 -0
- data/.travis.yml +10 -0
- data/.yardopts +2 -0
- data/Gemfile +4 -0
- data/LICENSE +22 -0
- data/README.md +121 -0
- data/Rakefile +37 -0
- data/lib/shuffler_fm/api/artists.rb +53 -0
- data/lib/shuffler_fm/api/blogs.rb +52 -0
- data/lib/shuffler_fm/api/channels.rb +88 -0
- data/lib/shuffler_fm/api/charts.rb +28 -0
- data/lib/shuffler_fm/api/genres.rb +28 -0
- data/lib/shuffler_fm/api/tracks.rb +33 -0
- data/lib/shuffler_fm/api.rb +54 -0
- data/lib/shuffler_fm/configuration.rb +44 -0
- data/lib/shuffler_fm/errors.rb +37 -0
- data/lib/shuffler_fm/http.rb +25 -0
- data/lib/shuffler_fm/middleware/error_handler.rb +49 -0
- data/lib/shuffler_fm/request.rb +25 -0
- data/lib/shuffler_fm/version.rb +3 -0
- data/lib/shuffler_fm.rb +67 -0
- data/shuffler_fm.gemspec +37 -0
- data/spec/config.yml.sample +3 -0
- data/spec/fixtures/vcr_cassettes/api.yml +26 -0
- data/spec/fixtures/vcr_cassettes/artists.yml +187 -0
- data/spec/fixtures/vcr_cassettes/blogs.yml +187 -0
- data/spec/fixtures/vcr_cassettes/channels.yml +95 -0
- data/spec/fixtures/vcr_cassettes/charts.yml +95 -0
- data/spec/fixtures/vcr_cassettes/genres.yml +95 -0
- data/spec/fixtures/vcr_cassettes/tracks.yml +95 -0
- data/spec/helper.rb +39 -0
- data/spec/shuffler_fm/api/artists_spec.rb +25 -0
- data/spec/shuffler_fm/api/blogs_spec.rb +25 -0
- data/spec/shuffler_fm/api/channels_spec.rb +23 -0
- data/spec/shuffler_fm/api/charts_spec.rb +15 -0
- data/spec/shuffler_fm/api/genres_spec.rb +15 -0
- data/spec/shuffler_fm/api/tracks_spec.rb +15 -0
- data/spec/shuffler_fm/api_spec.rb +15 -0
- data/spec/shuffler_fm/configuration_spec.rb +9 -0
- data/spec/shuffler_fm/middleware/error_handler_spec.rb +29 -0
- data/spec/shufflerfm_spec.rb +29 -0
- metadata +315 -0
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'faraday'
|
2
|
+
|
3
|
+
module ShufflerFM
|
4
|
+
# @private
|
5
|
+
module Middleware
|
6
|
+
class ErrorHandler < Faraday::Response::Middleware
|
7
|
+
def on_complete(response)
|
8
|
+
case response[:status].to_i
|
9
|
+
when 400
|
10
|
+
raise ShufflerFM::BadRequest, error_message(response)
|
11
|
+
when 401
|
12
|
+
raise ShufflerFM::Unauthorized, error_message(response)
|
13
|
+
when 403
|
14
|
+
raise ShufflerFM::Forbidden, error_message(response)
|
15
|
+
when 404
|
16
|
+
raise ShufflerFM::NotFound, error_message(response)
|
17
|
+
when 406
|
18
|
+
raise ShufflerFM::NotAcceptable, error_message(response)
|
19
|
+
when 422
|
20
|
+
raise ShufflerFM::UnprocessableEntity, error_message(response)
|
21
|
+
when 429
|
22
|
+
raise ShufflerFM::TooManyRequests, error_message(response)
|
23
|
+
when 500
|
24
|
+
raise ShufflerFM::InternalServerError, error_message(response)
|
25
|
+
when 501
|
26
|
+
raise ShufflerFM::NotImplemented, error_message(response)
|
27
|
+
when 502
|
28
|
+
raise ShufflerFM::BadGateway, error_message(response)
|
29
|
+
when 503
|
30
|
+
raise ShufflerFM::ServiceUnavailable, error_message(response)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
def error_message(response)
|
36
|
+
msg = case response[:status].to_i
|
37
|
+
when 400
|
38
|
+
"The requested URL was not found on the server."
|
39
|
+
when 429
|
40
|
+
"Hourly rate-limit exceded."
|
41
|
+
else
|
42
|
+
response[:body].nil? ? "" : response[:body]
|
43
|
+
end
|
44
|
+
|
45
|
+
"#{response[:method].to_s.upcase} #{response[:url].to_s}: #{response[:status]} #{msg}"
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module ShufflerFM
|
2
|
+
# @private
|
3
|
+
module Request
|
4
|
+
# Performs an HTTP GET request
|
5
|
+
#
|
6
|
+
# == Parameters:
|
7
|
+
# @param [String] path The request path
|
8
|
+
# @param [Hash] options The operation options
|
9
|
+
#
|
10
|
+
# @return The HTTP response
|
11
|
+
#
|
12
|
+
def get(path, options = {})
|
13
|
+
request(:get, path, options)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def request(method, path, options = {})
|
18
|
+
response = http_connection.send(method) do |request|
|
19
|
+
request.url("#{API.version}/#{path}", options)
|
20
|
+
end
|
21
|
+
|
22
|
+
response.body
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/lib/shuffler_fm.rb
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'shuffler_fm/version'
|
2
|
+
require 'shuffler_fm/configuration'
|
3
|
+
require 'shuffler_fm/api'
|
4
|
+
|
5
|
+
#
|
6
|
+
# shuffler_fm is a thin ruby API wrapper for http://shuffler.fm REST API
|
7
|
+
#
|
8
|
+
module ShufflerFM
|
9
|
+
class << self
|
10
|
+
# Provides an API for a given API key
|
11
|
+
#
|
12
|
+
# @overload api(key)
|
13
|
+
# @param [String] key An api key provided by http://shuffler.fm
|
14
|
+
#
|
15
|
+
# @return [ShufflerFM::API]
|
16
|
+
#
|
17
|
+
# @example get an API instance
|
18
|
+
# api = ShufflerFM.api("your-api-key")
|
19
|
+
# api.tracks # gets 1st page of the track list
|
20
|
+
#
|
21
|
+
# @overload api(key, configuration)
|
22
|
+
# @param [String] key An api key provided by http://shuffler.fm
|
23
|
+
# @param [Hash] configuration The configuration descriptor
|
24
|
+
#
|
25
|
+
# @option configuration [Integer] :connection_timeout The connection timeout in seconds. Defaults to 2.
|
26
|
+
# @option configuration [Integer] :read_timeout The open/read timeout in seconds. Defaults to 5.
|
27
|
+
# @option configuration [String] :proxy The proxy. Is unset by default. (e.g. 'http://192.168.1.1:8080')
|
28
|
+
#
|
29
|
+
# @return [ShufflerFM::API]
|
30
|
+
#
|
31
|
+
# @example
|
32
|
+
# api = ShufflerFM.api("your-api-key", connection_timeout: 2, read_timeout: 3, proxy: 'http://192.168.1.1:8080')
|
33
|
+
# api.tracks # gets 1st page of the track list
|
34
|
+
#
|
35
|
+
# @see ShufflerFM.configure
|
36
|
+
# @see ShufflerFM::Configuration
|
37
|
+
#
|
38
|
+
def api(key, configuration = {})
|
39
|
+
self.configuration = Configuration.new(configuration)
|
40
|
+
ShufflerFM::API.new(key)
|
41
|
+
end
|
42
|
+
|
43
|
+
# @!attribute [rw] configuration
|
44
|
+
# Access to the configuration descriptor
|
45
|
+
attr_accessor :configuration
|
46
|
+
|
47
|
+
# API wide configrations
|
48
|
+
#
|
49
|
+
# @yield [config] the configuration descriptor
|
50
|
+
#
|
51
|
+
# @see ShufflerFM.api
|
52
|
+
# @see ShufflerFM::Configuration
|
53
|
+
#
|
54
|
+
# @example
|
55
|
+
# ShufflerFM.configure do |config|
|
56
|
+
# config.connection_timeout = 1 #seconds
|
57
|
+
# config.read_timeout = 5 #seconds
|
58
|
+
# config.proxy = { uri: 'http://192.168.1.1:8080', user: 'user1', password: 'passwd'}
|
59
|
+
# end
|
60
|
+
#
|
61
|
+
def configure
|
62
|
+
yield(self.configuration)
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
self.configuration = Configuration.new
|
67
|
+
end
|
data/shuffler_fm.gemspec
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'shuffler_fm/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = "shuffler_fm"
|
8
|
+
gem.version = ShufflerFM::VERSION
|
9
|
+
gem.authors = ["Miguel Guinada"]
|
10
|
+
gem.email = ["mguinada@gmail.com"]
|
11
|
+
gem.description = %q{ shuffler_fm wraps shuffler.fm's REST api on a thin layer of ruby. }
|
12
|
+
gem.summary = %q{ Ruby API wrapper for http://shuffler.fm }
|
13
|
+
gem.homepage = "https://github.com/mguinada/shuffler_fm"
|
14
|
+
gem.date = Time.now.utc.strftime("%Y-%m-%d")
|
15
|
+
|
16
|
+
gem.files = `git ls-files`.split($/)
|
17
|
+
gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
|
18
|
+
gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
|
19
|
+
gem.require_paths = ["lib"]
|
20
|
+
|
21
|
+
#package
|
22
|
+
gem.add_dependency 'faraday', '~> 0.8'
|
23
|
+
gem.add_dependency 'faraday_middleware', '~> 0.8'
|
24
|
+
gem.add_dependency 'rash', '~> 0.3'
|
25
|
+
gem.add_dependency 'multi_json', '~> 1.3'
|
26
|
+
|
27
|
+
#development
|
28
|
+
gem.add_development_dependency 'json'
|
29
|
+
gem.add_development_dependency 'rake'
|
30
|
+
gem.add_development_dependency 'pry'
|
31
|
+
gem.add_development_dependency 'rspec'
|
32
|
+
gem.add_development_dependency 'webmock'
|
33
|
+
gem.add_development_dependency 'vcr'
|
34
|
+
gem.add_development_dependency 'simplecov'
|
35
|
+
gem.add_development_dependency 'yard'
|
36
|
+
gem.add_development_dependency 'maruku'
|
37
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: get
|
5
|
+
uri: http://api.shuffler.fm/v1/tracks?api-key=NO-SUCH-KEY&page=1
|
6
|
+
body:
|
7
|
+
string: ""
|
8
|
+
headers:
|
9
|
+
Accept:
|
10
|
+
- "*/*"
|
11
|
+
response:
|
12
|
+
status:
|
13
|
+
code: 403
|
14
|
+
message: FORBIDDEN
|
15
|
+
headers:
|
16
|
+
Content-Type:
|
17
|
+
- text/html; charset=utf-8
|
18
|
+
Content-Length:
|
19
|
+
- "39"
|
20
|
+
Server:
|
21
|
+
- TornadoServer/2.4
|
22
|
+
body:
|
23
|
+
string: That API-key is invalid my dear friend.
|
24
|
+
http_version:
|
25
|
+
recorded_at: Tue, 25 Sep 2012 20:54:36 GMT
|
26
|
+
recorded_with: VCR 2.2.5
|