myanimelist 0.0.6 → 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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 60ee360b5bd08a49364d81064109805a61cc58d8
4
- data.tar.gz: 6dce9b0faaae0d0aaec913d0c8914118fc19cba9
3
+ metadata.gz: 36e2394e2cc00a68cf29f2a2f415c7d18496b2e6
4
+ data.tar.gz: de27746feff083309417341a421a3d93a5cdc5e6
5
5
  SHA512:
6
- metadata.gz: 808261cb089aeaa457579bfade0b3473cbb3d2d34d46fbd47a8e0539a7dfeba93cd4f59b27ff6399151c76f52b0bd23798e847013c8a45329b5e5b93e7e708ef
7
- data.tar.gz: 64dd32a27dd3a9d7e8d9580502fcd5aaadc07768d6613c23a6fff4a1a4c59f2c8d5dd8556670c10b1ebcecba720f2d50f7ebaf6b6ee41e89fa00c8f42567cef5
6
+ metadata.gz: 04ccd0576989e8c6db19870d5acfc86b6c68773464886d8082d1e1d27aff5d944eaec30658c0a751cc169050f50200968ce92692272077534ad886b1d1f15930
7
+ data.tar.gz: 496e664055f874ac4ef857c7f08e211bc2cab5e3bddbb7eee3b23e35bde8526243e026ef510daf319c7a9274b4499b1815f3950473a703206e160c17a5458d46
data/.gitignore CHANGED
@@ -3,6 +3,7 @@
3
3
  .bundle
4
4
  .config
5
5
  .yardoc
6
+ .rvmrc
6
7
  Gemfile.lock
7
8
  InstalledFiles
8
9
  _yardoc
data/README.md CHANGED
@@ -1,11 +1,12 @@
1
1
  # MyAnimeList
2
- An API for http://myanimelist.net for searching animes and mangas up to date!
2
+ A gem wrapper for http://myanimelist.net that covers all the methods available on the current API
3
3
  For additional documentation, visit: http://myanimelist.net/modules.php?go=api
4
+
4
5
  ## Installation
5
6
 
6
7
  Add this line to your application's Gemfile:
7
8
 
8
- gem 'myanimelist', '~> 0.0.6'
9
+ gem 'myanimelist', '~> 1.0'
9
10
 
10
11
  And then execute:
11
12
 
@@ -16,50 +17,94 @@ Or install it yourself as:
16
17
  $ gem install myanimelist
17
18
 
18
19
  ### Configuration
19
- MyAnimeList API requires authentication from the actual site, so you need to sign up first
20
- <a href="http://myanimelist.net/register.php">here</a>
20
+ MyAnimeList API requires authentication from the actual site, so you need to sign up first [here](http://myanimelist.net/register.php).
21
21
 
22
22
  After signing up and verifying your email, you need to assign the username and password on your respective myanimelist API,
23
- here's what you need to do,
23
+ here's what you need to do,
24
24
  If you are using Rails: setup `config/initializers/myanimelist.rb`:
25
25
  ```ruby
26
26
  MyAnimeList.configure do |config|
27
- config.username = "username"
28
- config.password = "password"
27
+ config.username = ENV['username']
28
+ config.password = ENV['password']
29
29
  end
30
30
  ```
31
31
  If you are not using rails make sure to set this up before you can start searching.
32
32
 
33
33
  ## Usage
34
- #####For Anime:
35
- ```ruby
36
- MyAnimeList.search_anime("Anime name here.")
34
+ #### Verify Credentials
35
+ Additional step for verifying credentials from myanimelist.
37
36
  ```
38
- ####For Manga:
39
- ```ruby
40
- MyAnimeList.search_manga("Manga name here.")
37
+ MyAnimeList.verify_crendetials
41
38
  ```
42
39
 
43
- Simple isn't it?
40
+ #### Search Anime/Manga
41
+ Returns an Array of Hashes for the result.
42
+ ```
43
+ # Anime
44
+ > MyAnimeList.search_anime('Fairy Tail')
45
+ > MyAnimeList::Anime.search('Fairy Tail')
46
+
47
+ # Manga
48
+ > MyAnimeList.search_manga('Fairy Tail')
49
+ > MyAnimeList::Manga.search('Fairy Tail'
50
+ ```
44
51
 
45
- ##Example
52
+ #### Add Anime/Manga
53
+ Adds anime/manga on your list. For additional `Anime` parameters, please refer [here](https://myanimelist.net/modules.php?go=api#animevalues). For `Manga`, please refer [here](https://myanimelist.net/modules.php?go=api#mangavalues).
54
+ Just imagine that the xml value would be the key:value pair in ruby, as seen below.
55
+ ```
56
+ # Anime
57
+ > MyAnimeList::Anime.add(anime_id, { episode: 1, status: 2 })
58
+ => true
59
+
60
+ # Manga
61
+ > MyAnimeList::Manga.add(manga_id, { chapter: 1 })
62
+ => true
63
+ ```
64
+
65
+ #### Update Anime/Manga
66
+ Updates anime/manga on your list. For additional `Anime` parameters, please refer [here](https://myanimelist.net/modules.php?go=api#animevalues). For `Manga`, please refer [here](https://myanimelist.net/modules.php?go=api#mangavalues).
67
+ Just imagine that the xml value would be the key:value pair in ruby, as seen below.
68
+ ```
69
+ # Anime
70
+ > MyAnimeList::Anime.update(anime_id, { episode: 1, status: 2 })
71
+ => true
72
+
73
+ # Manga
74
+ > MyAnimeList::Manga.update(manga_id, { chapter: 1 })
75
+ => true
76
+ ```
77
+
78
+ #### Remove Anime/Manga
79
+ Remove anime/manga on your list.
80
+ ```
81
+ # Anime
82
+ > MyAnimeList::Anime.remove(anime_id)
83
+ => true
84
+
85
+ # Manga
86
+ > MyAnimeList::Manga.remove(manga_id)
87
+ => true
88
+ ```
89
+
90
+ ## Example
46
91
  ```ruby
47
92
  MyAnimeList.search_anime('Fairy Tail')
48
-
49
- #will result to the followinghash
50
-
51
- => [{"id"=>"6702",
52
- "title"=>"Fairy Tail",
53
- "english"=>nil,
54
- "synonyms"=>nil,
55
- "episodes"=>"175",
56
- "score"=>"8.57",
57
- "type"=>"TV",
58
- "status"=>"Finished Airing",
59
- "start_date"=>"2009-10-12",
60
- "end_date"=>"2013-03-30",
93
+
94
+ # will result to the followinghash
95
+
96
+ => [{"id"=>"6702",
97
+ "title"=>"Fairy Tail",
98
+ "english"=>nil,
99
+ "synonyms"=>nil,
100
+ "episodes"=>"175",
101
+ "score"=>"8.57",
102
+ "type"=>"TV",
103
+ "status"=>"Finished Airing",
104
+ "start_date"=>"2009-10-12",
105
+ "end_date"=>"2013-03-30",
61
106
  "synopsis"=>
62
- "Set in an imaginary world, the Earth Land, there exists a Mage Guild called Fairy Tail...",
107
+ "Set in an imaginary world, the Earth Land, there exists a Mage Guild called Fairy Tail...",
63
108
  "image"=>"http://cdn.myanimelist.net/images/anime/5/18179.jpg"}
64
109
  }]
65
110
 
@@ -74,4 +119,9 @@ Simple isn't it?
74
119
  5. Create new Pull Request
75
120
 
76
121
 
77
- ## Special Thanks for http://myanimelist.net, That's it, Thanks and have fun :)
122
+ ## Thanks
123
+ [MyAnimeList](myanimelist.net) for the API.
124
+
125
+ **myanimelist** © 2013+, Harvey Ico. Released under the [MIT](http://mit-license.org/) License.
126
+
127
+ Authored and maintained by Harvey Ico with help from contributors ([list](https://github.com/harveyico/myanimelist/contributors)).
@@ -1,6 +1,7 @@
1
+ require 'rest-client'
2
+ require 'xmlsimple'
1
3
  require 'myanimelist/version'
2
- require 'rest_client'
3
- require 'active_support/core_ext/hash'
4
+ require 'myanimelist/api'
4
5
  require 'myanimelist/anime'
5
6
  require 'myanimelist/manga'
6
7
  require 'myanimelist/credentials'
@@ -8,21 +9,18 @@ require 'myanimelist/serializer'
8
9
 
9
10
  module MyAnimeList
10
11
  def self.configure(&block)
11
- credentials = Credentials.new
12
- block.call(credentials)
13
- @myanimelist_username = credentials.username
14
- @myanimelist_password = credentials.password
12
+ block.call(Credentials) if block_given?
13
+ end
15
14
 
16
- true if block_given?
15
+ def self.verify_credentials
16
+ Api.new.verify_credentials!
17
17
  end
18
18
 
19
19
  def self.search_anime(name)
20
- animes = Anime.new(username: @myanimelist_username, password: @myanimelist_password)
21
- animes.search name
20
+ MyAnimeList::Anime.search(name)
22
21
  end
23
22
 
24
23
  def self.search_manga(name)
25
- manga = Manga.new(username: @myanimelist_username, password: @myanimelist_password)
26
- manga.search name
24
+ MyAnimeList::Manga.search(name)
27
25
  end
28
26
  end
@@ -1,34 +1,19 @@
1
1
  module MyAnimeList
2
2
  class Anime
3
-
4
- def initialize(options={})
5
- @myanimelist_username = options[:username]
6
- @myanimelist_password = options[:password]
3
+ def self.search(name)
4
+ Api.new.search('anime', name)
7
5
  end
8
6
 
9
- def search(name)
10
- get_search(name)
7
+ def self.add(id, params = {})
8
+ Api.new.add('anime', id, params)
11
9
  end
12
10
 
13
- def get_search(name)
14
- response = RestClient::Request.new(
15
- method: :get,
16
- url: "https://myanimelist.net/api/anime/search.xml?q=#{CGI::escape name}",
17
- user: @myanimelist_username,
18
- password: @myanimelist_password,
19
- content_type: :xml ).execute
20
-
21
- parse_xml response
11
+ def self.update(id, params = {})
12
+ Api.new.update('anime', id, params)
22
13
  end
23
14
 
24
- def parse_xml(response)
25
- serialize Hash.from_xml response
15
+ def self.remove(id)
16
+ Api.new.remove('anime', id)
26
17
  end
27
-
28
- def serialize(data)
29
- result = MyAnimeList::Serializer.new data, 'anime'
30
- result.fetch
31
- end
32
-
33
18
  end
34
19
  end
@@ -0,0 +1,63 @@
1
+ module MyAnimeList
2
+ class ApiException < Exception; end
3
+ class Api
4
+ BASE_URL = 'https://myanimelist.net/api'
5
+
6
+ def search(type, name)
7
+ body = request("#{BASE_URL}/#{type}/search.xml?q=#{CGI::escape name}")
8
+
9
+ Serializer.new(body).entry
10
+ end
11
+
12
+ def add(type, id, params = {})
13
+ request("#{BASE_URL}/#{type}list/add/#{id}.xml", params) == 'Created'
14
+ end
15
+
16
+ def update(type, id, params = {})
17
+ request("#{BASE_URL}/#{type}list/update/#{id}.xml", params) == 'Updated'
18
+ end
19
+
20
+ def remove(type, id)
21
+ request("#{BASE_URL}/#{type}list/delete/#{id}.xml") == 'Deleted'
22
+ end
23
+
24
+ def verify_credentials!
25
+ body = request("#{BASE_URL}/account/verify_credentials.xml")
26
+
27
+ Serializer.new(body).call
28
+ end
29
+
30
+ private
31
+
32
+ def request(url, params = {})
33
+ RestClient::Request.new( build_params(url, params) ).execute do |resp|
34
+ if resp.code == 200 || resp.code == 201
35
+ resp.body
36
+ else
37
+ raise ApiException.new(resp.body)
38
+ end
39
+ end
40
+ end
41
+
42
+ def build_params(url, params)
43
+ {
44
+ method: :get,
45
+ url: url,
46
+ user: Credentials.username,
47
+ password: Credentials.password,
48
+ content_type: :xml
49
+ }.merge( headers(params) )
50
+ end
51
+
52
+ def headers(params)
53
+ return {} if params.empty?
54
+ {
55
+ headers: {
56
+ params: {
57
+ data: XmlSimple.xml_out(params, rootname: 'entry', noattr: true, noindent: true, keeproot: false)
58
+ }
59
+ }
60
+ }
61
+ end
62
+ end
63
+ end
@@ -1,6 +1,8 @@
1
1
  module MyAnimeList
2
2
  class Credentials
3
- attr_accessor :username
4
- attr_accessor :password
3
+ class << self
4
+ attr_accessor :username
5
+ attr_accessor :password
6
+ end
5
7
  end
6
8
  end
@@ -1,34 +1,19 @@
1
1
  module MyAnimeList
2
- class Manga
3
-
4
- def initialize(options={})
5
- @myanimelist_username = options[:username]
6
- @myanimelist_password = options[:password]
2
+ class Manga < Api
3
+ def self.search(name)
4
+ Api.new.search('manga', name)
7
5
  end
8
6
 
9
- def search(name)
10
- get_search(name)
7
+ def self.add(id, params = {})
8
+ Api.new.add('manga', id, params)
11
9
  end
12
10
 
13
- def get_search(name)
14
- response = RestClient::Request.new(
15
- method: :get,
16
- url: "https://myanimelist.net/api/manga/search.xml?q=#{CGI::escape name}",
17
- user: @myanimelist_username,
18
- password: @myanimelist_password,
19
- content_type: :xml ).execute
20
-
21
- parse_xml response
11
+ def self.update(id, params = {})
12
+ Api.new.update('manga', id, params)
22
13
  end
23
14
 
24
- def parse_xml(response)
25
- serialize Hash.from_xml response
15
+ def self.remove(id)
16
+ Api.new.remove('manga', id)
26
17
  end
27
-
28
- def serialize(data)
29
- result = MyAnimeList::Serializer.new data, 'manga'
30
- result.fetch
31
- end
32
-
33
18
  end
34
19
  end
@@ -1,29 +1,18 @@
1
1
  module MyAnimeList
2
2
  class Serializer
3
- def initialize(data, type)
4
- @type = type
5
- @animes = data || []
6
- end
3
+ attr_accessor :response
7
4
 
8
- def fetch
9
- serialize_data
5
+ def initialize(resp)
6
+ @response = resp
10
7
  end
11
8
 
12
- def serialize_data
13
- return @animes if is_array? @animes
14
-
15
- collection = []
16
- data = @animes[@type]['entry']
17
- if is_array? data
18
- collection += data
19
- else
20
- collection << data
21
- end
9
+ def entry
10
+ hash = XmlSimple.xml_in(response, force_array: false)
11
+ hash['entry']
22
12
  end
23
13
 
24
- def is_array?(data)
25
- data.is_a? Array
14
+ def call
15
+ XmlSimple.xml_in(response, force_array: false)
26
16
  end
27
-
28
17
  end
29
18
  end
@@ -1,3 +1,3 @@
1
- module Myanimelist
2
- VERSION = '0.0.6'
1
+ module MyAnimeList
2
+ VERSION = '1.0.0'
3
3
  end
@@ -5,7 +5,7 @@ require 'myanimelist/version'
5
5
 
6
6
  Gem::Specification.new do |spec|
7
7
  spec.name = 'myanimelist'
8
- spec.version = Myanimelist::VERSION
8
+ spec.version = MyAnimeList::VERSION
9
9
  spec.authors = ['Harvey Ico']
10
10
  spec.email = ['godstrikerharvey@gmail.com']
11
11
  spec.description = %q{The API for MyAnimeList.net}
@@ -18,8 +18,8 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_development_dependency 'bundler', '~> 1.3'
22
- spec.add_development_dependency 'rake'
23
- spec.add_dependency 'rest-client'
24
- spec.add_dependency 'activesupport'
21
+ spec.add_development_dependency 'bundler', '1.3'
22
+ spec.add_development_dependency 'rake', '12.0.0'
23
+ spec.add_dependency 'rest-client', '2.0.2'
24
+ spec.add_dependency 'xml-simple', '1.1.5'
25
25
  end
metadata CHANGED
@@ -1,71 +1,71 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: myanimelist
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.6
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Harvey Ico
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-04-27 00:00:00.000000000 Z
11
+ date: 2017-05-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - '='
18
18
  - !ruby/object:Gem::Version
19
19
  version: '1.3'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - '='
25
25
  - !ruby/object:Gem::Version
26
26
  version: '1.3'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - ">="
31
+ - - '='
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: 12.0.0
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - ">="
38
+ - - '='
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: 12.0.0
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rest-client
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - ">="
45
+ - - '='
46
46
  - !ruby/object:Gem::Version
47
- version: '0'
47
+ version: 2.0.2
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - ">="
52
+ - - '='
53
53
  - !ruby/object:Gem::Version
54
- version: '0'
54
+ version: 2.0.2
55
55
  - !ruby/object:Gem::Dependency
56
- name: activesupport
56
+ name: xml-simple
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - ">="
59
+ - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: '0'
61
+ version: 1.1.5
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - ">="
66
+ - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: '0'
68
+ version: 1.1.5
69
69
  description: The API for MyAnimeList.net
70
70
  email:
71
71
  - godstrikerharvey@gmail.com
@@ -80,6 +80,7 @@ files:
80
80
  - Rakefile
81
81
  - lib/myanimelist.rb
82
82
  - lib/myanimelist/anime.rb
83
+ - lib/myanimelist/api.rb
83
84
  - lib/myanimelist/credentials.rb
84
85
  - lib/myanimelist/manga.rb
85
86
  - lib/myanimelist/serializer.rb