rbrainz 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 (84) hide show
  1. data/LICENSE +25 -0
  2. data/README +11 -0
  3. data/Rakefile +110 -0
  4. data/TODO +24 -0
  5. data/doc/README.rdoc +68 -0
  6. data/examples/getartist.rb +54 -0
  7. data/lib/rbrainz.rb +11 -0
  8. data/lib/rbrainz/data/countrynames.rb +259 -0
  9. data/lib/rbrainz/data/languagenames.rb +404 -0
  10. data/lib/rbrainz/data/scriptnames.rb +64 -0
  11. data/lib/rbrainz/model.rb +48 -0
  12. data/lib/rbrainz/model/alias.rb +23 -0
  13. data/lib/rbrainz/model/artist.rb +54 -0
  14. data/lib/rbrainz/model/disc.rb +30 -0
  15. data/lib/rbrainz/model/entity.rb +72 -0
  16. data/lib/rbrainz/model/incomplete_date.rb +76 -0
  17. data/lib/rbrainz/model/label.rb +55 -0
  18. data/lib/rbrainz/model/mbid.rb +82 -0
  19. data/lib/rbrainz/model/release.rb +50 -0
  20. data/lib/rbrainz/model/release_event.rb +34 -0
  21. data/lib/rbrainz/model/track.rb +27 -0
  22. data/lib/rbrainz/webservice.rb +6 -0
  23. data/lib/rbrainz/webservice/filter.rb +132 -0
  24. data/lib/rbrainz/webservice/includes.rb +150 -0
  25. data/lib/rbrainz/webservice/mbxml.rb +404 -0
  26. data/lib/rbrainz/webservice/query.rb +61 -0
  27. data/lib/rbrainz/webservice/webservice.rb +69 -0
  28. data/test/lib/test_entity.rb +58 -0
  29. data/test/lib/testing_helper.rb +13 -0
  30. data/test/test-data/README +13 -0
  31. data/test/test-data/invalid/artist/basic_1.xml +12 -0
  32. data/test/test-data/invalid/artist/basic_2.xml +12 -0
  33. data/test/test-data/invalid/artist/empty_1.xml +0 -0
  34. data/test/test-data/invalid/artist/empty_2.xml +3 -0
  35. data/test/test-data/invalid/artist/empty_3.xml +7 -0
  36. data/test/test-data/invalid/artist/search_result_1.xml +11 -0
  37. data/test/test-data/valid/artist/Tchaikovsky-1.xml +90 -0
  38. data/test/test-data/valid/artist/Tori_Amos_1.xml +8 -0
  39. data/test/test-data/valid/artist/Tori_Amos_2.xml +53 -0
  40. data/test/test-data/valid/artist/Tori_Amos_3.xml +25 -0
  41. data/test/test-data/valid/artist/Tori_Amos_4.xml +14 -0
  42. data/test/test-data/valid/artist/Tori_Amos_5.xml +13 -0
  43. data/test/test-data/valid/artist/empty_1.xml +7 -0
  44. data/test/test-data/valid/artist/empty_2.xml +11 -0
  45. data/test/test-data/valid/artist/search_result_1.xml +19 -0
  46. data/test/test-data/valid/label/Atlantic_Records_1.xml +9 -0
  47. data/test/test-data/valid/label/Atlantic_Records_2.xml +11 -0
  48. data/test/test-data/valid/label/search_result_1.xml +14 -0
  49. data/test/test-data/valid/release/Highway_61_Revisited_1.xml +68 -0
  50. data/test/test-data/valid/release/Little_Earthquakes_1.xml +24 -0
  51. data/test/test-data/valid/release/Little_Earthquakes_2.xml +73 -0
  52. data/test/test-data/valid/release/Mission_Impossible_2.xml +155 -0
  53. data/test/test-data/valid/release/Under_the_Pink_1.xml +16 -0
  54. data/test/test-data/valid/release/Under_the_Pink_2.xml +14 -0
  55. data/test/test-data/valid/release/Under_the_Pink_3.xml +16 -0
  56. data/test/test-data/valid/release/search_result_1.xml +29 -0
  57. data/test/test-data/valid/track/Silent_All_These_Years_1.xml +7 -0
  58. data/test/test-data/valid/track/Silent_All_These_Years_2.xml +21 -0
  59. data/test/test-data/valid/track/Silent_All_These_Years_3.xml +16 -0
  60. data/test/test-data/valid/track/Silent_All_These_Years_4.xml +30 -0
  61. data/test/test-data/valid/track/Silent_All_These_Years_5.xml +20 -0
  62. data/test/test-data/valid/track/search_result_1.xml +45 -0
  63. data/test/test-data/valid/user/User_1.xml +15 -0
  64. data/test/test_alias.rb +50 -0
  65. data/test/test_artist.rb +132 -0
  66. data/test/test_artist_filter.rb +36 -0
  67. data/test/test_artist_includes.rb +63 -0
  68. data/test/test_disc.rb +38 -0
  69. data/test/test_incomplete_date.rb +60 -0
  70. data/test/test_label.rb +129 -0
  71. data/test/test_label_filter.rb +36 -0
  72. data/test/test_label_includes.rb +55 -0
  73. data/test/test_mbid.rb +99 -0
  74. data/test/test_mbxml.rb +368 -0
  75. data/test/test_query.rb +24 -0
  76. data/test/test_release.rb +161 -0
  77. data/test/test_release_event.rb +67 -0
  78. data/test/test_release_filter.rb +57 -0
  79. data/test/test_release_includes.rb +73 -0
  80. data/test/test_track.rb +102 -0
  81. data/test/test_track_filter.rb +57 -0
  82. data/test/test_track_includes.rb +61 -0
  83. data/test/test_webservice.rb +23 -0
  84. metadata +138 -0
data/LICENSE ADDED
@@ -0,0 +1,25 @@
1
+ Copyright (c) 2007, Philipp Wolfer
2
+
3
+ Redistribution and use in source and binary forms, with or without
4
+ modification, are permitted provided that the following conditions
5
+ are met:
6
+ 1. Redistributions of source code must retain the above copyright
7
+ notice, this list of conditions and the following disclaimer.
8
+ 2. Redistributions in binary form must reproduce the above copyright
9
+ notice, this list of conditions and the following disclaimer in the
10
+ documentation and/or other materials provided with the distribution.
11
+ 3. Neither the name of the RBrainz project nor the names of the
12
+ contributors may be used to endorse or promote products derived from
13
+ this software without specific prior written permission.
14
+
15
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
16
+ "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
17
+ LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
18
+ A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
19
+ OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
20
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
21
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
22
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
23
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
24
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
data/README ADDED
@@ -0,0 +1,11 @@
1
+ RBrainz - Ruby MusicBrainz library
2
+
3
+ See doc/README.rdoc for details about RBrainz.
4
+
5
+ To generate the complete RBrainz documentation run
6
+ rake rdoc
7
+
8
+ The documentation will be stored in doc/api.
9
+
10
+ Copyright (c) 2007, Philipp Wolfer
11
+ Licensing information can be found in the file LICENSE.
data/Rakefile ADDED
@@ -0,0 +1,110 @@
1
+ # $Id: Rakefile 4 2007-05-21 02:04:26Z phw $
2
+ # Copyright (c) 2007, Philipp Wolfer
3
+ # All rights reserved.
4
+ # See LICENSE for permissions.
5
+
6
+ # Rakefile for RBrainz
7
+
8
+ require 'rubygems'
9
+ require 'rake/gempackagetask'
10
+ require 'rake/testtask'
11
+ require 'rake/rdoctask'
12
+
13
+ # Packaging tasks: -------------------------------------------------------
14
+
15
+ PKG_NAME = 'rbrainz'
16
+ PKG_VERSION = '0.1.0'
17
+ PKG_FILES = FileList[
18
+ "Rakefile", "LICENSE", "README", "TODO",
19
+ "doc/README.rdoc",
20
+ "examples/**/*",
21
+ "lib/**/*.rb",
22
+ "test/**/*.rb",
23
+ "test/test-data/**/*"
24
+ ]
25
+
26
+ spec = Gem::Specification.new do |spec|
27
+ spec.platform = Gem::Platform::RUBY
28
+ spec.summary = 'Ruby library for the MusicBrainz XML webservice.'
29
+ spec.name = PKG_NAME
30
+ spec.version = PKG_VERSION
31
+ spec.requirements << 'none'
32
+ spec.require_path = 'lib'
33
+ spec.autorequire = 'rbrainz'
34
+ spec.files = PKG_FILES
35
+ spec.description = <<EOF
36
+ RBrainz is a Ruby client library to access the MusicBrainz XML
37
+ webservice written in pure Ruby.
38
+
39
+ RBrainz follows the design of python-musicbrainz2, the reference
40
+ implementation for a MusicBrainz client library. Developers used to
41
+ python-musicbrainz2 should already know most of RBrainz' interface.
42
+ However, RBrainz differs from python-musicbrainz2 wherever it makes
43
+ the library more Ruby like or easier to use.
44
+
45
+ RBrainz supports the MusicBrainz XML Metadata Version 1.1, including
46
+ support for labels and extended release events.
47
+ EOF
48
+ spec.author = 'Philipp Wolfer'
49
+ spec.email = 'phw@rubyforge.org'
50
+ spec.homepage = 'http://rbrainz.rubyforge.org'
51
+ spec.rubyforge_project = 'rbrainz'
52
+ spec.has_rdoc = true
53
+ spec.extra_rdoc_files = ['doc/README.rdoc']
54
+ end
55
+
56
+ Rake::GemPackageTask.new(spec) do |pkg|
57
+ pkg.need_zip = true
58
+ pkg.need_tar_gz= true
59
+ end
60
+
61
+ # Test tasks: ------------------------------------------------------------
62
+
63
+ desc "Run the unit and functional tests"
64
+ task :test => [:test_units, :test_functional]
65
+
66
+ desc "Run just the unit tests"
67
+ Rake::TestTask.new(:test_units) do |test|
68
+ test.test_files = FileList['test/test*.rb']
69
+ test.libs = ['lib', 'test/lib']
70
+ test.warning = true
71
+ end
72
+
73
+ desc "Run just the functional tests"
74
+ Rake::TestTask.new(:test_functional) do |test|
75
+ test.test_files = FileList['test/functional*.rb']
76
+ test.libs = ['lib', 'test/lib']
77
+ test.warning = true
78
+ end
79
+
80
+ # Documentation tasks: ---------------------------------------------------
81
+
82
+ Rake::RDocTask.new do |rdoc|
83
+ rdoc.title = "RBrainz %s" % PKG_VERSION
84
+ rdoc.main = 'doc/README.rdoc'
85
+ rdoc.rdoc_dir = 'doc/api'
86
+ rdoc.rdoc_files.include('doc/README.rdoc', 'lib/**/*.rb',
87
+ 'LICENSE', 'TODO')
88
+ rdoc.options << '--inline-source' << '--line-numbers'
89
+ end
90
+
91
+ # Other tasks: -----------------------------------------------------------
92
+
93
+ def egrep(pattern)
94
+ Dir['**/*.rb'].each do |fn|
95
+ count = 0
96
+ open(fn) do |f|
97
+ while line = f.gets
98
+ count += 1
99
+ if line =~ pattern
100
+ puts "#{fn}:#{count}:#{line}"
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
106
+
107
+ desc "Look for TODO and FIXME tags in the code"
108
+ task :todo do
109
+ egrep /#.*(FIXME|TODO)/
110
+ end
data/TODO ADDED
@@ -0,0 +1,24 @@
1
+ =TODO
2
+
3
+ ==Short term tasks
4
+ * Support relationships (0.1.1)
5
+ * Query collections (0.1.2)
6
+ * Support for the score parameter in search result. Could be implemented
7
+ a little bit like in PythonMusicBrainz2, but more flexible. Maybe a result
8
+ object over which one can iterate to retrieve all results witch the
9
+ corresponding score. (0.1.2)
10
+ result.each {|entity, score|
11
+ ...
12
+ }
13
+ * Support for the offset parameter for queries on collections
14
+ to retrieve results below the 100 results limit. Could be easily integrated
15
+ into the result object (see previous point). (0.1.2)
16
+ * Make it easier to create MBID objects or allow usage of ID strings
17
+ where it makes life easier.
18
+
19
+ ==Longer term tasks
20
+ * Calculation of disc IDs (0.3.0)
21
+ * User authentication (0.4.0)
22
+ * Querying of user information (0.4.0)
23
+ * PUID submission
24
+ * Full text search (lucene search queries).
data/doc/README.rdoc ADDED
@@ -0,0 +1,68 @@
1
+ =RBrainz - Ruby MusicBrainz library
2
+ RBrainz is a Ruby client library to access the MusicBrainz XML webservice,
3
+ which can be used to query the MusicBrainz database.
4
+
5
+ RBrainz is written in pure Ruby and follows the design of
6
+ PythonMusicBrainz2[http://musicbrainz.org/doc/PythonMusicBrainz2],
7
+ the reference implementation for a MusicBrainz client library. Developers
8
+ used to PythonMusicBrainz2 should already know most of RBrainz' interface.
9
+ However, RBrainz differs from PythonMusicBrainz2 wherever it makes the
10
+ library more Ruby like or easier to use.
11
+
12
+ RBrainz supports the MusicBrainz XML Metadata Version 1.1, including support
13
+ for labels and extended release events.
14
+
15
+ ==Installation
16
+ ===Installing with RubyGems
17
+ The easiest way to install the latest release of RBrainz is using
18
+ RubyGems[http://rubygems.org] by executing the following command:
19
+ gem install rbrainz
20
+
21
+ ===Manual installation
22
+ Not supported, yet.
23
+
24
+ ==Basic usage
25
+ The most important classes in this library are the model classes
26
+ MusicBrainz::Model::Artist, MusicBrainz::Model::Release,
27
+ MusicBrainz::Model::Track and MusicBrainz::Model::Label
28
+ together with MusicBrainz::Webservice::Query. The Query class
29
+ provides an easy to use interface to query the MusicBrainz webservice.
30
+ It will always return one of the model classes above or an
31
+ array of those classes. The example below should make the usage clear:
32
+
33
+ require 'rbrainz'
34
+ include MusicBrainz
35
+
36
+ # Create an MBID object which represents a MusicBrainz artist ID.
37
+ mbid = Model::MBID.from_uuid(:artist, 'c0b2500e-0cef-4130-869d-732b23ed9df5')
38
+
39
+ # With the ArtistInclude object we can control what kind of information
40
+ # the MusicBrainz server will include in its answer.
41
+ artist_includes = Webservice::ArtistIncludes.new(
42
+ :aliases => true,
43
+ :releases => ['Album', 'Official'],
44
+ :artist_rels => true,
45
+ :release_rels => true,
46
+ :track_rels => true,
47
+ :label_rels => true,
48
+ :url_rels => true
49
+ )
50
+
51
+ # Query the webservice for the artist with the above ID
52
+ # The result will contain all the information specified
53
+ # in artist_includes.
54
+ q = Webservice::Query.new
55
+ artist = q.get_artist_by_id(mbid, artist_includes)
56
+
57
+ ==The MusicBrainz webservice
58
+ For more information about the MusicBrainz webservice visit the
59
+ following resources:
60
+ - MusicBrainzXMLWebService[http://musicbrainz.org/doc/XMLWebService]
61
+ - MusicBrainzXMLMetaData[http://musicbrainz.org/doc/MusicBrainzXMLMetaData]
62
+
63
+ ==License
64
+ RBrainz is Copyright (c) 2007 Philipp Wolfer.
65
+ It is free softare distributed under a BSD style license. See
66
+ LICENSE[link:files/LICENSE.html] for details.
67
+
68
+ $Id: README.rdoc 5 2007-05-21 16:51:22Z phw $
@@ -0,0 +1,54 @@
1
+ #!/usr/bin/env ruby
2
+ #
3
+ # Example script which queries the database for an
4
+ # artist and displays the artist's data.
5
+ #
6
+ # $Id: getartist.rb 16 2007-05-23 15:49:06Z phw $
7
+
8
+ # Just make sure we can run this example from the command
9
+ # line even if RBrainz is not yet installed properly.
10
+ $: << 'lib/' << '../lib/'
11
+
12
+ # Load RBrainz and include the MusicBrainz namespace.
13
+ require 'rbrainz'
14
+ include MusicBrainz
15
+
16
+ # The artist's MusicBrainz ID.
17
+ # Either read it from the command line as the first
18
+ # parameter or use a default one for demonstration.
19
+ id = $*[0] ? $*[0] : '10bf95b6-30e3-44f1-817f-45762cdc0de0'
20
+
21
+ # Generate a new artist MBID object from the ID:
22
+ mbid = Model::MBID.from_uuid(:artist, id)
23
+
24
+ # Define what information about the artist
25
+ # should be included in the result.
26
+ # In this case the artist's aliases and all
27
+ # the official albums by this artist will be
28
+ # fetched.
29
+ artist_includes = Webservice::ArtistIncludes.new(
30
+ :aliases => true,
31
+ :releases => ['Album', 'Official']
32
+ )
33
+
34
+ # Create a new Query object which will provide
35
+ # us an interface to the MusicBrainz webservice.
36
+ query = Webservice::Query.new
37
+
38
+ # Now query the MusicBrainz database for the artist
39
+ # with the MBID defined above.
40
+ artist = query.get_artist_by_id(mbid, artist_includes)
41
+
42
+ # Display the fetched artist data together with all
43
+ # unique release titles.
44
+ print <<EOF
45
+ ID : #{artist.id.uuid}
46
+ Name : #{artist.name}
47
+ Sort name : #{artist.sort_name}
48
+ Disambiguation: #{artist.disambiguation}
49
+ Type : #{artist.type}
50
+ Begin date : #{artist.begin_date}
51
+ End date : #{artist.end_date}
52
+ Aliases : #{artist.aliases.join('; ')}
53
+ Releases : #{artist.releases.map{|r| r.title}.uniq.join("\r\n ")}
54
+ EOF
data/lib/rbrainz.rb ADDED
@@ -0,0 +1,11 @@
1
+ # $Id: rbrainz.rb 4 2007-05-21 02:04:26Z phw $
2
+ # Copyright (c) 2007, Philipp Wolfer
3
+ # All rights reserved.
4
+ # See LICENSE for permissions.
5
+
6
+ # This is actually just a convenient shortcut that allows
7
+ # the user to use RBrainz by just using <tt>require 'rbrainz'</tt>.
8
+ # This will include the whole RBrainz webservice library, which
9
+ # should be ok most of the time.
10
+
11
+ require 'rbrainz/webservice'
@@ -0,0 +1,259 @@
1
+ # $Id: countrynames.rb 4 2007-05-21 02:04:26Z phw $
2
+ # Copyright (c) 2007, Philipp Wolfer
3
+ # All rights reserved.
4
+ # See LICENSE for permissions.
5
+
6
+ module MusicBrainz
7
+ module Data
8
+
9
+ # List of country names.
10
+ COUNTRY_NAMES = {
11
+ 'BD' => 'Bangladesh',
12
+ 'BE' => 'Belgium',
13
+ 'BF' => 'Burkina Faso',
14
+ 'BG' => 'Bulgaria',
15
+ 'BB' => 'Barbados',
16
+ 'WF' => 'Wallis and Futuna Islands',
17
+ 'BM' => 'Bermuda',
18
+ 'BN' => 'Brunei Darussalam',
19
+ 'BO' => 'Bolivia',
20
+ 'BH' => 'Bahrain',
21
+ 'BI' => 'Burundi',
22
+ 'BJ' => 'Benin',
23
+ 'BT' => 'Bhutan',
24
+ 'JM' => 'Jamaica',
25
+ 'BV' => 'Bouvet Island',
26
+ 'BW' => 'Botswana',
27
+ 'WS' => 'Samoa',
28
+ 'BR' => 'Brazil',
29
+ 'BS' => 'Bahamas',
30
+ 'BY' => 'Belarus',
31
+ 'BZ' => 'Belize',
32
+ 'RU' => 'Russian Federation',
33
+ 'RW' => 'Rwanda',
34
+ 'RE' => 'Reunion',
35
+ 'TM' => 'Turkmenistan',
36
+ 'TJ' => 'Tajikistan',
37
+ 'RO' => 'Romania',
38
+ 'TK' => 'Tokela',
39
+ 'GW' => 'Guinea-Bissa',
40
+ 'GU' => 'Guam',
41
+ 'GT' => 'Guatemala',
42
+ 'GR' => 'Greece',
43
+ 'GQ' => 'Equatorial Guinea',
44
+ 'GP' => 'Guadeloupe',
45
+ 'JP' => 'Japan',
46
+ 'GY' => 'Guyana',
47
+ 'GF' => 'French Guiana',
48
+ 'GE' => 'Georgia',
49
+ 'GD' => 'Grenada',
50
+ 'GB' => 'United Kingdom',
51
+ 'GA' => 'Gabon',
52
+ 'SV' => 'El Salvador',
53
+ 'GN' => 'Guinea',
54
+ 'GM' => 'Gambia',
55
+ 'GL' => 'Greenland',
56
+ 'GI' => 'Gibraltar',
57
+ 'GH' => 'Ghana',
58
+ 'OM' => 'Oman',
59
+ 'TN' => 'Tunisia',
60
+ 'JO' => 'Jordan',
61
+ 'HT' => 'Haiti',
62
+ 'HU' => 'Hungary',
63
+ 'HK' => 'Hong Kong',
64
+ 'HN' => 'Honduras',
65
+ 'HM' => 'Heard and Mc Donald Islands',
66
+ 'VE' => 'Venezuela',
67
+ 'PR' => 'Puerto Rico',
68
+ 'PW' => 'Pala',
69
+ 'PT' => 'Portugal',
70
+ 'SJ' => 'Svalbard and Jan Mayen Islands',
71
+ 'PY' => 'Paraguay',
72
+ 'IQ' => 'Iraq',
73
+ 'PA' => 'Panama',
74
+ 'PF' => 'French Polynesia',
75
+ 'PG' => 'Papua New Guinea',
76
+ 'PE' => 'Per',
77
+ 'PK' => 'Pakistan',
78
+ 'PH' => 'Philippines',
79
+ 'PN' => 'Pitcairn',
80
+ 'PL' => 'Poland',
81
+ 'PM' => 'St. Pierre and Miquelon',
82
+ 'ZM' => 'Zambia',
83
+ 'EH' => 'Western Sahara',
84
+ 'EE' => 'Estonia',
85
+ 'EG' => 'Egypt',
86
+ 'ZA' => 'South Africa',
87
+ 'EC' => 'Ecuador',
88
+ 'IT' => 'Italy',
89
+ 'VN' => 'Viet Nam',
90
+ 'SB' => 'Solomon Islands',
91
+ 'ET' => 'Ethiopia',
92
+ 'SO' => 'Somalia',
93
+ 'ZW' => 'Zimbabwe',
94
+ 'SA' => 'Saudi Arabia',
95
+ 'ES' => 'Spain',
96
+ 'ER' => 'Eritrea',
97
+ 'MD' => 'Moldova, Republic of',
98
+ 'MG' => 'Madagascar',
99
+ 'MA' => 'Morocco',
100
+ 'MC' => 'Monaco',
101
+ 'UZ' => 'Uzbekistan',
102
+ 'MM' => 'Myanmar',
103
+ 'ML' => 'Mali',
104
+ 'MO' => 'Maca',
105
+ 'MN' => 'Mongolia',
106
+ 'MH' => 'Marshall Islands',
107
+ 'MK' => 'Macedonia, The Former Yugoslav Republic of',
108
+ 'MU' => 'Mauritius',
109
+ 'MT' => 'Malta',
110
+ 'MW' => 'Malawi',
111
+ 'MV' => 'Maldives',
112
+ 'MQ' => 'Martinique',
113
+ 'MP' => 'Northern Mariana Islands',
114
+ 'MS' => 'Montserrat',
115
+ 'MR' => 'Mauritania',
116
+ 'UG' => 'Uganda',
117
+ 'MY' => 'Malaysia',
118
+ 'MX' => 'Mexico',
119
+ 'IL' => 'Israel',
120
+ 'FR' => 'France',
121
+ 'IO' => 'British Indian Ocean Territory',
122
+ 'SH' => 'St. Helena',
123
+ 'FI' => 'Finland',
124
+ 'FJ' => 'Fiji',
125
+ 'FK' => 'Falkland Islands (Malvinas)',
126
+ 'FM' => 'Micronesia, Federated States of',
127
+ 'FO' => 'Faroe Islands',
128
+ 'NI' => 'Nicaragua',
129
+ 'NL' => 'Netherlands',
130
+ 'NO' => 'Norway',
131
+ 'NA' => 'Namibia',
132
+ 'VU' => 'Vanuat',
133
+ 'NC' => 'New Caledonia',
134
+ 'NE' => 'Niger',
135
+ 'NF' => 'Norfolk Island',
136
+ 'NG' => 'Nigeria',
137
+ 'NZ' => 'New Zealand',
138
+ 'ZR' => 'Zaire',
139
+ 'NP' => 'Nepal',
140
+ 'NR' => 'Naur',
141
+ 'NU' => 'Niue',
142
+ 'CK' => 'Cook Islands',
143
+ 'CI' => 'Cote d\'Ivoire',
144
+ 'CH' => 'Switzerland',
145
+ 'CO' => 'Colombia',
146
+ 'CN' => 'China',
147
+ 'CM' => 'Cameroon',
148
+ 'CL' => 'Chile',
149
+ 'CC' => 'Cocos (Keeling) Islands',
150
+ 'CA' => 'Canada',
151
+ 'CG' => 'Congo',
152
+ 'CF' => 'Central African Republic',
153
+ 'CZ' => 'Czech Republic',
154
+ 'CY' => 'Cyprus',
155
+ 'CX' => 'Christmas Island',
156
+ 'CR' => 'Costa Rica',
157
+ 'CV' => 'Cape Verde',
158
+ 'CU' => 'Cuba',
159
+ 'SZ' => 'Swaziland',
160
+ 'SY' => 'Syrian Arab Republic',
161
+ 'KG' => 'Kyrgyzstan',
162
+ 'KE' => 'Kenya',
163
+ 'SR' => 'Suriname',
164
+ 'KI' => 'Kiribati',
165
+ 'KH' => 'Cambodia',
166
+ 'KN' => 'Saint Kitts and Nevis',
167
+ 'KM' => 'Comoros',
168
+ 'ST' => 'Sao Tome and Principe',
169
+ 'SI' => 'Slovenia',
170
+ 'KW' => 'Kuwait',
171
+ 'SN' => 'Senegal',
172
+ 'SM' => 'San Marino',
173
+ 'SL' => 'Sierra Leone',
174
+ 'SC' => 'Seychelles',
175
+ 'KZ' => 'Kazakhstan',
176
+ 'KY' => 'Cayman Islands',
177
+ 'SG' => 'Singapore',
178
+ 'SE' => 'Sweden',
179
+ 'SD' => 'Sudan',
180
+ 'DO' => 'Dominican Republic',
181
+ 'DM' => 'Dominica',
182
+ 'DJ' => 'Djibouti',
183
+ 'DK' => 'Denmark',
184
+ 'VG' => 'Virgin Islands (British)',
185
+ 'DE' => 'Germany',
186
+ 'YE' => 'Yemen',
187
+ 'DZ' => 'Algeria',
188
+ 'US' => 'United States',
189
+ 'UY' => 'Uruguay',
190
+ 'YT' => 'Mayotte',
191
+ 'UM' => 'United States Minor Outlying Islands',
192
+ 'LB' => 'Lebanon',
193
+ 'LC' => 'Saint Lucia',
194
+ 'LA' => 'Lao People\'s Democratic Republic',
195
+ 'TV' => 'Tuval',
196
+ 'TW' => 'Taiwan',
197
+ 'TT' => 'Trinidad and Tobago',
198
+ 'TR' => 'Turkey',
199
+ 'LK' => 'Sri Lanka',
200
+ 'LI' => 'Liechtenstein',
201
+ 'LV' => 'Latvia',
202
+ 'TO' => 'Tonga',
203
+ 'LT' => 'Lithuania',
204
+ 'LU' => 'Luxembourg',
205
+ 'LR' => 'Liberia',
206
+ 'LS' => 'Lesotho',
207
+ 'TH' => 'Thailand',
208
+ 'TF' => 'French Southern Territories',
209
+ 'TG' => 'Togo',
210
+ 'TD' => 'Chad',
211
+ 'TC' => 'Turks and Caicos Islands',
212
+ 'LY' => 'Libyan Arab Jamahiriya',
213
+ 'VA' => 'Vatican City State (Holy See)',
214
+ 'VC' => 'Saint Vincent and The Grenadines',
215
+ 'AE' => 'United Arab Emirates',
216
+ 'AD' => 'Andorra',
217
+ 'AG' => 'Antigua and Barbuda',
218
+ 'AF' => 'Afghanistan',
219
+ 'AI' => 'Anguilla',
220
+ 'VI' => 'Virgin Islands (U.S.)',
221
+ 'IS' => 'Iceland',
222
+ 'IR' => 'Iran (Islamic Republic of)',
223
+ 'AM' => 'Armenia',
224
+ 'AL' => 'Albania',
225
+ 'AO' => 'Angola',
226
+ 'AN' => 'Netherlands Antilles',
227
+ 'AQ' => 'Antarctica',
228
+ 'AS' => 'American Samoa',
229
+ 'AR' => 'Argentina',
230
+ 'AU' => 'Australia',
231
+ 'AT' => 'Austria',
232
+ 'AW' => 'Aruba',
233
+ 'IN' => 'India',
234
+ 'TZ' => 'Tanzania, United Republic of',
235
+ 'AZ' => 'Azerbaijan',
236
+ 'IE' => 'Ireland',
237
+ 'ID' => 'Indonesia',
238
+ 'UA' => 'Ukraine',
239
+ 'QA' => 'Qatar',
240
+ 'MZ' => 'Mozambique',
241
+ 'BA' => 'Bosnia and Herzegovina',
242
+ 'CD' => 'Congo, The Democratic Republic of the',
243
+ 'CS' => 'Serbia and Montenegro',
244
+ 'HR' => 'Croatia',
245
+ 'KP' => 'Korea (North), Democratic People\'s Republic of',
246
+ 'KR' => 'Korea (South), Republic of',
247
+ 'SK' => 'Slovakia',
248
+ 'SU' => 'Soviet Union (historical, 1922-1991)',
249
+ 'TL' => 'East Timor',
250
+ 'XC' => 'Czechoslovakia (historical, 1918-1992)',
251
+ 'XE' => 'Europe',
252
+ 'XG' => 'East Germany (historical, 1949-1990)',
253
+ 'XU' => '[Unknown Country]',
254
+ 'XW' => '[Worldwide]',
255
+ 'YU' => 'Yugoslavia (historical, 1918-1992)',
256
+ }
257
+
258
+ end
259
+ end