diff --git a/data/audience_range.xml b/data/audience_range.xml
new file mode 100644
index 0000000..72e7c51
--- /dev/null
+++ b/data/audience_range.xml
@@ -0,0 +1,9 @@
+
+
+ 11
+ 03
+ 04
+ 3
+ 5
+
+
diff --git a/data/language.xml b/data/language.xml
new file mode 100644
index 0000000..fd483ac
--- /dev/null
+++ b/data/language.xml
@@ -0,0 +1,7 @@
+
+
+ 01
+ eng
+ US
+
+
diff --git a/data/series.xml b/data/series.xml
new file mode 100644
index 0000000..3fb59fa
--- /dev/null
+++ b/data/series.xml
@@ -0,0 +1,5 @@
+
+
+ Citizens and Their Governments
+
+
diff --git a/data/series_identifier.xml b/data/series_identifier.xml
new file mode 100644
index 0000000..0d7782f
--- /dev/null
+++ b/data/series_identifier.xml
@@ -0,0 +1,6 @@
+
+
+ 01
+ 10001
+
+
diff --git a/data/sl_product.xml b/data/sl_product.xml
new file mode 100644
index 0000000..c9bb7c0
--- /dev/null
+++ b/data/sl_product.xml
@@ -0,0 +1,81 @@
+
+
+
+ 10001
+ 02
+
+ 01
+ 10001
+
+
+ 02
+ 1602791082
+
+
+ 15
+ 9781602791084
+
+
+ 01
+ Citizens and Their Governments
+
+ 2008
+
+ 11
+ 03
+ 04
+ 3
+ 5
+
+
+ 01
+ eng
+
+
+ 12
+ http://www.cherrylakepublishing.com/shop/show/10001
+
+ 32
+
+ 01
+ This series focuses on teaching civic literacy from a global perspective. Why is voting important? How do elections differ around the world? What is the impact of immigration? How does the government work?
+
+
+ 04
+ 01
+ http://www.cherrylakepublishing.com/images/covers/l/9781602791084
+
+
+ 07
+ 01
+ http://www.cherrylakepublishing.com/images/covers/m/9781602791084
+
+
+ 01
+ Cherry Lake
+
+ 02
+ 20091201
+
+ 01
+ 9.5
+ in
+
+
+ 02
+ 7.5
+ in
+
+
+ Cherry Lake Publishing
+ 1-866-918-3956
+ 1-866-489-6490
+ sales@cherrylakepublishing.com
+ US
+ 10
+
+ 01
+ 232.65
+
+
+
diff --git a/lib/onix.rb b/lib/onix.rb
index 6f98a6c..2e0ef5a 100644
--- a/lib/onix.rb
+++ b/lib/onix.rb
@@ -70,6 +70,10 @@ def self.two_digit
# core files
# - ordering is important, classes need to be defined before any
# other class can use them
+require File.join(File.dirname(__FILE__), "onix", "language") # milkfarm
+require File.join(File.dirname(__FILE__), "onix", "series_identifier") # milkfarm
+require File.join(File.dirname(__FILE__), "onix", "series") # milkfarm
+require File.join(File.dirname(__FILE__), "onix", "audience_range") # milkfarm
require File.join(File.dirname(__FILE__), "onix", "sender_identifier")
require File.join(File.dirname(__FILE__), "onix", "addressee_identifier")
require File.join(File.dirname(__FILE__), "onix", "header")
@@ -95,10 +99,16 @@ def self.two_digit
# lists
require File.join(File.dirname(__FILE__), "onix", "lists", "product_form")
require File.join(File.dirname(__FILE__), "onix", "lists", "product_availability")
+require File.join(File.dirname(__FILE__), "onix", "lists", "country_code") # milkfarm
+require File.join(File.dirname(__FILE__), "onix", "lists", "language_code") # milkfarm
+require File.join(File.dirname(__FILE__), "onix", "lists", "language_role") # milkfarm
+require File.join(File.dirname(__FILE__), "onix", "lists", "notification_type") # milkfarm
+require File.join(File.dirname(__FILE__), "onix", "lists", "product_form_detail") # milkfarm
# product wrappers
require File.join(File.dirname(__FILE__), "onix", "simple_product")
require File.join(File.dirname(__FILE__), "onix", "apa_product")
+require File.join(File.dirname(__FILE__), "onix", "sl_product") # milkfarm
# misc
require File.join(File.dirname(__FILE__), "onix", "normaliser")
diff --git a/lib/onix/audience_range.rb b/lib/onix/audience_range.rb
new file mode 100644
index 0000000..5802b47
--- /dev/null
+++ b/lib/onix/audience_range.rb
@@ -0,0 +1,19 @@
+# coding: utf-8
+
+module ONIX
+ class AudienceRange
+ include ROXML
+ include ONIX::Common
+
+ xml_name "AudienceRange"
+
+ xml_accessor :audience_range_qualifier, :from => "AudienceRangeQualifier", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
+ xml_accessor :audience_range_precisions, :from => "AudienceRangePrecision", :as => [Fixnum], :to_xml => [ONIX::Formatters.two_digit] # TODO: two_digit isn't working on the array items
+ xml_accessor :audience_range_values, :from => "AudienceRangeValue", :as => [Integer]
+
+ def initialize
+ self.audience_range_precisions = []
+ self.audience_range_values = []
+ end
+ end
+end
diff --git a/lib/onix/language.rb b/lib/onix/language.rb
new file mode 100644
index 0000000..2d1ad56
--- /dev/null
+++ b/lib/onix/language.rb
@@ -0,0 +1,14 @@
+# coding: utf-8
+
+module ONIX
+ class Language
+ include ROXML
+ include ONIX::Common
+
+ xml_name "Language"
+
+ xml_accessor :language_role, :from => "LanguageRole", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
+ xml_accessor :language_code, :from => "LanguageCode"
+ xml_accessor :country_code, :from => "CountryCode"
+ end
+end
diff --git a/lib/onix/lists/country_code.rb b/lib/onix/lists/country_code.rb
new file mode 100644
index 0000000..84179b4
--- /dev/null
+++ b/lib/onix/lists/country_code.rb
@@ -0,0 +1,257 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ module Lists
+ # Code list 91
+ COUNTRY_CODE = {
+ "AD" => "Andorra",
+ "AE" => "United Arab Emirates",
+ "AF" => "Afghanistan",
+ "AG" => "Antigua and Barbuda",
+ "AI" => "Anguilla",
+ "AL" => "Albania",
+ "AM" => "Armenia",
+ "AN" => "Netherlands Antilles",
+ "AO" => "Angola",
+ "AQ" => "Antarctica",
+ "AR" => "Argentina",
+ "AS" => "American Samoa",
+ "AT" => "Austria",
+ "AU" => "Australia",
+ "AW" => "Aruba",
+ "AX" => "Aland Islands",
+ "AZ" => "Azerbaijan",
+ "BA" => "Bosnia and Herzegovina",
+ "BB" => "Barbados",
+ "BD" => "Bangladesh",
+ "BE" => "Belgium",
+ "BF" => "Burkina Faso",
+ "BG" => "Bulgaria",
+ "BH" => "Bahrain",
+ "BI" => "Burundi",
+ "BJ" => "Benin",
+ "BL" => "Saint Barthelemy",
+ "BM" => "Bermuda",
+ "BN" => "Brunei Darussalam",
+ "BO" => "Bolivia",
+ "BR" => "Brazil",
+ "BS" => "Bahamas",
+ "BT" => "Bhutan",
+ "BV" => "Bouvet Island",
+ "BW" => "Botswana",
+ "BY" => "Belarus",
+ "BZ" => "Belize",
+ "CA" => "Canada",
+ "CC" => "Cocos (Keeling) Islands",
+ "CD" => "Congo, Democratic Republic of the",
+ "CF" => "Central African Republic",
+ "CG" => "Congo",
+ "CH" => "Switzerland",
+ "CI" => "Cote D'Ivoire",
+ "CK" => "Cook Islands",
+ "CL" => "Chile",
+ "CM" => "Cameroon",
+ "CN" => "China",
+ "CO" => "Colombia",
+ "CR" => "Costa Rica",
+ "CS" => "Serbia and Montenegro",
+ "CU" => "Cuba",
+ "CV" => "Cape Verde",
+ "CX" => "Christmas Island",
+ "CY" => "Cyprus",
+ "CZ" => "Czech Republic",
+ "DE" => "Germany",
+ "DJ" => "Djibouti",
+ "DK" => "Denmark",
+ "DM" => "Dominica",
+ "DO" => "Dominican Republic",
+ "DZ" => "Algeria",
+ "EC" => "Ecuador",
+ "EE" => "Estonia",
+ "EG" => "Egypt",
+ "EH" => "Western Sahara",
+ "ER" => "Eritrea",
+ "ES" => "Spain",
+ "ET" => "Ethiopia",
+ "FI" => "Finland",
+ "FJ" => "Fiji",
+ "FK" => "Falkland Islands (Malvinas)",
+ "FM" => "Micronesia, Federated States of",
+ "FO" => "Faroe Islands",
+ "FR" => "France",
+ "GA" => "Gabon",
+ "GB" => "United Kingdom",
+ "GD" => "Grenada",
+ "GE" => "Georgia",
+ "GF" => "French Guiana",
+ "GG" => "Guernsey",
+ "GH" => "Ghana",
+ "GI" => "Gibraltar",
+ "GL" => "Greenland",
+ "GM" => "Gambia",
+ "GN" => "Guinea",
+ "GP" => "Guadeloupe",
+ "GQ" => "Equatorial Guinea",
+ "GR" => "Greece",
+ "GS" => "South Georgia and the South Sandwich Islands",
+ "GT" => "Guatemala",
+ "GU" => "Guam",
+ "GW" => "Guinea-Bissau",
+ "GY" => "Guyana",
+ "HK" => "Hong Kong",
+ "HM" => "Heard Island and McDonald Islands",
+ "HN" => "Honduras",
+ "HR" => "Croatia",
+ "HT" => "Haiti",
+ "HU" => "Hungary",
+ "ID" => "Indonesia",
+ "IE" => "Ireland",
+ "IL" => "Israel",
+ "IM" => "Isle of Man",
+ "IN" => "India",
+ "IO" => "British Indian Ocean Territory",
+ "IQ" => "Iraq",
+ "IR" => "Iran, Islamic Republic of",
+ "IS" => "Iceland",
+ "IT" => "Italy",
+ "JE" => "Jersey",
+ "JM" => "Jamaica",
+ "JO" => "Jordan",
+ "JP" => "Japan",
+ "KE" => "Kenya",
+ "KG" => "Kyrgyzstan",
+ "KH" => "Cambodia",
+ "KI" => "Kiribati",
+ "KM" => "Comoros",
+ "KN" => "Saint Kitts and Nevis",
+ "KP" => "Korea, Democratic People's Republic of",
+ "KR" => "Korea, Republic of",
+ "KW" => "Kuwait",
+ "KY" => "Cayman Islands",
+ "KZ" => "Kazakhstan",
+ "LA" => "Lao People's Democratic Republic",
+ "LB" => "Lebanon",
+ "LC" => "Saint Lucia",
+ "LI" => "Liechtenstein",
+ "LK" => "Sri Lanka",
+ "LR" => "Liberia",
+ "LS" => "Lesotho",
+ "LT" => "Lithuania",
+ "LU" => "Luxembourg",
+ "LV" => "Latvia",
+ "LY" => "Libyan Arab Jamahiriya",
+ "MA" => "Morocco",
+ "MC" => "Monaco",
+ "MD" => "Moldova, Republic of",
+ "ME" => "Montenegro",
+ "MF" => "Saint Martin, French part",
+ "MG" => "Madagascar",
+ "MH" => "Marshall Islands",
+ "MK" => "Macedonia, the former Yugoslav Republic of",
+ "ML" => "Mali",
+ "MM" => "Myanmar",
+ "MN" => "Mongolia",
+ "MO" => "Macao",
+ "MP" => "Northern Mariana Islands",
+ "MQ" => "Martinique",
+ "MR" => "Mauritania",
+ "MS" => "Montserrat",
+ "MT" => "Malta",
+ "MU" => "Mauritius",
+ "MV" => "Maldives",
+ "MW" => "Malawi",
+ "MX" => "Mexico",
+ "MY" => "Malaysia",
+ "MZ" => "Mozambique",
+ "NA" => "Namibia",
+ "NC" => "New Caledonia",
+ "NE" => "Niger",
+ "NF" => "Norfolk Island",
+ "NG" => "Nigeria",
+ "NI" => "Nicaragua",
+ "NL" => "Netherlands",
+ "NO" => "Norway",
+ "NP" => "Nepal",
+ "NR" => "Nauru",
+ "NU" => "Niue",
+ "NZ" => "New Zealand",
+ "OM" => "Oman",
+ "PA" => "Panama",
+ "PE" => "Peru",
+ "PF" => "French Polynesia",
+ "PG" => "Papua New Guinea",
+ "PH" => "Philippines",
+ "PK" => "Pakistan",
+ "PL" => "Poland",
+ "PM" => "Saint Pierre and Miquelon",
+ "PN" => "Pitcairn",
+ "PR" => "Puerto Rico",
+ "PS" => "Palestinian Territory, Occupied",
+ "PT" => "Portugal",
+ "PW" => "Palau",
+ "PY" => "Paraguay",
+ "QA" => "Qatar",
+ "RE" => "Reunion",
+ "RO" => "Romania",
+ "RS" => "Serbia",
+ "RU" => "Russian Federation",
+ "RW" => "Rwanda",
+ "SA" => "Saudi Arabia",
+ "SB" => "Solomon Islands",
+ "SC" => "Seychelles",
+ "SD" => "Sudan",
+ "SE" => "Sweden",
+ "SG" => "Singapore",
+ "SH" => "Saint Helena",
+ "SI" => "Slovenia",
+ "SJ" => "Svalbard and Jan Mayen",
+ "SK" => "Slovakia",
+ "SL" => "Sierra Leone",
+ "SM" => "San Marino",
+ "SN" => "Senegal",
+ "SO" => "Somalia",
+ "SR" => "Suriname",
+ "ST" => "Sao Tome and Principe",
+ "SV" => "El Salvador",
+ "SY" => "Syrian Arab Republic",
+ "SZ" => "Swaziland",
+ "TC" => "Turks and Caicos Islands",
+ "TD" => "Chad",
+ "TF" => "French Southern Territories",
+ "TG" => "Togo",
+ "TH" => "Thailand",
+ "TJ" => "Tajikistan",
+ "TK" => "Tokelau",
+ "TL" => "Timor-Leste",
+ "TM" => "Turkmenistan",
+ "TN" => "Tunisia",
+ "TO" => "Tonga",
+ "TR" => "Turkey",
+ "TT" => "Trinidad and Tobago",
+ "TV" => "Tuvalu",
+ "TW" => "Taiwan, Province of China",
+ "TZ" => "Tanzania, United Republic of",
+ "UA" => "Ukraine",
+ "UG" => "Uganda",
+ "UM" => "United States Minor Outlying Islands",
+ "US" => "United States",
+ "UY" => "Uruguay",
+ "UZ" => "Uzbekistan",
+ "VA" => "Holy See (Vatican City State)",
+ "VC" => "Saint Vincent and the Grenadines",
+ "VE" => "Venezuela, Bolivarian Republic of",
+ "VG" => "Virgin Islands, British",
+ "VI" => "Virgin Islands, US",
+ "VN" => "Viet Nam",
+ "VU" => "Vanuatu",
+ "WF" => "Wallis and Futuna",
+ "WS" => "Samoa",
+ "YE" => "Yemen",
+ "YT" => "Mayotte",
+ "YU" => "Yugoslavia",
+ "ZA" => "South Africa",
+ "ZM" => "Zambia",
+ "ZW" => "Zimbabwe",
+ }
+ end
+end
diff --git a/lib/onix/lists/language_code.rb b/lib/onix/lists/language_code.rb
new file mode 100644
index 0000000..5164cd5
--- /dev/null
+++ b/lib/onix/lists/language_code.rb
@@ -0,0 +1,498 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ module Lists
+ # Code list 74
+ LANGUAGE_CODE = {
+ "aar" => "Afar",
+ "abk" => "Abkhaz",
+ "ace" => "Achinese",
+ "ach" => "Acoli",
+ "ada" => "Adangme",
+ "ady" => "Adygei",
+ "afa" => "Afroasiatic languages",
+ "afh" => "Afrihili (Artificial language)",
+ "afr" => "Afrikaans",
+ "ain" => "Ainu",
+ "aka" => "Akan",
+ "akk" => "Akkadian",
+ "alb" => "Albanian",
+ "ale" => "Aleut",
+ "alg" => "Algonquian languages",
+ "alt" => "Southern Altai",
+ "amh" => "Amharic",
+ "ang" => "English, Old (ca. 450-1100)",
+ "anp" => "Angika",
+ "apa" => "Apache languages",
+ "ara" => "Arabic",
+ "arc" => "Official Aramaic; Imperial Aramaic (700-300 BCE)",
+ "arg" => "Aragonese Spanish",
+ "arm" => "Armenian",
+ "arn" => "Mapudungun; Mapuche",
+ "arp" => "Arapaho",
+ "art" => "Artificial languages",
+ "arw" => "Arawak",
+ "asm" => "Assamese",
+ "ast" => "Asturian; Bable; Leonese; Asturleonese",
+ "ath" => "Athapascan languages",
+ "aus" => "Australian languages",
+ "ava" => "Avaric",
+ "ave" => "Avestan",
+ "awa" => "Awadhi",
+ "aym" => "Aymara",
+ "aze" => "Azerbaijani",
+ "bad" => "Banda languages",
+ "bai" => "Bamileke languages",
+ "bak" => "Bashkir",
+ "bal" => "Baluchi",
+ "bam" => "Bambara",
+ "ban" => "Balinese",
+ "baq" => "Basque",
+ "bas" => "Basa",
+ "bat" => "Baltic languages",
+ "bej" => "Beja; Bedawiyet",
+ "bel" => "Belarusian",
+ "bem" => "Bemba",
+ "ben" => "Bengali",
+ "ber" => "Berber languages",
+ "bho" => "Bhojpuri",
+ "bih" => "Bihari",
+ "bik" => "Bikol",
+ "bin" => "Bini; Edo",
+ "bis" => "Bislama",
+ "bla" => "Siksika",
+ "bnt" => "Bantu languages",
+ "bos" => "Bosnian",
+ "bra" => "Braj",
+ "bre" => "Breton",
+ "btk" => "Batak languages",
+ "bua" => "Buriat",
+ "bug" => "Bugis",
+ "bul" => "Bulgarian",
+ "bur" => "Burmese",
+ "byn" => "Blin; Bilin",
+ "cad" => "Caddo",
+ "cai" => "Central American Indian languages",
+ "car" => "Galibi Carib",
+ "cat" => "Catalan",
+ "cau" => "Caucasian languages",
+ "ceb" => "Cebuano",
+ "cel" => "Celtic languages",
+ "cha" => "Chamorro",
+ "chb" => "Chibcha",
+ "che" => "Chechen",
+ "chg" => "Chagatai",
+ "chi" => "Chinese",
+ "chk" => "Truk",
+ "chm" => "Mari",
+ "chn" => "Chinook jargon",
+ "cho" => "Choctaw",
+ "chp" => "Chipewyan; Dene Suline",
+ "chr" => "Cherokee",
+ "chu" => "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic",
+ "chv" => "Chuvash",
+ "chy" => "Cheyenne",
+ "cmc" => "Chamic languages",
+ "cop" => "Coptic",
+ "cor" => "Cornish",
+ "cos" => "Corsican",
+ "cpe" => "Creoles and pidgins, English-based",
+ "cpf" => "Creoles and pidgins, French-based",
+ "cpp" => "Creoles and pidgins, Portuguese-based",
+ "cre" => "Cree",
+ "crh" => "Crimean Turkish; Crimean Tatar",
+ "crp" => "Creoles and pidgins",
+ "csb" => "Kashubian",
+ "cus" => "Cushitic languages",
+ "cze" => "Czech",
+ "dak" => "Dakota",
+ "dan" => "Danish",
+ "dar" => "Dargwa",
+ "day" => "Land Dayak languages",
+ "del" => "Delaware",
+ "den" => "Slave",
+ "dgr" => "Dogrib",
+ "din" => "Dinka",
+ "div" => "Divehi; Dhivehi; Maldivian",
+ "doi" => "Dogri",
+ "dra" => "Dravidian languages",
+ "dsb" => "Lower Sorbian",
+ "dua" => "Duala",
+ "dum" => "Dutch, Middle (ca. 1050-1350)",
+ "dut" => "Dutch; Flemish",
+ "dyu" => "Dyula",
+ "dzo" => "Dzongkha",
+ "efi" => "Efik",
+ "egy" => "Egyptian",
+ "eka" => "Ekajuk",
+ "elx" => "Elamite",
+ "eng" => "English",
+ "enm" => "English, Middle (1100-1500)",
+ "epo" => "Esperanto",
+ "est" => "Estonian",
+ "ewe" => "Ewe",
+ "ewo" => "Ewondo",
+ "fan" => "Fang",
+ "fao" => "Faroese",
+ "fat" => "Fanti",
+ "fij" => "Fijian",
+ "fil" => "Filipino; Pilipino",
+ "fin" => "Finnish",
+ "fiu" => "Finno-Ugrian languages",
+ "fon" => "Fon",
+ "fre" => "French",
+ "frm" => "French, Middle (ca. 1400-1600)",
+ "fro" => "French, Old (ca. 842-1400)",
+ "frr" => "Northern Frisian",
+ "frs" => "Eastern Frisian",
+ "fry" => "Western Frisian",
+ "ful" => "Fula",
+ "fur" => "Friulian",
+ "gaa" => "Gã",
+ "gay" => "Gayo",
+ "gba" => "Gbaya",
+ "gem" => "Germanic languages",
+ "geo" => "Georgian",
+ "ger" => "German",
+ "gez" => "Ethiopic",
+ "gil" => "Gilbertese",
+ "gla" => "Scottish Gaelic",
+ "gle" => "Irish",
+ "glg" => "Galician",
+ "glv" => "Manx",
+ "gmh" => "German, Middle High (ca. 1050-1500)",
+ "goh" => "German, Old High (ca. 750-1050)",
+ "gon" => "Gondi",
+ "gor" => "Gorontalo",
+ "got" => "Gothic",
+ "grb" => "Grebo",
+ "grc" => "Greek, Ancient (to 1453)",
+ "gre" => "Greek, Modern (1453-)",
+ "grn" => "Guarani",
+ "gsw" => "Swiss German; Alemannic",
+ "guj" => "Gujarati",
+ "gwi" => "Gwich'in",
+ "hai" => "Haida",
+ "hat" => "Haitian French Creole",
+ "hau" => "Hausa",
+ "haw" => "Hawaiian",
+ "heb" => "Hebrew",
+ "her" => "Herero",
+ "hil" => "Hiligaynon",
+ "him" => "Himachali",
+ "hin" => "Hindi",
+ "hit" => "Hittite",
+ "hmn" => "Hmong",
+ "hmo" => "Hiri Motu",
+ "hrv" => "Croatian",
+ "hsb" => "Upper Sorbian",
+ "hun" => "Hungarian",
+ "hup" => "Hupa",
+ "iba" => "Iban",
+ "ibo" => "Igbo",
+ "ice" => "Icelandic",
+ "ido" => "Ido",
+ "iii" => "Sichuan Yi; Nuosu",
+ "ijo" => "Ijo languages",
+ "iku" => "Inuktitut",
+ "ile" => "Interlingue; Occidental",
+ "ilo" => "Iloko",
+ "ina" => "Interlingua (International Auxiliary Language Association)",
+ "inc" => "Indic languages",
+ "ind" => "Indonesian",
+ "ine" => "Indo-European languages",
+ "inh" => "Ingush",
+ "ipk" => "Inupiaq",
+ "ira" => "Iranian languages",
+ "iro" => "Iroquoian languages",
+ "ita" => "Italian",
+ "jav" => "Javanese",
+ "jbo" => "Lojban",
+ "jpn" => "Japanese",
+ "jpr" => "Judeo-Persian",
+ "jrb" => "Judeo-Arabic",
+ "kaa" => "Kara-Kalpak",
+ "kab" => "Kabyle",
+ "kac" => "Kachin; Jingpho",
+ "kal" => "Kalâtdlisut",
+ "kam" => "Kamba",
+ "kan" => "Kannada",
+ "kar" => "Karen languages",
+ "kas" => "Kashmiri",
+ "kau" => "Kanuri",
+ "kaw" => "Kawi",
+ "kaz" => "Kazakh",
+ "kbd" => "Kabardian",
+ "kha" => "Khasi",
+ "khi" => "Khoisan languages",
+ "khm" => "Central Khmer",
+ "kho" => "Khotanese; Sakan",
+ "kik" => "Kikuyu; Gikuyu",
+ "kin" => "Kinyarwanda",
+ "kir" => "Kirghiz; Kyrgyz",
+ "kmb" => "Kimbundu",
+ "kok" => "Konkani",
+ "kom" => "Komi",
+ "kon" => "Kongo",
+ "kor" => "Korean",
+ "kos" => "Kusaie",
+ "kpe" => "Kpelle",
+ "krc" => "Karachay-Balkar",
+ "krl" => "Karelian",
+ "kro" => "Kru languages",
+ "kru" => "Kurukh",
+ "kua" => "Kuanyama",
+ "kum" => "Kumyk",
+ "kur" => "Kurdish",
+ "kut" => "Kutenai",
+ "lad" => "Ladino",
+ "lah" => "Lahnda",
+ "lam" => "Lamba",
+ "lao" => "Lao",
+ "lat" => "Latin",
+ "lav" => "Latvian",
+ "lez" => "Lezgian",
+ "lim" => "Limburgish",
+ "lin" => "Lingala",
+ "lit" => "Lithuanian",
+ "lol" => "Mongo-Nkundu",
+ "loz" => "Lozi",
+ "ltz" => "Luxembourgish; Letzeburgesch",
+ "lua" => "Luba-Lulua",
+ "lub" => "Luba-Katanga",
+ "lug" => "Ganda",
+ "lui" => "Luiseño",
+ "lun" => "Lunda",
+ "luo" => "Luo (Kenya and Tanzania)",
+ "lus" => "Lushai",
+ "mac" => "Macedonian",
+ "mad" => "Madurese",
+ "mag" => "Magahi",
+ "mah" => "Marshall",
+ "mai" => "Maithili",
+ "mak" => "Makasar",
+ "mal" => "Malayalam",
+ "man" => "Mandingo",
+ "mao" => "Maori",
+ "map" => "Austronesian languages",
+ "mar" => "Marathi",
+ "mas" => "Masai",
+ "may" => "Malay",
+ "mdf" => "Moksha",
+ "mdr" => "Mandar",
+ "men" => "Mende",
+ "mga" => "Irish, Middle (ca. 1100-1550)",
+ "mic" => "Mi'kmaq; Micmac",
+ "min" => "Minangkabau",
+ "mis" => "Uncoded languages",
+ "mkh" => "Mon-Khmer languages",
+ "mlg" => "Malagasy",
+ "mlt" => "Maltese",
+ "mnc" => "Manchu",
+ "mni" => "Manipuri",
+ "mno" => "Manobo languages",
+ "moh" => "Mohawk",
+ "mol" => "Moldavian; Moldovan",
+ "mon" => "Mongolian",
+ "mos" => "Mooré",
+ "mul" => "Multiple languages",
+ "mun" => "Munda languages",
+ "mus" => "Creek",
+ "mwl" => "Mirandese",
+ "mwr" => "Marwari",
+ "myn" => "Mayan languages",
+ "myv" => "Erzya",
+ "nah" => "Nahuatl languages",
+ "nai" => "North American Indian languages",
+ "nap" => "Neapolitan",
+ "nau" => "Nauru",
+ "nav" => "Navajo",
+ "nbl" => "Ndebele, South",
+ "nde" => "Ndebele, North",
+ "ndo" => "Ndonga",
+ "nds" => "Low German; Low Saxon",
+ "nep" => "Nepali",
+ "new" => "Newari",
+ "nia" => "Nias",
+ "nic" => "Niger-Kordofanian languages",
+ "niu" => "Niuean",
+ "nno" => "Norwegian Nynorsk",
+ "nob" => "Norwegian Bokmål",
+ "nog" => "Nogai",
+ "non" => "Old Norse",
+ "nor" => "Norwegian",
+ "nqo" => "N'Ko",
+ "nso" => "Pedi; Sepedi; Northern Sotho",
+ "nub" => "Nubian languages",
+ "nwc" => "Classical Newari; Old Newari; Classical Nepal Bhasa",
+ "nya" => "Chichewa; Chewa; Nyanja",
+ "nym" => "Nyamwezi",
+ "nyn" => "Nyankole",
+ "nyo" => "Nyoro",
+ "nzi" => "Nzima",
+ "oci" => "Occitan (post 1500)",
+ "oji" => "Ojibwa",
+ "ori" => "Oriya",
+ "orm" => "Oromo",
+ "osa" => "Osage",
+ "oss" => "Ossetian; Ossetic",
+ "ota" => "Turkish, Ottoman",
+ "oto" => "Otomian languages",
+ "paa" => "Papuan languages",
+ "pag" => "Pangasinan",
+ "pal" => "Pahlavi",
+ "pam" => "Pampanga; Kapampangan",
+ "pan" => "Panjabi",
+ "pap" => "Papiamento",
+ "pau" => "Palauan",
+ "peo" => "Old Persian (ca. 600-400 B.C.)",
+ "per" => "Persian",
+ "phi" => "Philippine languages",
+ "phn" => "Phoenician",
+ "pli" => "Pali",
+ "pol" => "Polish",
+ "pon" => "Ponape",
+ "por" => "Portuguese",
+ "pra" => "Prakrit languages",
+ "pro" => "Provençal (to 1500);Occitan, Old (to 1500)",
+ "pus" => "Pushto; Pashto",
+ "qar" => "Aranés",
+ "qav" => "Valencian",
+ "que" => "Quechua",
+ "raj" => "Rajasthani",
+ "rap" => "Rapanui",
+ "rar" => "Rarotongan; Cook Islands Maori",
+ "roa" => "Romance languages",
+ "roh" => "Romansh",
+ "rom" => "Romany",
+ "rum" => "Romanian",
+ "run" => "Rundi",
+ "rup" => "Aromanian; Arumanian; Macedo-Romanian",
+ "rus" => "Russian",
+ "sad" => "Sandawe",
+ "sag" => "Sango",
+ "sah" => "Yakut",
+ "sai" => "South American Indian languages",
+ "sal" => "Salishan languages",
+ "sam" => "Samaritan Aramaic",
+ "san" => "Sanskrit",
+ "sas" => "Sasak",
+ "sat" => "Santali",
+ "scc" => "Serbian",
+ "scn" => "Sicilian",
+ "sco" => "Scots",
+ "scr" => "Croatian",
+ "sel" => "Selkup",
+ "sem" => "Semitic languages",
+ "sga" => "Irish, Old (to 1100)",
+ "sgn" => "Sign languages",
+ "shn" => "Shan",
+ "sid" => "Sidamo",
+ "sin" => "Sinhala; Sinhalese",
+ "sio" => "Siouan languages",
+ "sit" => "Sino-Tibetan languages",
+ "sla" => "Slavic languages",
+ "slo" => "Slovak",
+ "slv" => "Slovenian",
+ "sma" => "Southern Sami",
+ "sme" => "Northern Sami",
+ "smi" => "Sami languages",
+ "smj" => "Lule Sami",
+ "smn" => "Inari Sami",
+ "smo" => "Samoan",
+ "sms" => "Skolt Sami",
+ "sna" => "Shona",
+ "snd" => "Sindhi",
+ "snk" => "Soninke",
+ "sog" => "Sogdian",
+ "som" => "Somali",
+ "son" => "Songhai languages",
+ "sot" => "Sotho",
+ "spa" => "Spanish",
+ "srd" => "Sardinian",
+ "srn" => "Sranan Tongo",
+ "srp" => "Serbian",
+ "srr" => "Serer",
+ "ssa" => "Nilo-Saharan languages",
+ "ssw" => "Swazi",
+ "suk" => "Sukuma",
+ "sun" => "Sundanese",
+ "sus" => "Susu",
+ "sux" => "Sumerian",
+ "swa" => "Swahili",
+ "swe" => "Swedish",
+ "syc" => "Classical Syriac",
+ "syr" => "Syriac",
+ "tah" => "Tahitian",
+ "tai" => "Tai languages",
+ "tam" => "Tamil",
+ "tat" => "Tatar",
+ "tel" => "Telugu",
+ "tem" => "Temne",
+ "ter" => "Terena",
+ "tet" => "Tetum",
+ "tgk" => "Tajik",
+ "tgl" => "Tagalog",
+ "tha" => "Thai",
+ "tib" => "Tibetan",
+ "tig" => "Tigré",
+ "tir" => "Tigrinya",
+ "tiv" => "Tiv",
+ "tkl" => "Tokelauan",
+ "tlh" => "Klingon; tlhIngan-Hol",
+ "tli" => "Tlingit",
+ "tmh" => "Tamashek",
+ "tog" => "Tonga (Nyasa)",
+ "ton" => "Tongan",
+ "tpi" => "Tok Pisin",
+ "tsi" => "Tsimshian",
+ "tsn" => "Tswana",
+ "tso" => "Tsonga",
+ "tuk" => "Turkmen",
+ "tum" => "Tumbuka",
+ "tup" => "Tupi languages",
+ "tur" => "Turkish",
+ "tut" => "Altaic languages",
+ "tvl" => "Tuvaluan",
+ "twi" => "Twi",
+ "tyv" => "Tuvinian",
+ "udm" => "Udmurt",
+ "uga" => "Ugaritic",
+ "uig" => "Uighur; Uyghur",
+ "ukr" => "Ukrainian",
+ "umb" => "Umbundu",
+ "und" => "Undetermined",
+ "urd" => "Urdu",
+ "uzb" => "Uzbek",
+ "vai" => "Vai",
+ "ven" => "Venda",
+ "vie" => "Vietnamese",
+ "vol" => "Volapük",
+ "vot" => "Votic",
+ "wak" => "Wakashan languages",
+ "wal" => "Wolaitta; Wolaytta",
+ "war" => "Waray",
+ "was" => "Washo",
+ "wel" => "Welsh",
+ "wen" => "Sorbian languages",
+ "wln" => "Walloon",
+ "wol" => "Wolof",
+ "xal" => "Kalmyk",
+ "xho" => "Xhosa",
+ "yao" => "Yao",
+ "yap" => "Yapese",
+ "yid" => "Yiddish",
+ "yor" => "Yoruba",
+ "ypk" => "Yupik languages",
+ "zap" => "Zapotec",
+ "zbl" => "Blissymbols; Blissymbolics; Bliss",
+ "zen" => "Zenaga",
+ "zha" => "Zhuang; Chuang",
+ "znd" => "Zande languages",
+ "zul" => "Zulu",
+ "zun" => "Zuni",
+ "zxx" => "No linguistic content",
+ "zza" => "Zaza; Dimili; Dimli; Kirdki; Kirmanjki; Zazaki",
+ }
+ end
+end
diff --git a/lib/onix/lists/language_role.rb b/lib/onix/lists/language_role.rb
new file mode 100644
index 0000000..745b121
--- /dev/null
+++ b/lib/onix/lists/language_role.rb
@@ -0,0 +1,18 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ module Lists
+ # Code list 22
+ LANGUAGE_ROLE = {
+ "01" => "Language of text",
+ "02" => "Original language of a translated text",
+ "03" => "Language of abstracts",
+ "04" => "Rights language",
+ "05" => "Rights-excluded language",
+ "06" => "Original language in a multilingual edition",
+ "07" => "Translated language in a multilingual edition",
+ "08" => "Language of audio track",
+ "09" => "Language of subtitles",
+ }
+ end
+end
diff --git a/lib/onix/lists/notification_type.rb b/lib/onix/lists/notification_type.rb
new file mode 100644
index 0000000..3912526
--- /dev/null
+++ b/lib/onix/lists/notification_type.rb
@@ -0,0 +1,19 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ module Lists
+ # Code list 1
+ NOTIFICATION_TYPE = {
+ 1 => "Early notification",
+ 2 => "Advance notification (confirmed)",
+ 3 => "Notification confirmed from book-in-hand",
+ 4 => "Update (partial)",
+ 5 => "Delete",
+ 8 => "Notice of sale",
+ 9 => "Notice of acquisition",
+ 12 => "Update - SupplyDetail only",
+ 13 => "Update - MarketRepresentation only",
+ 14 => "Update - SupplyDetail and MarketRepresentation",
+ }
+ end
+end
diff --git a/lib/onix/lists/product_form_detail.rb b/lib/onix/lists/product_form_detail.rb
new file mode 100644
index 0000000..3277cab
--- /dev/null
+++ b/lib/onix/lists/product_form_detail.rb
@@ -0,0 +1,157 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ module Lists
+ # Code list 78
+ PRODUCT_FORM_DETAIL = {
+ "A101" => "CD standard audio format",
+ "A102" => "SACD super audio format",
+ "A103" => "MP3 format",
+ "A104" => "WAV format",
+ "A105" => "Real Audio format",
+ "A106" => "WMA",
+ "A107" => "AAC",
+ "A108" => "Ogg/Vorbis",
+ "A109" => "Audible",
+ "A110" => "FLAC",
+ "A111" => "AIFF",
+ "A112" => "ALAC",
+ "A201" => "DAISY 2: full audio with title only (no navigation)",
+ "A202" => "DAISY 2: full audio with navigation",
+ "A203" => "DAISY 2: full audio with navigation and partial text",
+ "A204" => "DAISY 2: full audio and full text",
+ "A205" => "DAISY 2: full text and some audio",
+ "A206" => "DAISY 2: full text and no audio",
+ "A207" => "DAISY 3: full audio with title only (no navigation)",
+ "A208" => "DAISY 3: full audio with navigation",
+ "A209" => "DAISY 3: full audio with navigation and partial text",
+ "A210" => "DAISY 3: full audio and full text",
+ "A211" => "DAISY 3: full text and some audio",
+ "A212" => "DAISY 3: full text and no audio",
+ "B101" => "Mass market (rack) paperback",
+ "B102" => "Trade paperback (US)",
+ "B103" => "Digest format paperback",
+ "B104" => "A-format paperback",
+ "B105" => "B-format paperback",
+ "B106" => "Trade paperback (UK)",
+ "B107" => "Tall rack paperback (US)",
+ "B108" => "A5: Tankobon",
+ "B109" => "B5: Tankobon",
+ "B110" => "B6: Tankobon",
+ "B111" => "A6: Bunko",
+ "B112" => "B40-dori: Shinsho",
+ "B113" => "Pocket (Sweden)",
+ "B114" => "Storpocket (Sweden)",
+ "B115" => "Kartonnage (Sweden)",
+ "B116" => "Flexband (Sweden)",
+ "B201" => "Coloring / join-the-dot book",
+ "B202" => "Lift-the-flap book",
+ "B203" => "Fuzzy book",
+ "B204" => "Miniature book",
+ "B205" => "Moving picture / flicker book",
+ "B206" => "Pop-up book",
+ "B207" => "Scented / 'smelly' book",
+ "B208" => "Sound story / 'noisy' book",
+ "B209" => "Sticker book",
+ "B210" => "Touch-and-feel book",
+ "B211" => "Toy / die-cut book",
+ "B212" => "Die-cut book",
+ "B213" => "Book-as-toy",
+ "B214" => "Soft-to-touch book",
+ "B215" => "Fuzzy-felt book",
+ "B221" => "Picture book",
+ "B301" => "Loose leaf - sheets & binder",
+ "B302" => "Loose leaf - binder only",
+ "B303" => "Loose leaf - sheets only",
+ "B304" => "Sewn",
+ "B305" => "Unsewn / adhesive bound",
+ "B306" => "Library binding",
+ "B307" => "Reinforced binding",
+ "B308" => "Half bound",
+ "B309" => "Quarter bound",
+ "B310" => "Saddle-sewn",
+ "B311" => "Comb bound",
+ "B312" => "Wire-O",
+ "B313" => "Concealed wire",
+ "B401" => "Cloth over boards",
+ "B402" => "Paper over boards",
+ "B403" => "Leather, real",
+ "B404" => "Leather, imitation",
+ "B405" => "Leather, bonded",
+ "B406" => "Vellum",
+ "B407" => "Plastic",
+ "B408" => "Vinyl",
+ "B409" => "Cloth",
+ "B410" => "Imitation cloth",
+ "B411" => "Velvet",
+ "B412" => "Flexible plastic/vinyl cover",
+ "B413" => "Plastic-covered",
+ "B414" => "Vinyl-covered",
+ "B415" => "Laminated cover",
+ "B501" => "With dust jacket",
+ "B502" => "With printed dust jacket",
+ "B503" => "With translucent dust cover",
+ "B504" => "With flaps",
+ "B505" => "With thumb index",
+ "B506" => "With ribbon marker(s)",
+ "B507" => "With zip fastener",
+ "B508" => "With button snap fastener",
+ "B509" => "With leather edge lining",
+ "B601" => "Turn-around book",
+ "B602" => "Unflipped manga format",
+ "B701" => "UK Braille Grade 1",
+ "B702" => "UK Braille Grade 2",
+ "B703" => "US Braille",
+ "D101" => "Real Video format",
+ "D102" => "Quicktime format",
+ "D103" => "AVI format",
+ "D104" => "Windows Media Video format",
+ "D105" => "MPEG-4",
+ "D201" => "MS-DOS",
+ "D202" => "Windows",
+ "D203" => "Macintosh",
+ "D204" => "UNIX / LINUX",
+ "D205" => "Other operating system(s)",
+ "D206" => "Palm OS",
+ "D207" => "Windows Mobile",
+ "D301" => "Microsoft XBox",
+ "D302" => "Nintendo Gameboy Color",
+ "D303" => "Nintendo Gameboy Advanced",
+ "D304" => "Nintendo Gameboy",
+ "D305" => "Nintendo Gamecube",
+ "D306" => "Nintendo 64",
+ "D307" => "Sega Dreamcast",
+ "D308" => "Sega Genesis/Megadrive",
+ "D309" => "Sega Saturn",
+ "D310" => "Sony PlayStation 1",
+ "D311" => "Sony PlayStation 2",
+ "D312" => "Nintendo Dual Screen",
+ "D313" => "Sony PlayStation 3",
+ "D314" => "Xbox 360",
+ "D315" => "Nintendo Wii",
+ "D316" => "Sony PlayStation Portable (PSP)",
+ "L101" => "Laminated",
+ "P101" => "Desk calendar",
+ "P102" => "Mini calendar",
+ "P103" => "Engagement calendar",
+ "P104" => "Day by day calendar",
+ "P105" => "Poster calendar",
+ "P106" => "Wall calendar",
+ "P107" => "Perpetual calendar",
+ "P108" => "Advent calendar",
+ "P109" => "Bookmark calendar",
+ "P110" => "Student calendar",
+ "P111" => "Project calendar",
+ "P112" => "Almanac calendar",
+ "P113" => "Other calendar",
+ "P114" => "Other calendar or organiser product",
+ "P201" => "Hardback (stationery)",
+ "P202" => "Paperback / softback (stationery)",
+ "P203" => "Spiral bound (stationery)",
+ "P204" => "Leather / fine binding (stationery)",
+ "V201" => "PAL",
+ "V202" => "NTSC",
+ "V203" => "SECAM",
+ }
+ end
+end
diff --git a/lib/onix/product.rb b/lib/onix/product.rb
index 861189a..6a43d7c 100644
--- a/lib/onix/product.rb
+++ b/lib/onix/product.rb
@@ -10,10 +10,15 @@ class Product
xml_accessor :record_reference, :from => "RecordReference"
xml_accessor :notification_type, :from => "NotificationType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
xml_accessor :product_identifiers, :from => "ProductIdentifier", :as => [ONIX::ProductIdentifier]
+ xml_accessor :titles, :from => "Title", :as => [ONIX::Title]
+ xml_accessor :series_identifiers, :from => "SeriesIdentifier", :as => [ONIX::SeriesIdentifier] # milkfarm
+ xml_accessor :series, :from => "Series", :as => [ONIX::Series] # milkfarm
xml_accessor :product_form, :from => "ProductForm"
- xml_accessor :series, :from => "Series"
+ xml_accessor :product_form_detail, :from => "ProductFormDetail" # milkfarm
+ xml_accessor :copyright_year, :from => "CopyrightYear", :as => Integer # milkfarm
xml_accessor :edition_number, :from => "EditionNumber", :as => Fixnum
- xml_accessor :titles, :from => "Title", :as => [ONIX::Title]
+ xml_accessor :audience_ranges, :from => "AudienceRange", :as => [ONIX::AudienceRange] # milkfarm
+ xml_accessor :languages, :from => "Language", :as => [ONIX::Language] # milkfarm
xml_accessor :websites, :from => "Website", :as => [ONIX::Website]
xml_accessor :contributors, :from => "Contributor", :as => [ONIX::Contributor]
xml_accessor :number_of_pages, :from => "NumberOfPages", :as => Fixnum
@@ -47,7 +52,11 @@ class Product
xml_reader :dimensions, :from => "Dimensions"
def initialize
+ self.series = [] # milkfarm
+ self.audience_ranges = [] # milkfarm
+ self.languages = [] # milkfarm
self.product_identifiers = []
+ self.series_identifiers = [] # milkfarm
self.titles = []
self.contributors = []
self.websites = []
diff --git a/lib/onix/series.rb b/lib/onix/series.rb
new file mode 100644
index 0000000..cfe993d
--- /dev/null
+++ b/lib/onix/series.rb
@@ -0,0 +1,12 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ class Series
+ include ROXML
+ include ONIX::Common
+
+ xml_name "Series"
+
+ xml_accessor :title_of_series, :from => "TitleOfSeries"
+ end
+end
diff --git a/lib/onix/series_identifier.rb b/lib/onix/series_identifier.rb
new file mode 100644
index 0000000..e5afee0
--- /dev/null
+++ b/lib/onix/series_identifier.rb
@@ -0,0 +1,13 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ class SeriesIdentifier
+ include ROXML
+ include ONIX::Common
+
+ xml_name "SeriesIdentifier"
+
+ xml_accessor :series_id_type, :from => "SeriesIDType", :as => Fixnum, :to_xml => ONIX::Formatters.two_digit
+ xml_accessor :id_value, :from => "IDValue"
+ end
+end
diff --git a/lib/onix/sl_product.rb b/lib/onix/sl_product.rb
new file mode 100644
index 0000000..431548f
--- /dev/null
+++ b/lib/onix/sl_product.rb
@@ -0,0 +1,157 @@
+# coding: utf-8
+# milkfarm
+module ONIX
+ class SLProduct < APAProduct
+
+ delegate :copyright_year, :copyright_year=
+ delegate :product_form_detail, :product_form_detail=
+
+ # retrieve the proprietary series ID
+ def proprietary_series_id
+ series_identifier(1).andand.id_value
+ end
+
+ # set a new proprietary series ID
+ def proprietary_series_id=(id)
+ series_identifier_set(1, id)
+ end
+
+ # retrieve the issn
+ def issn
+ series_identifier(2).andand.id_value
+ end
+
+ # set a new issn
+ def issn=(id)
+ series_identifier_set(2, id)
+ end
+
+ # retrieve the value of a particular ID
+ def series_identifier(type)
+ product.series_identifiers.find { |id| id.series_id_type == type }
+ end
+
+ # set the value of a particular ID
+ def series_identifier_set(type, value)
+ series_id = series_identifier(type)
+
+ # create a new series identifier record if we need to
+ if series_id.nil?
+ series_id = ONIX::SeriesIdentifier.new
+ series_id.series_id_type = type
+ product.series_identifiers << series_id
+ end
+
+ series_id.id_value = value
+ end
+
+ # retrieve the value of a particular ID
+ def series(str)
+ product.series.find { |id| id.title_of_series == series }
+ end
+
+ # set the value of a particular ID
+ def series=(value)
+ series_id = series(value)
+
+ # create a new series record if we need to
+ if series_id.nil?
+ series_id = ONIX::Series.new
+ series_id.title_of_series = value
+ product.series << series_id
+ end
+ end
+
+ # retrieve the "language of text" (role=1) language code for this particular product
+ def language_code
+ language(1).andand.language_code
+ end
+
+ # set a new "language of text" (role=1) language code for this particular product
+ def language_code=(str)
+ language_set(1, str)
+ end
+
+ # retrieve the "language of text" (role=1) country code for this particular product
+ def country_code
+ language(1).andand.country_code
+ end
+
+ # set a new "language of text" (role=1) country code for this particular product
+ def country_code=(str)
+ language_set(1, language_code, str)
+ end
+
+ # retrieve the value of a particular language
+ def language(type)
+ product.languages.find { |l| l.language_role == type }
+ end
+
+ # set the value of a particular language
+ def language_set(type, value, value2=nil)
+ l = language(type)
+
+ # create a new language record if we need to
+ if l.nil?
+ l = ONIX::Language.new
+ l.language_role = type
+ product.languages << l
+ end
+
+ # cannot set country_code without language_code
+ unless value.nil?
+ l.language_code = value.to_s # mandatory
+ l.country_code = value2.to_s if value2 # optional
+ end
+ end
+
+ # retrieve the dewey for this title
+ def dewey
+ product.subjects.find { |sub| sub.subject_scheme_id.to_i == 1 } # dewey = 1, abridged dewey = 2
+ end
+
+ # add a dewey to the product
+ def dewey=(code)
+ add_subject code, "1" # dewey = 1, abridged dewey = 2
+ end
+
+ # audience_range_qualifier: 11 = US school grades
+ # audience_range_precision: 1 = exact, 3 = from, 4 = to
+ def us_grade_range
+ audience_range(11)
+ end
+
+ # set a new "audience of text" (role=1) country code for this particular product
+ def us_grade_range=(range=[])
+ audience_range_set(11, range[0], range[1])
+ end
+
+ # retrieve the value of a particular audience range
+ def audience_range(type)
+ product.audience_ranges.find { |a| a.audience_range_qualifier == type }
+ end
+
+ # set the value of a particular audience_range
+ def audience_range_set(type, min=nil, max=nil)
+ a = audience_range(type)
+
+ # create a new audience_range record if we need to
+ if a.nil?
+ a = ONIX::AudienceRange.new
+ a.audience_range_qualifier = type
+ product.audience_ranges << a
+ end
+
+ unless min.nil?
+ a.audience_range_precisions << "03"
+ a.audience_range_values << min
+ end
+ unless max.nil?
+ a.audience_range_precisions << "04"
+ a.audience_range_values << max
+ end
+ a.audience_range_precisions = ["01"] if min.nil? || max.nil?
+ end
+
+ end
+end
diff --git a/spec/audience_range_spec.rb b/spec/audience_range_spec.rb
new file mode 100644
index 0000000..e2ca7f0
--- /dev/null
+++ b/spec/audience_range_spec.rb
@@ -0,0 +1,46 @@
+# coding: utf-8
+
+$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
+
+require 'onix'
+
+context "ONIX::AudienceRange" do
+
+ before(:each) do
+ data_path = File.join(File.dirname(__FILE__),"..","data")
+ file1 = File.join(data_path, "audience_range.xml")
+ @doc = LibXML::XML::Document.file(file1)
+ @root = @doc.root
+ end
+
+ specify "should correctly convert to a string" do
+ aud = ONIX::AudienceRange.from_xml(@root.to_s)
+ aud.to_xml.to_s[0,15].should eql("")
+ end
+
+ specify "should provide read access to first level attibutes" do
+ aud = ONIX::AudienceRange.from_xml(@root.to_s)
+
+ aud.audience_range_qualifier.should eql(11)
+ aud.audience_range_precisions.size.should eql(2)
+ aud.audience_range_precisions[0].should eql(3)
+ aud.audience_range_precisions[1].should eql(4)
+ aud.audience_range_values.size.should eql(2)
+ aud.audience_range_values[0].should eql(3)
+ aud.audience_range_values[1].should eql(5)
+ end
+
+ specify "should provide write access to first level attibutes" do
+ aud = ONIX::AudienceRange.new
+
+ aud.audience_range_qualifier = 12
+ aud.to_xml.to_s.include?("12").should be_true
+
+ aud.audience_range_precisions[0] = 888
+ aud.to_xml.to_s.include?("888").should be_true
+
+ aud.audience_range_values[0] = 999
+ aud.to_xml.to_s.include?("999").should be_true
+ end
+
+end
diff --git a/spec/language_spec.rb b/spec/language_spec.rb
new file mode 100644
index 0000000..bcba8b2
--- /dev/null
+++ b/spec/language_spec.rb
@@ -0,0 +1,42 @@
+# coding: utf-8
+
+$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
+
+require 'onix'
+
+context "ONIX::Language" do
+
+ before(:each) do
+ data_path = File.join(File.dirname(__FILE__),"..","data")
+ file1 = File.join(data_path, "language.xml")
+ @doc = LibXML::XML::Document.file(file1)
+ @root = @doc.root
+ end
+
+ specify "should correctly convert to a string" do
+ lan = ONIX::Language.from_xml(@root.to_s)
+ lan.to_xml.to_s[0,10].should eql("")
+ end
+
+ specify "should provide read access to first level attibutes" do
+ lan = ONIX::Language.from_xml(@root.to_s)
+
+ lan.language_role.should eql(1)
+ lan.language_code.should eql("eng")
+ lan.country_code.should eql("US")
+ end
+
+ specify "should provide write access to first level attibutes" do
+ lan = ONIX::Language.new
+
+ lan.language_role = 2
+ lan.to_xml.to_s.include?("02").should be_true
+
+ lan.language_code = "aar"
+ lan.to_xml.to_s.include?("aar").should be_true
+
+ lan.country_code = "AD"
+ lan.to_xml.to_s.include?("AD").should be_true
+ end
+
+end
diff --git a/spec/series_identifier_spec.rb b/spec/series_identifier_spec.rb
new file mode 100644
index 0000000..354a079
--- /dev/null
+++ b/spec/series_identifier_spec.rb
@@ -0,0 +1,38 @@
+# coding: utf-8
+
+$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
+
+require 'onix'
+
+context "ONIX::SeriesIdentifier" do
+
+ before(:each) do
+ data_path = File.join(File.dirname(__FILE__),"..","data")
+ file1 = File.join(data_path, "series_identifier.xml")
+ @doc = LibXML::XML::Document.file(file1)
+ @root = @doc.root
+ end
+
+ specify "should correctly convert to a string" do
+ series = ONIX::SeriesIdentifier.from_xml(@root.to_s)
+ series.to_xml.to_s[0,18].should eql("")
+ end
+
+ specify "should provide read access to first level attibutes" do
+ series = ONIX::SeriesIdentifier.from_xml(@root.to_s)
+
+ series.series_id_type.should eql(1)
+ series.id_value.should eql("10001")
+ end
+
+ specify "should provide write access to first level attibutes" do
+ series = ONIX::SeriesIdentifier.new
+
+ series.series_id_type = 9
+ series.to_xml.to_s.include?("09").should be_true
+
+ series.id_value = 999
+ series.to_xml.to_s.include?("999").should be_true
+ end
+
+end
diff --git a/spec/series_spec.rb b/spec/series_spec.rb
new file mode 100644
index 0000000..56282ef
--- /dev/null
+++ b/spec/series_spec.rb
@@ -0,0 +1,34 @@
+# coding: utf-8
+
+$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
+
+require 'onix'
+
+context "ONIX::Series" do
+
+ before(:each) do
+ data_path = File.join(File.dirname(__FILE__),"..","data")
+ file1 = File.join(data_path, "series.xml")
+ @doc = LibXML::XML::Document.file(file1)
+ @root = @doc.root
+ end
+
+ specify "should correctly convert to a string" do
+ series = ONIX::Series.from_xml(@root.to_s)
+ series.to_xml.to_s[0,8].should eql("")
+ end
+
+ specify "should provide read access to first level attibutes" do
+ series = ONIX::Series.from_xml(@root.to_s)
+
+ series.title_of_series.should eql("Citizens and Their Governments")
+ end
+
+ specify "should provide write access to first level attibutes" do
+ series = ONIX::Series.new
+
+ series.title_of_series = "Cool Science Careers"
+ series.to_xml.to_s.include?("Cool Science Careers").should be_true
+ end
+
+end
diff --git a/spec/sl_product_spec.rb b/spec/sl_product_spec.rb
new file mode 100644
index 0000000..f11d8aa
--- /dev/null
+++ b/spec/sl_product_spec.rb
@@ -0,0 +1,48 @@
+# coding: utf-8
+
+$LOAD_PATH.unshift(File.dirname(__FILE__) + '/../lib')
+
+require 'onix'
+require 'date'
+
+context "ONIX::SLProduct" do
+
+ before(:each) do
+ @data_path = File.join(File.dirname(__FILE__),"..","data")
+ file1 = File.join(@data_path, "sl_product.xml")
+ @doc = LibXML::XML::Document.file(file1)
+ @product_node = @doc.root
+ end
+
+ specify "should provide read access to attibrutes" do
+ @product = ONIX::Product.from_xml(@product_node.to_s)
+ @sl = ONIX::SLProduct.new(@product)
+
+ @sl.record_reference.should eql("10001")
+ @sl.notification_type.should eql(2)
+ @sl.number_of_pages.should eql(32)
+ @sl.publishing_status.should eql(2)
+ @sl.publication_date.should eql(Date.civil(2009,12,1))
+ @sl.copyright_year.should eql(2008)
+ end
+
+ specify "should provide write access to attibutes" do
+ apa = ONIX::SLProduct.new
+
+ apa.notification_type = 3
+ apa.to_xml.to_s.include?("03").should be_true
+
+ apa.record_reference = "999"
+ apa.to_xml.to_s.include?("999").should be_true
+
+ apa.number_of_pages = 100
+ apa.to_xml.to_s.include?("100").should be_true
+
+ apa.publishing_status = 4
+ apa.to_xml.to_s.include?("04").should be_true
+
+ apa.publication_date = Date.civil(1998,9,1)
+ apa.to_xml.to_s.include?("19980901").should be_true
+ end
+
+end