marvel-api 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 46610bdc3daec86840705542f086110b4617c798
4
+ data.tar.gz: 4b79ec56c998d266e3c844233bc6975d0cc1ade5
5
+ SHA512:
6
+ metadata.gz: f82f0761ba3bbb4416c68b8d6221cef2f633b829b0c5b87f6db730620f25619f4d5a187c6032e862ca05c84bf4a314355516f8a74d505164fd22e69fe8ec6af3
7
+ data.tar.gz: 1f4c466d1a3f518fc93ef2fc70af363379f26f53b7e808a31f34f4010ab079ff4e78755e948f3965f831f45e520cf77412e8e2453d169549fa33f99f8be9ad82
@@ -0,0 +1,2 @@
1
+ MARVEL_PUBLIC_KEY=
2
+ MARVEL_PRIVATE_KEY=
@@ -0,0 +1,4 @@
1
+ /.bundle/
2
+ /Gemfile.lock
3
+ /pkg/
4
+ /.env
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,6 @@
1
+ Documentation:
2
+ Enabled: false
3
+
4
+ Metrics/BlockLength:
5
+ Exclude:
6
+ - 'spec/**/*.rb'
@@ -0,0 +1,36 @@
1
+ # Available ruby versions: http://rubies.travis-ci.org/
2
+
3
+ language: ruby
4
+
5
+ os:
6
+ - linux
7
+
8
+ rvm:
9
+ - '2.1' # latest 2.1.x
10
+ - '2.2.6'
11
+ - '2.3.3'
12
+ - '2.4.0'
13
+ - 'ruby-head'
14
+
15
+ script:
16
+ bundle exec rspec
17
+
18
+ before_install:
19
+ # bundler installation needed for jruby-head
20
+ # https://github.com/travis-ci/travis-ci/issues/5861
21
+ - gem install bundler
22
+
23
+ # Travis OS X support is pretty janky. These are some hacks to include tests
24
+ # only on versions that actually work.
25
+ # (last tested: 2016-11)
26
+ matrix:
27
+ # exclude: {}
28
+ # include: {}
29
+
30
+ allow_failures:
31
+ - rvm: 'ruby-head'
32
+
33
+ # return results as soon as mandatory versions are done
34
+ fast_finish: true
35
+
36
+ sudo: false
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in marvel-api.gemspec
4
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2017 Krzysztof Wawer
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,101 @@
1
+ # Marvel::Api
2
+
3
+ [![Build Status](https://travis-ci.org/comics-apps/marvel-api.svg?branch=master)](https://travis-ci.org/comics-apps/marvel-api)
4
+ [![Code Climate](https://codeclimate.com/github/comics-apps/marvel-api.svg)](https://codeclimate.com/github/comics-apps/marvel-api)
5
+
6
+ A simple Marvel API client for Ruby, inspired by the koala's gem style.
7
+
8
+ ## Installation
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'marvel-api'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install marvel-api
23
+
24
+ ## Usage
25
+
26
+ ```ruby
27
+ public_key = 'foo'
28
+ private_key = 'bar'
29
+ options = {}
30
+ service = Marvel::Api.new(public_key, private_key, **options)
31
+ ```
32
+
33
+ Gem provide universal method which allows you to create custom call to API:
34
+
35
+ ```ruby
36
+ service.api_call(path, args, options)
37
+ ```
38
+
39
+ * path - append to `http://comicvine.gamespot.com/api/`
40
+ * args - query params
41
+ * options - options for http service class
42
+
43
+ Available methods:
44
+
45
+ * `characters(args)`
46
+ * `character(character_id, args)`
47
+ * `character_comics(character_id, args)`
48
+ * `character_events(character_id, args)`
49
+ * `character_series(character_id, args)`
50
+ * `character_stories(character_id, args)`
51
+ * `comics(args)`
52
+ * `comic(comic_id, args)`
53
+ * `comic_characters(comic_id, args)`
54
+ * `comic_events(comic_id, args)`
55
+ * `comic_series(comic_id, args)`
56
+ * `comic_stories(comic_id, args)`
57
+ * `creators(args)`
58
+ * `creator(creator_id, args)`
59
+ * `creator_comics(creator_id, args)`
60
+ * `creator_events(creator_id, args)`
61
+ * `creator_series(creator_id, args)`
62
+ * `creator_stories(creator_id, args)`
63
+ * `events(args)`
64
+ * `event(event_id, args)`
65
+ * `event_characters(event_id, args)`
66
+ * `event_comics(event_id, args)`
67
+ * `event_creators(event_id, args)`
68
+ * `event_series(event_id, args)`
69
+ * `event_stories(event_id, args)`
70
+ * `series(args)`
71
+ * `serie(serie_id, args)`
72
+ * `serie_characters(serie_id, args)`
73
+ * `serie_comics(serie_id, args)`
74
+ * `serie_creators(serie_id, args)`
75
+ * `serie_events(serie_id, args)`
76
+ * `serie_stories(serie_id, args)`
77
+ * `stories(args)`
78
+ * `story(story_id, args)`
79
+ * `story_characters(story_id, args)`
80
+ * `story_comics(story_id, args)`
81
+ * `story_creators(story_id, args)`
82
+ * `story_events(story_id, args)`
83
+ * `story_series(story_id, args)`
84
+
85
+ Check official API docs what arguments you can use: https://developer.marvel.com/docs
86
+
87
+ ## Development
88
+
89
+ After checking out the repo, run `bin/setup` to install dependencies. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
90
+
91
+ 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).
92
+
93
+ ## Contributing
94
+
95
+ Bug reports and pull requests are welcome on GitHub at https://github.com/Krzysztof Wawer/marvel-api.
96
+
97
+
98
+ ## License
99
+
100
+ The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
101
+
@@ -0,0 +1 @@
1
+ require 'bundler/gem_tasks'
@@ -0,0 +1,50 @@
1
+ require 'marvel/api/api_methods'
2
+ require 'marvel/api/http_service'
3
+ require 'marvel/api/request'
4
+ require 'marvel/api/response'
5
+ require 'marvel/api/version'
6
+
7
+ module Marvel
8
+ class Api
9
+ include ApiMethods
10
+
11
+ class << self
12
+ attr_accessor :http_service
13
+ end
14
+
15
+ self.http_service = HTTPService
16
+
17
+ DEFAULT_SERVER = 'http://gateway.marvel.com'.freeze
18
+
19
+ attr_reader :public_key, :private_key, :options
20
+
21
+ def initialize(public_key, private_key, options = {})
22
+ @public_key = public_key
23
+ @private_key = private_key
24
+ @options = options
25
+ end
26
+
27
+ def api_call(path, args, options = {})
28
+ request = Request.new(
29
+ path: path,
30
+ args: args.merge(apikey: public_key, ts: ts, hash: request_hash),
31
+ options: options
32
+ )
33
+ self.class.http_service.make_request(request)
34
+ end
35
+
36
+ def comics(args = {})
37
+ api_call('comics', args)
38
+ end
39
+
40
+ private
41
+
42
+ def ts
43
+ Time.now.utc.to_i
44
+ end
45
+
46
+ def request_hash
47
+ Digest::MD5.hexdigest("#{ts}#{private_key}#{public_key}")
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,39 @@
1
+ module Marvel
2
+ class Api
3
+ module ApiMethods
4
+ METHODS = {
5
+ characters: :character,
6
+ comics: :comic,
7
+ creators: :creator,
8
+ events: :event,
9
+ series: :serie,
10
+ stories: :story
11
+ }.freeze
12
+
13
+ SUBMETHODS = {
14
+ characters: %i[comics events series stories],
15
+ comics: %i[characters creators events stories],
16
+ creators: %i[comics events series stories],
17
+ events: %i[characters comics creators series stories],
18
+ series: %i[characters comics creators events stories],
19
+ stories: %i[characters comics creators events series]
20
+ }.freeze
21
+
22
+ METHODS.each do |method, single_method|
23
+ define_method(method) do |args = {}|
24
+ api_call(method, args)
25
+ end
26
+
27
+ define_method(single_method) do |id, args = {}|
28
+ api_call("#{method}/#{id}", args)
29
+ end
30
+
31
+ SUBMETHODS[method].each do |submethod|
32
+ define_method("#{single_method}_#{submethod}") do |id, args = {}|
33
+ api_call("#{method}/#{id}/#{submethod}", args)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,39 @@
1
+ require 'faraday'
2
+
3
+ module Marvel
4
+ class Api
5
+ module HTTPService
6
+ class << self
7
+ attr_accessor :faraday_middleware, :http_options
8
+
9
+ private
10
+
11
+ def faraday_options(options)
12
+ valid_options = %i[
13
+ request proxy ssl builder url parallel_manager params
14
+ headers builder_class
15
+ ]
16
+ Hash[options.select { |key, _| valid_options.include?(key) }]
17
+ end
18
+ end
19
+
20
+ self.http_options ||= {}
21
+
22
+ DEFAULT_MIDDLEWARE = proc do |builder|
23
+ builder.adapter Faraday.default_adapter
24
+ end
25
+
26
+ def self.make_request(request)
27
+ connection = Faraday.new(
28
+ request.server, faraday_options(request.options),
29
+ &(faraday_middleware || DEFAULT_MIDDLEWARE)
30
+ )
31
+ response = connection.send(request.verb, request.path, request.args)
32
+ Marvel::Api::Response.new(
33
+ status: response.status.to_i, headers: response.headers,
34
+ body: response.body
35
+ )
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,35 @@
1
+ module Marvel
2
+ class Api
3
+ class Request
4
+ attr_reader :raw_path, :raw_args, :raw_options
5
+
6
+ GET = 'get'.freeze
7
+
8
+ def initialize(path:, args: {}, options: {})
9
+ @raw_path = path
10
+ @raw_args = args
11
+ @raw_options = options
12
+ end
13
+
14
+ def verb
15
+ GET
16
+ end
17
+
18
+ def path
19
+ "/v1/public/#{raw_path}"
20
+ end
21
+
22
+ def args
23
+ raw_args
24
+ end
25
+
26
+ def options
27
+ raw_options
28
+ end
29
+
30
+ def server
31
+ Marvel::Api::DEFAULT_SERVER
32
+ end
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,31 @@
1
+ module Marvel
2
+ class Api
3
+ class Response
4
+ attr_reader :status, :headers, :body, :etag, :offset, :limit, :total,
5
+ :count, :results
6
+
7
+ def initialize(status:, headers:, body:)
8
+ @status = status
9
+ @headers = headers
10
+ @body = body
11
+
12
+ parse_body
13
+ end
14
+
15
+ private
16
+
17
+ def parse_body
18
+ data = JSON.parse(body)
19
+
20
+ @etag = data['etag']
21
+ methods = %w[offset limit total count results]
22
+ methods.each do |method_name|
23
+ value = data['data'][method_name]
24
+ instance_variable_set(:"@#{method_name}", value)
25
+ end
26
+ rescue
27
+ nil
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,5 @@
1
+ module Marvel
2
+ class Api
3
+ VERSION = '0.1.0'.freeze
4
+ end
5
+ end
@@ -0,0 +1,35 @@
1
+ # coding: utf-8
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'marvel/api/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'marvel-api'
9
+ spec.version = Marvel::Api::VERSION
10
+ spec.authors = ['Krzysztof Wawer']
11
+ spec.email = ['krzysztof.wawer@gmail.com']
12
+
13
+ spec.summary = 'Interface to Marvel API'
14
+ spec.description = 'Interface to Marvel API'
15
+ spec.homepage = ''
16
+ spec.license = 'MIT'
17
+
18
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
19
+ f.match(%r{^(test|spec|features)/})
20
+ end
21
+ spec.bindir = 'exe'
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ['lib']
24
+
25
+ spec.add_runtime_dependency 'faraday'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.14'
28
+ spec.add_development_dependency 'dotenv'
29
+ spec.add_development_dependency 'rake', '~> 10.0'
30
+ spec.add_development_dependency 'rspec', '~> 3.5'
31
+ spec.add_development_dependency 'rubocop', '0.48.1'
32
+ spec.add_development_dependency 'timecop', '~> 0.8'
33
+ spec.add_development_dependency 'vcr', '~> 3.0'
34
+ spec.add_development_dependency 'webmock', '~> 2.3'
35
+ end
metadata ADDED
@@ -0,0 +1,186 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: marvel-api
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Krzysztof Wawer
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-04-09 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.14'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.14'
41
+ - !ruby/object:Gem::Dependency
42
+ name: dotenv
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rake
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '10.0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '10.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rspec
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '3.5'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '3.5'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rubocop
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - '='
88
+ - !ruby/object:Gem::Version
89
+ version: 0.48.1
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - '='
95
+ - !ruby/object:Gem::Version
96
+ version: 0.48.1
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0.8'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0.8'
111
+ - !ruby/object:Gem::Dependency
112
+ name: vcr
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '3.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: webmock
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '2.3'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '2.3'
139
+ description: Interface to Marvel API
140
+ email:
141
+ - krzysztof.wawer@gmail.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".env.example"
147
+ - ".gitignore"
148
+ - ".rspec"
149
+ - ".rubocop.yml"
150
+ - ".travis.yml"
151
+ - Gemfile
152
+ - LICENSE.txt
153
+ - README.md
154
+ - Rakefile
155
+ - lib/marvel/api.rb
156
+ - lib/marvel/api/api_methods.rb
157
+ - lib/marvel/api/http_service.rb
158
+ - lib/marvel/api/request.rb
159
+ - lib/marvel/api/response.rb
160
+ - lib/marvel/api/version.rb
161
+ - marvel-api.gemspec
162
+ homepage: ''
163
+ licenses:
164
+ - MIT
165
+ metadata: {}
166
+ post_install_message:
167
+ rdoc_options: []
168
+ require_paths:
169
+ - lib
170
+ required_ruby_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ required_rubygems_version: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ requirements: []
181
+ rubyforge_project:
182
+ rubygems_version: 2.5.1
183
+ signing_key:
184
+ specification_version: 4
185
+ summary: Interface to Marvel API
186
+ test_files: []