marver 0.0.6 → 0.1.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 (105) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +8 -14
  3. data/lib/marver.rb +16 -2
  4. data/lib/marver/api.rb +9 -1
  5. data/lib/marver/api/client.rb +9 -6
  6. data/lib/marver/api/credentials.rb +1 -1
  7. data/lib/marver/api/errors.rb +33 -0
  8. data/lib/marver/client.rb +3 -1
  9. data/lib/marver/entities/character.rb +11 -23
  10. data/lib/marver/entities/comic.rb +19 -35
  11. data/lib/marver/entities/creator.rb +5 -26
  12. data/lib/marver/entities/event.rb +17 -26
  13. data/lib/marver/entities/serie.rb +15 -29
  14. data/lib/marver/entities/story.rb +11 -23
  15. data/lib/marver/entities/summary/character.rb +2 -2
  16. data/lib/marver/entities/summary/comic.rb +4 -4
  17. data/lib/marver/entities/summary/creator.rb +4 -2
  18. data/lib/marver/entities/summary/event.rb +2 -2
  19. data/lib/marver/entities/summary/serie.rb +3 -3
  20. data/lib/marver/entities/summary/story.rb +2 -2
  21. data/lib/marver/entities/url.rb +3 -3
  22. data/lib/marver/factories/character.rb +28 -0
  23. data/lib/marver/factories/comic.rb +27 -0
  24. data/lib/marver/factories/creator.rb +28 -0
  25. data/lib/marver/factories/date.rb +15 -0
  26. data/lib/marver/factories/event.rb +28 -0
  27. data/lib/marver/factories/factory.rb +20 -0
  28. data/lib/marver/factories/image.rb +15 -0
  29. data/lib/marver/factories/price.rb +15 -0
  30. data/lib/marver/factories/serie.rb +28 -0
  31. data/lib/marver/factories/story.rb +28 -0
  32. data/lib/marver/factories/summary/character.rb +23 -0
  33. data/lib/marver/factories/summary/comic.rb +23 -0
  34. data/lib/marver/factories/summary/creator.rb +23 -0
  35. data/lib/marver/factories/summary/event.rb +23 -0
  36. data/lib/marver/factories/summary/serie.rb +23 -0
  37. data/lib/marver/factories/summary/story.rb +23 -0
  38. data/lib/marver/factories/summary/summary.rb +12 -0
  39. data/lib/marver/factories/text_object.rb +16 -0
  40. data/lib/marver/factories/url.rb +15 -0
  41. data/lib/marver/finders/character_finder.rb +16 -2
  42. data/lib/marver/finders/comic_finder.rb +17 -1
  43. data/lib/marver/finders/creator_finder.rb +26 -0
  44. data/lib/marver/finders/event_finder.rb +16 -2
  45. data/lib/marver/finders/serie_finder.rb +16 -2
  46. data/lib/marver/finders/story_finder.rb +15 -2
  47. data/lib/marver/mappers/character_attributes_mapper.rb +25 -0
  48. data/lib/marver/mappers/comic_attributes_mapper.rb +40 -0
  49. data/lib/marver/mappers/creator_attributes_mapper.rb +29 -0
  50. data/lib/marver/mappers/event_attributes_mapper.rb +29 -0
  51. data/lib/marver/mappers/mappable.rb +86 -0
  52. data/lib/marver/mappers/serie_attributes_mapper.rb +32 -0
  53. data/lib/marver/mappers/story_attributes_mapper.rb +26 -0
  54. data/lib/marver/utils/finder_param_filter.rb +13 -0
  55. data/lib/marver/utils/string_helper.rb +7 -0
  56. data/lib/marver/version.rb +1 -1
  57. data/spec/marver/.DS_Store +0 -0
  58. data/spec/marver/api/client_spec.rb +1 -1
  59. data/spec/marver/api/credentials_spec.rb +2 -2
  60. data/spec/marver/api/error_spec.rb +9 -9
  61. data/spec/marver/client_spec.rb +8 -0
  62. data/spec/marver/entities/character_spec.rb +1 -1
  63. data/spec/marver/entities/comic_spec.rb +1 -1
  64. data/spec/marver/entities/creator_spec.rb +2 -2
  65. data/spec/marver/entities/event_spec.rb +1 -1
  66. data/spec/marver/entities/serie_spec.rb +2 -2
  67. data/spec/marver/entities/story_spec.rb +2 -2
  68. data/spec/marver/entities/summary/comic_spec.rb +9 -1
  69. data/spec/marver/factories/character_spec.rb +12 -0
  70. data/spec/marver/factories/comic_spec.rb +12 -0
  71. data/spec/marver/factories/creator_spec.rb +12 -0
  72. data/spec/marver/factories/date_spec.rb +13 -0
  73. data/spec/marver/factories/event_spec.rb +12 -0
  74. data/spec/marver/factories/image_spec.rb +13 -0
  75. data/spec/marver/factories/price_spec.rb +13 -0
  76. data/spec/marver/factories/serie_spec.rb +12 -0
  77. data/spec/marver/factories/story_spec.rb +12 -0
  78. data/spec/marver/factories/summary/character_spec.rb +13 -0
  79. data/spec/marver/factories/summary/comic_spec.rb +13 -0
  80. data/spec/marver/factories/summary/creator_spec.rb +13 -0
  81. data/spec/marver/factories/summary/event_spec.rb +13 -0
  82. data/spec/marver/factories/summary/serie_spec.rb +13 -0
  83. data/spec/marver/factories/summary/story_spec.rb +13 -0
  84. data/spec/marver/factories/text_object_spec.rb +13 -0
  85. data/spec/marver/factories/url_spec.rb +13 -0
  86. data/spec/marver/finders/character_finder_spec.rb +17 -9
  87. data/spec/marver/finders/comic_finder_spec.rb +11 -2
  88. data/spec/marver/finders/creator_finder_spec.rb +27 -0
  89. data/spec/marver/finders/event_finder_spec.rb +11 -2
  90. data/spec/marver/finders/serie_finder_spec.rb +10 -2
  91. data/spec/marver/finders/story_finder_spec.rb +11 -3
  92. data/spec/marver/mappers/character_attributes_mapper_spec.rb +14 -0
  93. data/spec/marver/mappers/comic_attributes_mapper_spec.rb +17 -0
  94. data/spec/marver/mappers/creator_attributes_mapper_spec.rb +15 -0
  95. data/spec/marver/mappers/event_attributes_mapper_spec.rb +14 -0
  96. data/spec/marver/mappers/serie_attributes_mapper_spec.rb +17 -0
  97. data/spec/marver/mappers/story_attributes_mapper_spec.rb +15 -0
  98. data/spec/marver/utils/finder_param_filter_spec.rb +17 -0
  99. data/spec/marver/utils/string_helper_spec.rb +7 -0
  100. metadata +86 -7
  101. data/TODO +0 -3
  102. data/lib/marver/api/error.rb +0 -13
  103. data/lib/marver/entities/commonable.rb +0 -37
  104. data/lib/marver/entities/queryable.rb +0 -12
  105. data/lib/marver/entities/summarizable.rb +0 -54
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fbf8f57412fffbdad133f75f085aee5884fac3ac
4
- data.tar.gz: 159ecf070992f3aa39fe0c5816d004c10469ab93
3
+ metadata.gz: 6749397ee2f275b76c39a716ebd42e4352b258cd
4
+ data.tar.gz: f5d09a4721ceb7ad5a748a7d2995babe02449068
5
5
  SHA512:
6
- metadata.gz: 765d37edbb611c578372a73c360aa267489422827eea9693fcfaae436ee22124a7e2a4dde661e62f5e84cb76c484315bfd54f6e5c03984e29a04aeec53bc4948
7
- data.tar.gz: 6c59c053d464407e0dfaa6a8895370534fe627195dadd0eb9914791277504415131f0cb27bd133dd364b95a73e74afb6acbfc11766a15003f899c5d76cf882cf
6
+ metadata.gz: e14a63ed2ad301af75265219df20773f8dca10b53e0b75f9f8fd9bbd1ead3f00c025a798eef6d3f68a94c02475feca7115b530bb85c52851a95326b4fcad3e23
7
+ data.tar.gz: ed49c11bc4f0241e859e294e9f70c348e0b2ec4e0a5eb0afecb80b22b6b6a6f3c151330d85aac545273c391178233f87bd0634b2f243d503ce87a2c46a5af941
data/README.md CHANGED
@@ -29,11 +29,11 @@ Marver.configure do |config|
29
29
  end
30
30
 
31
31
  client = Marver::Client.new
32
- client.characters.find({ name: 'Hulk' })
33
- client.series.find({ title: 'The Avengers' })
34
- client.events.find({ title: 'Fall of the mutants' })
35
- client.stories.find({ title: 'Name of a story' })
36
- client.comics.find({ title: 'Spiderman' })
32
+ client.characters.find_by_name 'Hulk'
33
+ client.series.find_by_title 'The Avengers'
34
+ client.events.find_by_title 'Fall of the mutants'
35
+ client.stories.find_by_title 'Name of a story'
36
+ client.comics.find_by_title 'Spiderman'
37
37
  ```
38
38
 
39
39
  Also, you can inspect summary (trimmed) objects of the associated entities to one entity.
@@ -45,7 +45,7 @@ Marver.configure do |config|
45
45
  end
46
46
 
47
47
  client = Marver::Client.new
48
- hulk = client.characters.find({ name: 'Hulk' })
48
+ hulk = client.characters.find_by_name 'Hulk'
49
49
  hulk.comics # Returns an array of comics summaries
50
50
  hulk.stories # Returns an array of stories where Hulk appears
51
51
  ```
@@ -58,14 +58,8 @@ comic.full # This will issue an API call and grab the full object with all data
58
58
  ```
59
59
 
60
60
  ### TO DO:
61
-
62
- ##### Entity Finder classes
63
- Should be implemented within the Marver::Client class.
64
-
65
- CreatorFinder
61
+ Inspect dependency graph?
66
62
 
67
63
  #### Author
68
64
  Ile Eftimov <br/>
69
- [twitter](http://twitter.com/fteem) [website](http://eftimov.net)
70
-
71
- Any kind of contribution is welcomed & encouraged :)
65
+ [twitter](http://twitter.com/fteem) [website](http://eftimov.net)
@@ -3,6 +3,7 @@ require 'time'
3
3
  require 'marver/version'
4
4
 
5
5
  module Marver
6
+ FINDER_FILTERS = [ :orderBy, :limit, :offset ]
6
7
 
7
8
  # Base Classes
8
9
  autoload :Client, 'marver/client'
@@ -15,12 +16,26 @@ module Marver
15
16
  autoload :ComicFinder, 'marver/finders/comic_finder'
16
17
  autoload :EventFinder, 'marver/finders/event_finder'
17
18
  autoload :StoryFinder, 'marver/finders/story_finder'
19
+ autoload :CreatorFinder, 'marver/finders/creator_finder'
20
+
21
+ #Factories
22
+ autoload :Factory, 'marver/factories/factory'
18
23
 
19
24
  # API
20
25
  autoload :API, 'marver/api'
21
26
 
22
27
  # Helpers & builders
23
- autoload :StringHelper, 'marver/helpers/string_helper'
28
+ autoload :StringHelper, 'marver/utils/string_helper'
29
+ autoload :FinderParamFilter, 'marver/utils/finder_param_filter'
30
+
31
+ # Mappers
32
+ autoload :Mappable, 'marver/mappers/mappable'
33
+ autoload :ComicAttributesMapper, 'marver/mappers/comic_attributes_mapper'
34
+ autoload :CharacterAttributesMapper, 'marver/mappers/character_attributes_mapper'
35
+ autoload :CreatorAttributesMapper, 'marver/mappers/creator_attributes_mapper'
36
+ autoload :EventAttributesMapper, 'marver/mappers/event_attributes_mapper'
37
+ autoload :SerieAttributesMapper, 'marver/mappers/serie_attributes_mapper'
38
+ autoload :StoryAttributesMapper, 'marver/mappers/story_attributes_mapper'
24
39
 
25
40
  # Common Entities
26
41
  autoload :TextObject, 'marver/entities/text_object'
@@ -42,7 +57,6 @@ module Marver
42
57
 
43
58
  autoload :Summarizable, 'marver/entities/summarizable'
44
59
  autoload :Commonable, 'marver/entities/commonable'
45
- autoload :Queryable, 'marver/entities/queryable'
46
60
 
47
61
 
48
62
  class << self
@@ -3,6 +3,14 @@ module Marver
3
3
  autoload :Client, 'marver/api/client'
4
4
  autoload :Response, 'marver/api/response'
5
5
  autoload :Credentials, 'marver/api/credentials'
6
- autoload :Error, 'marver/api/error'
6
+ autoload :ErrorHandler, 'marver/api/errors'
7
+ end
8
+
9
+ module Error
10
+ autoload :Conflict, 'marver/api/errors'
11
+ autoload :NotFound, 'marver/api/errors'
12
+ autoload :CredentialsFault, 'marver/api/errors'
13
+ autoload :MethodNotAllowed, 'marver/api/errors'
14
+ autoload :Forbidden, 'marver/api/errors'
7
15
  end
8
16
  end
@@ -4,19 +4,22 @@ require 'digest/md5'
4
4
  module Marver
5
5
  module API
6
6
  class Client
7
- include Marver::Queryable
8
-
9
7
  API_VERSION = "v1"
10
8
  API_ENDPOINT = "http://gateway.marvel.com"
11
9
 
12
10
  def get(entity, options)
13
- query_string = options.empty? ? "" : hash_to_querystring(options)
14
- url = endpoint + "#{entity.to_s}?" + query_string + credentials
15
- Marver::API::Response.new(RestClient.get(url))
11
+ url = "#{endpoint}/#{entity.to_s}"
12
+ json = RestClient.get url, { params: options.merge(credentials) }
13
+ Marver::API::Response.new(json)
14
+ end
15
+
16
+ def get_uri(uri)
17
+ response = RestClient.get uri, { params: credentials }
18
+ Marver::API::Response.new(response)
16
19
  end
17
20
 
18
21
  def endpoint
19
- "#{API_ENDPOINT}/#{API_VERSION}/public/"
22
+ "#{API_ENDPOINT}/#{API_VERSION}/public"
20
23
  end
21
24
 
22
25
  def credentials
@@ -12,7 +12,7 @@ module Marver
12
12
  timestamp = Time.now.to_i.to_s
13
13
  hash = Digest::MD5.hexdigest(timestamp + private_key + public_key)
14
14
 
15
- "&ts=#{timestamp}&apikey=#{public_key}&hash=#{hash}"
15
+ { ts: timestamp, apikey: public_key, hash: hash }
16
16
  end
17
17
  end
18
18
 
@@ -0,0 +1,33 @@
1
+ module Marver
2
+ module API
3
+ class ErrorHandler
4
+ def initialize(ex)
5
+ @message = ex.response['status']
6
+ end
7
+
8
+ def handle!
9
+ case @code
10
+ when 401
11
+ raise Marver::Error::CredentialsFault.new(@message)
12
+ when 403
13
+ raise Marver::Error::MethodNotAllowed.new(@message)
14
+ when 404
15
+ raise Marver::Error::NotFound.new(@message)
16
+ when 405
17
+ raise Marver::Error::Forbidden.new(@message)
18
+ when 409
19
+ raise Marver::Error::Conflict.new(@message)
20
+ end
21
+ end
22
+ end
23
+
24
+ end
25
+
26
+ module Error
27
+ class Conflict < Exception; end
28
+ class NotFound < Exception; end
29
+ class CredentialsFault < Exception; end
30
+ class MethodNotAllowed < Exception; end
31
+ class Forbidden < Exception; end
32
+ end
33
+ end
@@ -2,13 +2,15 @@ require './lib/marver.rb'
2
2
 
3
3
  module Marver
4
4
  class Client
5
- attr_reader :characters, :series, :comics, :stories
5
+ attr_reader :characters, :series, :comics, :stories, :creators, :events
6
6
 
7
7
  def initialize
8
8
  @characters = Marver::CharacterFinder.new
9
9
  @series = Marver::SerieFinder.new
10
10
  @comics = Marver::ComicFinder.new
11
11
  @stories = Marver::StoryFinder.new
12
+ @creators = Marver::CreatorFinder.new
13
+ @events = Marver::EventFinder.new
12
14
  end
13
15
 
14
16
  end
@@ -2,32 +2,20 @@ require './lib/marver.rb'
2
2
 
3
3
  module Marver
4
4
  class Character
5
- include Marver::Summarizable
6
- include Marver::Commonable
5
+ attr_reader :id, :resource_uri, :description, :thumbnail, :urls, :name,
6
+ :series, :stories, :events, :comics, :full_path
7
7
 
8
- attr_reader :json, :id, :resource_uri, :description, :name
8
+ def initialize(args)
9
+ @series = args[:series]
10
+ @stories = args[:stories]
11
+ @events = args[:events]
12
+ @comics = args[:comics]
13
+ @urls = args[:urls]
14
+ @thumbnail = args[:thumbnail]
9
15
 
10
- class << self
11
- def build(results)
12
- if results.kind_of?(Array)
13
- results.collect do |character|
14
- Marver::Character.new(character)
15
- end
16
- else
17
- new(results)
18
- end
16
+ args[:attributes].each do |name, value|
17
+ instance_variable_set("@#{name}", value)
19
18
  end
20
19
  end
21
-
22
- def initialize(json)
23
- @json = json
24
-
25
- @description = json['description']
26
-
27
- @id = json['id'].to_i
28
- @name = json['name']
29
- @resource_uri = json['resourceURI']
30
- end
31
-
32
20
  end
33
21
  end
@@ -2,43 +2,27 @@ require './lib/marver.rb'
2
2
 
3
3
  module Marver
4
4
  class Comic
5
- include Marver::Summarizable
6
- include Marver::Commonable
5
+ attr_reader :id, :title, :stories, :series, :events, :characters, :variant_description,
6
+ :images, :ean, :format, :resource_uri, :stories, :text_objects, :digital_id,
7
+ :isbn, :diamond_code, :thumbnail, :upc, :issue_number, :prices, :issn, :dates,
8
+ :urls, :page_count, :description, :creators
7
9
 
8
- attr_reader :json, :id, :digital_id, :title, :issue_number,
9
- :variant_description, :description, :isbn,
10
- :upc, :diamond_code, :ean, :issn, :format,
11
- :page_count, :resource_uri
10
+ def initialize(args)
11
+ @series = args[:series]
12
+ @stories = args[:stories]
13
+ @creators = args[:creators]
14
+ @events = args[:events]
15
+ @characters = args[:characters]
16
+ @urls = args[:urls]
17
+ @prices = args[:prices]
18
+ @images = args[:images]
19
+ @thumbnail = args[:thumbnail]
20
+ @text_objects = args[:text_objects]
21
+ @dates = args[:dates]
12
22
 
13
- class << self
14
- def build(results)
15
- if results.kind_of?(Array)
16
- results.collect do |comic|
17
- Marver::Comic.new(comic)
18
- end
19
- else
20
- new(results)
21
- end
23
+ args[:attributes].each do |name, value|
24
+ instance_variable_set("@#{name}", value)
22
25
  end
23
26
  end
24
-
25
- def initialize(json)
26
- @json = json
27
- @title = json['title']
28
- @resource_uri = json['resourceURI']
29
- @id = json['id'].to_i
30
- @digital_id = json['digitalId']
31
- @issue_number = json['issueNumber']
32
- @variant_description = json['variantDescription']
33
- @description = json['description']
34
- @isbn = json['isbn']
35
- @upc = json['upc']
36
- @diamond_code = json['diamondCode']
37
- @ean = json['ean']
38
- @issn = json['issn']
39
- @format = json['format']
40
- @page_count = json['pageCount']
41
- end
42
-
43
27
  end
44
- end
28
+ end
@@ -1,33 +1,12 @@
1
1
  module Marver
2
2
  class Creator
3
- include Marver::Summarizable
4
- include Marver::Commonable
3
+ attr_reader :id, :first_name, :middle_name, :last_name, :full_name, :urls,
4
+ :suffix, :resource_uri, :series, :stories, :comics, :events, :thumbnail
5
5
 
6
- attr_reader :id, :first_name, :middle_name, :last_name, :full_name,
7
- :suffix, :resource_uri, :json
8
-
9
- class << self
10
- def build(results)
11
- if results.kind_of?(Array)
12
- results.collect do |creator|
13
- Marver::Creator.new(creator)
14
- end
15
- else
16
- new(results)
17
- end
6
+ def initialize(attributes)
7
+ attributes.each do |name, value|
8
+ instance_variable_set("@#{name}", value)
18
9
  end
19
10
  end
20
-
21
- def initialize(json)
22
- @json = json
23
- @id = @json['id']
24
- @first_name = @json['firstName']
25
- @middle_name = @json['middleName']
26
- @last_name = @json['lastName']
27
- @full_name = @json['fullName']
28
- @suffix = @json['suffix']
29
- @resource_uri = @json['resourceURI']
30
- end
31
-
32
11
  end
33
12
  end
@@ -1,34 +1,25 @@
1
1
  module Marver
2
2
  class Event
3
- include Marver::Summarizable
4
- include Marver::Commonable
3
+ attr_reader :title, :resource_uri, :description, :start, :end, :next, :previous,
4
+ :series, :stories, :events, :comics, :characters, :creators, :urls, :thumbnail
5
5
 
6
- attr_reader :json, :title, :resource_uri,
7
- :description, :start, :end, :next, :previous
6
+ def initialize(args)
7
+ @next = args[:next]
8
+ @previous = args[:previous]
9
+ @creators = args[:creators]
10
+ @characters = args[:characters]
11
+ @series = args[:series]
12
+ @stories = args[:stories]
13
+ @events = args[:events]
14
+ @comics = args[:comics]
15
+ @urls = args[:urls]
16
+ @thumbnail = args[:thumbnail]
17
+ @start = args[:start]
18
+ @end = args[:_end]
8
19
 
9
- class << self
10
- def build(results)
11
- if results.kind_of?(Array)
12
- results.collect do |event|
13
- Marver::Event.new(event)
14
- end
15
- else
16
- new(results)
17
- end
20
+ args[:attributes].each do |name, value|
21
+ instance_variable_set("@#{name}", value)
18
22
  end
19
23
  end
20
-
21
- def initialize(json)
22
- @json = json
23
-
24
- @title = @json['title']
25
- @resource_uri = @json['resourceURI']
26
-
27
- @description = @json['description']
28
- @start = DateTime.parse(@json['start'])
29
- @end = DateTime.parse(@json['end'])
30
- @next = Marver::Summary::Event.new(@json['next'])
31
- @previous = Marver::Summary::Event.new(@json['previous'])
32
- end
33
24
  end
34
25
  end
@@ -1,37 +1,23 @@
1
1
  module Marver
2
2
  class Serie
3
- include Marver::Summarizable
4
- include Marver::Commonable
3
+ attr_reader :id, :title, :resource_uri, :description, :start_year, :end_year, :comics,
4
+ :rating, :previous, :stories, :events, :creators, :characters, :next,
5
+ :urls, :thumbnail
5
6
 
6
- attr_reader :json, :id, :title, :resource_uri, :description,
7
- :start_year, :end_year, :rating, :next, :previous
7
+ def initialize(args)
8
+ @stories = args[:stories]
9
+ @events = args[:events]
10
+ @creators = args[:creators]
11
+ @characters = args[:characters]
12
+ @next = args[:next_serie]
13
+ @previous = args[:prev_serie]
14
+ @comics = args[:comics]
15
+ @urls = args[:urls]
16
+ @thumbnail = args[:thumbnail]
8
17
 
9
- class << self
10
- def build(results)
11
- if results.kind_of?(Array)
12
- results.collect do |serie|
13
- Marver::Serie.new(serie)
14
- end
15
- else
16
- new(results)
17
- end
18
+ args[:attributes].each do |name, value|
19
+ instance_variable_set("@#{name}", value)
18
20
  end
19
21
  end
20
-
21
- def initialize(json)
22
- @json = json
23
-
24
- @id = @json['id']
25
- @title = @json['title']
26
- @resource_uri = @json['resourceURI']
27
- @description = @json['description']
28
- @start_year = @json['startYear']
29
- @end_year = @json['endYear']
30
- @rating = @json['rating']
31
-
32
- @next = Marver::Summary::Serie.new(@json['next'])
33
- @previous = Marver::Summary::Serie.new(@json['previous'])
34
- end
35
-
36
22
  end
37
23
  end