marver 0.0.0 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (70) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +17 -0
  3. data/.ruby-version +1 -0
  4. data/Gemfile +13 -0
  5. data/LICENSE +20 -0
  6. data/README.md +32 -0
  7. data/Rakefile +1 -0
  8. data/lib/marver.rb +35 -21
  9. data/lib/marver/builders/common_entities_builder.rb +46 -0
  10. data/lib/marver/builders/core_entities_builder.rb +34 -0
  11. data/lib/marver/client.rb +13 -0
  12. data/lib/marver/credentials.rb +23 -0
  13. data/lib/marver/data_container.rb +18 -0
  14. data/lib/marver/entities/common/image.rb +9 -0
  15. data/lib/marver/entities/common/key_date.rb +10 -0
  16. data/lib/marver/entities/common/price.rb +10 -0
  17. data/lib/marver/entities/common/text_object.rb +11 -0
  18. data/lib/marver/entities/common/url.rb +10 -0
  19. data/lib/marver/entities/core/character.rb +35 -0
  20. data/lib/marver/entities/core/comic.rb +46 -0
  21. data/lib/marver/entities/core/creator.rb +36 -0
  22. data/lib/marver/entities/core/event.rb +35 -0
  23. data/lib/marver/entities/core/serie.rb +37 -0
  24. data/lib/marver/entities/core/story.rb +36 -0
  25. data/lib/marver/entities/summaries/character_summary.rb +22 -0
  26. data/lib/marver/entities/summaries/comic_summary.rb +20 -0
  27. data/lib/marver/entities/summaries/creator_summary.rb +12 -0
  28. data/lib/marver/entities/summaries/event_summary.rb +14 -0
  29. data/lib/marver/entities/summaries/serie_summary.rb +13 -0
  30. data/lib/marver/entities/summaries/story_summary.rb +14 -0
  31. data/lib/marver/finders/character_finder.rb +24 -0
  32. data/lib/marver/helpers/string_helper.rb +36 -0
  33. data/lib/marver/rest/client.rb +22 -0
  34. data/lib/marver/rest/error.rb +13 -0
  35. data/lib/marver/rest/response.rb +18 -0
  36. data/lib/marver/version.rb +3 -0
  37. data/marver.gemspec +23 -0
  38. data/spec/fixtures/character.json +398 -0
  39. data/spec/fixtures/comic.json +243 -0
  40. data/spec/fixtures/creator.json +345 -0
  41. data/spec/fixtures/event.json +104 -0
  42. data/spec/fixtures/raw_json.json +398 -0
  43. data/spec/fixtures/serie.json +102 -0
  44. data/spec/fixtures/story.json +94 -0
  45. data/spec/marver/client_spec.rb +12 -0
  46. data/spec/marver/credentials_spec.rb +19 -0
  47. data/spec/marver/data_container_spec.rb +23 -0
  48. data/spec/marver/entities/core/character_spec.rb +76 -0
  49. data/spec/marver/entities/core/comic_spec.rb +150 -0
  50. data/spec/marver/entities/core/creator_spec.rb +83 -0
  51. data/spec/marver/entities/core/event_spec.rb +106 -0
  52. data/spec/marver/entities/core/serie_spec.rb +106 -0
  53. data/spec/marver/entities/core/story_spec.rb +70 -0
  54. data/spec/marver/entities/image_spec.rb +9 -0
  55. data/spec/marver/entities/key_date_spec.rb +17 -0
  56. data/spec/marver/entities/price_spec.rb +13 -0
  57. data/spec/marver/entities/summaries/character_summary_spec.rb +65 -0
  58. data/spec/marver/entities/summaries/comic_summary_spec.rb +64 -0
  59. data/spec/marver/entities/summaries/creator_summary_spec.rb +23 -0
  60. data/spec/marver/entities/summaries/event_summary_spec.rb +30 -0
  61. data/spec/marver/entities/summaries/serie_summary_spec.rb +26 -0
  62. data/spec/marver/entities/summaries/story_summary_spec.rb +30 -0
  63. data/spec/marver/entities/text_object_spec.rb +20 -0
  64. data/spec/marver/entities/url_spec.rb +16 -0
  65. data/spec/marver/finders/character_finder_spec.rb +27 -0
  66. data/spec/marver/rest/client_spec.rb +10 -0
  67. data/spec/marver/rest/error_spec.rb +14 -0
  68. data/spec/marver/rest/response_spec.rb +22 -0
  69. data/spec/spec_helper.rb +17 -0
  70. metadata +137 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 854ada56d6c71ad17f83f060c7c1bf4a7df48eeb
4
- data.tar.gz: 4340aafc9b580846eced5f31b9ad5506835e54dd
3
+ metadata.gz: a429ebb07df62f8290bad6d714177c7dccfc63fd
4
+ data.tar.gz: 800a8e3a54a341ac5a2e145395aea0c27de03c16
5
5
  SHA512:
6
- metadata.gz: 23643c6259ca3c4d7c40f95b7e075ef2d5dd64889fa117e0f17ebf7b23c25583e2d6c4707f6e3e21fef7c31ddc4912f6943ce0c4877e246d6f286c0230545377
7
- data.tar.gz: b944dab8e08464804ecd388b7bd15f5834f7bfccefb13c705a2e832bac7dae114b383af937a2bfcad1f56510026dd3be6f612d2bb62349effb356563266736e6
6
+ metadata.gz: 718e41cc32a28c9077895c4966120fb0b8dfb9991f70aead3ad73a2ac2de093595ad26378d2b420c914d63ac795d08c7c7faf7dcffc7d6cb05e1da800bccb5c3
7
+ data.tar.gz: 6ef523f611f82bd7ea8c2b88347d0106537bc7e34ce93db782339091648ecc7caba9760c94b21c3ccee2c4376a70d628d27a2f8959921abbe039bb8aad232eb2
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
@@ -0,0 +1 @@
1
+ 2.0.0-p353
data/Gemfile ADDED
@@ -0,0 +1,13 @@
1
+ source "https://rubygems.org/"
2
+
3
+ gem 'rest-client'
4
+
5
+ group :development do
6
+ gem 'pry'
7
+ end
8
+
9
+ group :test do
10
+ gem 'rspec'
11
+ gem 'webmock'
12
+ end
13
+
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2014 Ile Eftimov
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
6
+ this software and associated documentation files (the "Software"), to deal in
7
+ the Software without restriction, including without limitation the rights to
8
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
9
+ the Software, and to permit persons to whom the Software is furnished to do so,
10
+ subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ 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, FITNESS
17
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
18
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
19
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
20
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,32 @@
1
+ Marver
2
+ ======
3
+
4
+ Marver is (going to be an) easy to use Ruby gem for [Marvel's API](http://developer.marvel.com/). It is still in development and any contribution is welcomed.
5
+
6
+
7
+ ### TO DO:
8
+
9
+ ##### Write core classes
10
+ * Serie
11
+ * Event
12
+ * Creator
13
+ * More?
14
+
15
+
16
+ ##### Entity Finder classes
17
+ Should be implemented within the Marver::Client class.
18
+
19
+ * CharacterFinder (in progress)
20
+ * SerieFinder
21
+ * StoryFinder
22
+ * ComicFinder
23
+ * EventFinder
24
+ * More?
25
+
26
+
27
+ Refactor generation of resource lists for core classes, maybe add a builder module?
28
+
29
+
30
+
31
+ #### Author
32
+ Ile Eftimov - [@fteem](http://twitter.com/fteem)
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -1,28 +1,42 @@
1
1
  require 'rest_client'
2
- require 'digest/md5'
3
2
 
4
- class Marver
5
- API_VERSION = "v1"
6
- API_ENDPOINT = "http://gateway.marvel.com"
3
+ # Base Classes
4
+ require './lib/marver/client.rb'
5
+ require './lib/marver/version.rb'
6
+ require './lib/marver/credentials.rb'
7
+ require './lib/marver/data_container.rb'
7
8
 
8
- attr_reader :private_key, :public_key
9
+ # Finders
10
+ require './lib/marver/finders/character_finder.rb'
9
11
 
10
- def initialize(private_key, public_key)
11
- @private_key = private_key
12
- @public_key = public_key
13
- end
12
+ # REST
13
+ require './lib/marver/rest/client.rb'
14
+ require './lib/marver/rest/response.rb'
14
15
 
15
- def characters(name = "")
16
- endpoint = build_url("characters")
17
- endpoint = endpoint + "&name=#{name}" unless name.empty?
18
- response = RestClient.get endpoint
19
- end
16
+ # Helpers & builders
17
+ require './lib/marver/helpers/string_helper.rb'
18
+ require './lib/marver/builders/core_entities_builder.rb'
19
+ require './lib/marver/builders/common_entities_builder.rb'
20
20
 
21
- private
21
+ # Common Entities
22
+ require './lib/marver/entities/common/text_object.rb'
23
+ require './lib/marver/entities/common/image.rb'
24
+ require './lib/marver/entities/common/url.rb'
25
+ require './lib/marver/entities/common/key_date.rb'
26
+ require './lib/marver/entities/common/price.rb'
22
27
 
23
- def build_url(noun)
24
- ts = Time.now.to_i.to_s
25
- hash = Digest::MD5.hexdigest(ts + private_key + public_key)
26
- "#{API_ENDPOINT}/#{API_VERSION}/public/#{noun}?ts=#{ts}&apikey=#{public_key}&hash=#{hash}"
27
- end
28
- end
28
+ # Core Entities
29
+ require './lib/marver/entities/core/event.rb'
30
+ require './lib/marver/entities/core/serie.rb'
31
+ require './lib/marver/entities/core/story.rb'
32
+ require './lib/marver/entities/core/character.rb'
33
+ require './lib/marver/entities/core/creator.rb'
34
+ require './lib/marver/entities/core/comic.rb'
35
+
36
+ # Summary Entities
37
+ require './lib/marver/entities/summaries/character_summary.rb'
38
+ require './lib/marver/entities/summaries/comic_summary.rb'
39
+ require './lib/marver/entities/summaries/story_summary.rb'
40
+ require './lib/marver/entities/summaries/event_summary.rb'
41
+ require './lib/marver/entities/summaries/serie_summary.rb'
42
+ require './lib/marver/entities/summaries/creator_summary.rb'
@@ -0,0 +1,46 @@
1
+ require './lib/marver.rb'
2
+
3
+ # TODO: Refactor, I guess?
4
+ module Marver
5
+ module CommonEntitiesBuilder
6
+ COMMON_ENTITIES = %w(prices images urls textObjects thumbnail dates)
7
+
8
+ extend Marver::StringHelper
9
+
10
+ def self.build!(object)
11
+ COMMON_ENTITIES.each do |entity|
12
+ # If the object's JSON has this entity..
13
+ if object.json.has_key?(entity)
14
+ # get the entity lists
15
+ entities = entity_items(object, entity)
16
+ # find the class for this type of entity
17
+ klass = common_class(entity)
18
+ # parameterize the entity string
19
+ # i.e. textObjects => TextObject
20
+ parameterized_entity = parameterize(entity)
21
+
22
+ if entities.kind_of?(Array)
23
+ object.class.send(:define_method, parameterized_entity) do
24
+ entities.collect do |ent|
25
+ klass.new(ent)
26
+ end
27
+ end
28
+ else
29
+ object.class.send(:define_method, parameterized_entity) do
30
+ klass.new(entities)
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def self.entity_items(object, entity)
38
+ if object.json[entity].kind_of?(Hash) && object.json[entity].has_key?('items')
39
+ [object.json[entity]['items']].compact.flatten(1)
40
+ else
41
+ object.json[entity]
42
+ end
43
+ end
44
+
45
+ end
46
+ end
@@ -0,0 +1,34 @@
1
+ require './lib/marver.rb'
2
+
3
+ # TODO: Refactor, I guess?
4
+ module Marver
5
+ module CoreEntitiesBuilder
6
+ CORE_ENTITIES = %w(comics series creators stories characters events)
7
+
8
+ extend Marver::StringHelper
9
+
10
+ def self.build!(object)
11
+ CORE_ENTITIES.each do |entity|
12
+ if object.json.has_key?(entity)
13
+ klass = self.summary_class(entity)
14
+ entity_items = self.entity_items(object, entity)
15
+
16
+ object.class.send(:define_method, entity) do
17
+ entity_items.collect do |ent|
18
+ klass.new(ent, object.credentials)
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+
25
+ def self.entity_items(object, entity)
26
+ if object.json[entity].kind_of?(Hash) && object.json[entity].has_key?('items')
27
+ [object.json[entity]['items']].compact.flatten(1)
28
+ else
29
+ [object.json[entity]].compact.flatten(1)
30
+ end
31
+ end
32
+
33
+ end
34
+ end
@@ -0,0 +1,13 @@
1
+ require './lib/marver.rb'
2
+
3
+ module Marver
4
+ class Client
5
+ attr_reader :characters
6
+
7
+ def initialize(private_key, public_key)
8
+ @credentials = Marver::Credentials.new(private_key, public_key)
9
+ @characters = Marver::CharacterFinder.new(@credentials)
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,23 @@
1
+ require 'digest/md5'
2
+
3
+ module Marver
4
+ class Credentials
5
+ attr_reader :public_key, :private_key, :timestamp
6
+
7
+ def initialize(private_key, public_key)
8
+ @public_key = public_key
9
+ @private_key = private_key
10
+ @timestamp = Time.now.to_i.to_s
11
+ end
12
+
13
+ def to_s
14
+ "ts=#{@timestamp}&apikey=#{@public_key}&hash=#{md5_hash(@timestamp)}"
15
+ end
16
+
17
+ private
18
+
19
+ def md5_hash(ts)
20
+ Digest::MD5.hexdigest(@timestamp + @private_key + @public_key)
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,18 @@
1
+ module Marver
2
+ class DataContainer
3
+ attr_reader :offset, :limit, :total, :results
4
+
5
+ def initialize(response)
6
+ json_results = response.data
7
+
8
+ @offset = json_results['offset'].to_i
9
+ @limit = json_results['limit'].to_i
10
+ @total = json_results['total'].to_i
11
+ if @total == 1
12
+ @results = json_results['results'].first
13
+ else
14
+ @results = json_results['results']
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,9 @@
1
+ module Marver
2
+ class Image
3
+ attr_reader :full_path
4
+
5
+ def initialize(json)
6
+ @full_path = json['path'] + '.' + json['extension']
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,10 @@
1
+ module Marver
2
+ class KeyDate
3
+ attr_reader :type, :date
4
+
5
+ def initialize(json)
6
+ @type = json['type']
7
+ @date = Date.parse(json['date'])
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,10 @@
1
+ module Marver
2
+ class Price
3
+ attr_reader :type, :price
4
+
5
+ def initialize(json)
6
+ @type = json['type']
7
+ @price = json['price']
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,11 @@
1
+ module Marver
2
+ class TextObject
3
+ attr_reader :type, :language, :text
4
+
5
+ def initialize(json)
6
+ @type = json['type']
7
+ @language = json['language']
8
+ @text = json['text']
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,10 @@
1
+ module Marver
2
+ class Url
3
+ attr_reader :type, :url
4
+
5
+ def initialize(json)
6
+ @type = json['type']
7
+ @url = json['url']
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,35 @@
1
+ require './lib/marver.rb'
2
+
3
+ module Marver
4
+ class Character
5
+ attr_reader :id, :resource_uri, :description, :urls, :name,
6
+ :thumbnail, :comics, :stories, :events, :series, :json, :credentials
7
+
8
+ class << self
9
+ def build(response, credentials)
10
+ if response.kind_of?(Array)
11
+ response.collect do |character|
12
+ Marver::Character.new(character, credentials)
13
+ end
14
+ else
15
+ new(response.results, credentials)
16
+ end
17
+ end
18
+ end
19
+
20
+ def initialize(json, credentials)
21
+ @credentials = credentials
22
+ @json = json
23
+
24
+ @description = json['description']
25
+ @id = json['id'].to_i
26
+ @credentials = credentials
27
+ @name = json['name']
28
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
29
+
30
+ CoreEntitiesBuilder.build!(self)
31
+ CommonEntitiesBuilder.build!(self)
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,46 @@
1
+ require './lib/marver.rb'
2
+
3
+ module Marver
4
+ class Comic
5
+ attr_reader :json, :credentials, :id, :digital_id, :title, :issue_number,
6
+ :variant_description, :description, :isbn,
7
+ :upc, :diamond_code, :ean, :issn, :format,
8
+ :page_count, :resource_uri, :thumbnail, :text_objects
9
+
10
+
11
+ class << self
12
+ def build(response, credentials)
13
+ if response.kind_of?(Array)
14
+ response.collect do |comic|
15
+ new(comic, credentials)
16
+ end
17
+ else
18
+ new(response.results, credentials)
19
+ end
20
+ end
21
+ end
22
+
23
+ def initialize(json, credentials)
24
+ @json = json
25
+ @credentials = credentials
26
+ @title = json['title']
27
+ @resource_uri = "#{json['resourceURI']}?#{@credentials.to_s}"
28
+ @id = json['id'].to_i
29
+ @digital_id = json['digitalId']
30
+ @issue_number = json['issueNumber']
31
+ @variant_description = json['variantDescription']
32
+ @description = json['description']
33
+ @isbn = json['isbn']
34
+ @upc = json['upc']
35
+ @diamond_code = json['diamondCode']
36
+ @ean = json['ean']
37
+ @issn = json['issn']
38
+ @format = json['format']
39
+ @page_count = json['pageCount']
40
+
41
+ CoreEntitiesBuilder.build!(self)
42
+ CommonEntitiesBuilder.build!(self)
43
+ end
44
+
45
+ end
46
+ end