ess 0.9.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,797 @@
1
+ require 'ess/helpers'
2
+ require 'time'
3
+
4
+ module ESS
5
+ module Validation
6
+
7
+ class ValidationError < StandardError
8
+ end
9
+
10
+ class TextIsNotNull
11
+ def validate tag
12
+ if tag.text!.strip == ''
13
+ raise InvalidValueError, "the <#{tag.tag_name}> element cannot be empty"
14
+ end
15
+ end
16
+ end
17
+
18
+ class TextIsValidEmail
19
+ def validate tag
20
+ # TODO: Doing this is not recommended, check if realy necessary
21
+ end
22
+ end
23
+
24
+ class URLValidation
25
+ def validate_url text
26
+ unless text =~ /^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i || text.length > 10
27
+ unless isValidIP text
28
+ raise InvalidValueError, "invalid URL: #{text}"
29
+ end
30
+ end
31
+ end
32
+
33
+ private
34
+ def isValidIP text
35
+ unless text =~ /^((1?\d{1,2}|2[0-4]\d|25[0-5])\.){3}(1?\d{1,2}|2[0-4]\d|25[0-5])$/
36
+ return false
37
+ end
38
+ return text.split('.').map { |part| part.to_i <= 255 }.all?
39
+ end
40
+ end
41
+
42
+ class TextIsValidURL < URLValidation
43
+ def validate tag
44
+ validate_url tag.text!
45
+ end
46
+ end
47
+
48
+ class XmlnsIsValidURL < URLValidation
49
+ def validate ess_tag
50
+ validate_url ess_tag.xmlns_attr
51
+ end
52
+ end
53
+
54
+ class TextIsValidLatitude
55
+ def validate tag
56
+ unless tag.text! =~ /^-?([0-8]?[0-9]|90)\.[0-9]{1,6}$/
57
+ raise InvalidValueError, "invalid latitude: #{tag.text!}"
58
+ end
59
+ end
60
+ end
61
+
62
+ class TextIsValidLongitude
63
+ def validate tag
64
+ unless tag.text! =~ /^-?((1?[0-7]?|[0-9]?)[0-9]|180)\.[0-9]{1,6}$/
65
+ raise InvalidValueError, "invalid longitude: #{tag.text!}"
66
+ end
67
+ end
68
+ end
69
+
70
+ class TextIsValidCountryCode
71
+ COUNTRY_CODES = {
72
+ "AU" => "Australia",
73
+ "AF" => "Afghanistan",
74
+ "AL" => "Albania",
75
+ "DZ" => "Algeria",
76
+ "AS" => "American Samoa",
77
+ "AD" => "Andorra",
78
+ "AO" => "Angola",
79
+ "AI" => "Anguilla",
80
+ "AQ" => "Antarctica",
81
+ "AG" => "Antigua & Barbuda",
82
+ "AR" => "Argentina",
83
+ "AM" => "Armenia",
84
+ "AW" => "Aruba",
85
+ "AT" => "Austria",
86
+ "AZ" => "Azerbaijan",
87
+ "BS" => "Bahamas",
88
+ "BH" => "Bahrain",
89
+ "BD" => "Bangladesh",
90
+ "BB" => "Barbados",
91
+ "BY" => "Belarus",
92
+ "BE" => "Belgium",
93
+ "BZ" => "Belize",
94
+ "BJ" => "Benin",
95
+ "BM" => "Bermuda",
96
+ "BT" => "Bhutan",
97
+ "BO" => "Bolivia",
98
+ "BA" => "Bosnia/Hercegovina",
99
+ "BW" => "Botswana",
100
+ "BV" => "Bouvet Island",
101
+ "BR" => "Brazil",
102
+ "IO" => "British Indian Ocean Territory",
103
+ "BN" => "Brunei Darussalam",
104
+ "BG" => "Bulgaria",
105
+ "BF" => "Burkina Faso",
106
+ "BI" => "Burundi",
107
+ "KH" => "Cambodia",
108
+ "CM" => "Cameroon",
109
+ "CA" => "Canada",
110
+ "CV" => "Cape Verde",
111
+ "KY" => "Cayman Is",
112
+ "CF" => "Central African Republic",
113
+ "TD" => "Chad",
114
+ "CL" => "Chile",
115
+ "CN" => "China, People's Republic of",
116
+ "CX" => "Christmas Island",
117
+ "CC" => "Cocos Islands",
118
+ "CO" => "Colombia",
119
+ "KM" => "Comoros",
120
+ "CG" => "Congo",
121
+ "CD" => "Congo, Democratic Republic",
122
+ "CK" => "Cook Islands",
123
+ "CR" => "Costa Rica",
124
+ "CI" => "Cote d'Ivoire",
125
+ "HR" => "Croatia",
126
+ "CU" => "Cuba",
127
+ "CY" => "Cyprus",
128
+ "CZ" => "Czech Republic",
129
+ "DK" => "Denmark",
130
+ "DJ" => "Djibouti",
131
+ "DM" => "Dominica",
132
+ "DO" => "Dominican Republic",
133
+ "TP" => "East Timor",
134
+ "EC" => "Ecuador",
135
+ "EG" => "Egypt",
136
+ "SV" => "El Salvador",
137
+ "GQ" => "Equatorial Guinea",
138
+ "ER" => "Eritrea",
139
+ "EE" => "Estonia",
140
+ "ET" => "Ethiopia",
141
+ "FK" => "Falkland Islands",
142
+ "FO" => "Faroe Islands",
143
+ "FJ" => "Fiji",
144
+ "FI" => "Finland",
145
+ "FR" => "France",
146
+ "FX" => "France, Metropolitan",
147
+ "GF" => "French Guiana",
148
+ "PF" => "French Polynesia",
149
+ "TF" => "French South Territories",
150
+ "GA" => "Gabon",
151
+ "GM" => "Gambia",
152
+ "GE" => "Georgia",
153
+ "DE" => "Germany",
154
+ "GH" => "Ghana",
155
+ "GI" => "Gibraltar",
156
+ "GR" => "Greece",
157
+ "GL" => "Greenland",
158
+ "GD" => "Grenada",
159
+ "GP" => "Guadeloupe",
160
+ "GU" => "Guam",
161
+ "GT" => "Guatemala",
162
+ "GN" => "Guinea",
163
+ "GW" => "Guinea-Bissau",
164
+ "GY" => "Guyana",
165
+ "HT" => "Haiti",
166
+ "HM" => "Heard Island And Mcdonald Island",
167
+ "HN" => "Honduras",
168
+ "HK" => "Hong Kong",
169
+ "HU" => "Hungary",
170
+ "IS" => "Iceland",
171
+ "IN" => "India",
172
+ "ID" => "Indonesia",
173
+ "IR" => "Iran",
174
+ "IQ" => "Iraq",
175
+ "IE" => "Ireland",
176
+ "IL" => "Israel",
177
+ "IT" => "Italy",
178
+ "JM" => "Jamaica",
179
+ "JP" => "Japan",
180
+ "JT" => "Johnston Island",
181
+ "JO" => "Jordan",
182
+ "KZ" => "Kazakhstan",
183
+ "KE" => "Kenya",
184
+ "KI" => "Kiribati",
185
+ "KP" => "Korea, Democratic Peoples Republic",
186
+ "KR" => "Korea, Republic of",
187
+ "KW" => "Kuwait",
188
+ "KG" => "Kyrgyzstan",
189
+ "LA" => "Lao People's Democratic Republic",
190
+ "LV" => "Latvia",
191
+ "LB" => "Lebanon",
192
+ "LS" => "Lesotho",
193
+ "LR" => "Liberia",
194
+ "LY" => "Libyan Arab Jamahiriya",
195
+ "LI" => "Liechtenstein",
196
+ "LT" => "Lithuania",
197
+ "LU" => "Luxembourg",
198
+ "MO" => "Macau",
199
+ "MK" => "Macedonia",
200
+ "MG" => "Madagascar",
201
+ "MW" => "Malawi",
202
+ "MY" => "Malaysia",
203
+ "MV" => "Maldives",
204
+ "ML" => "Mali",
205
+ "MT" => "Malta",
206
+ "MH" => "Marshall Islands",
207
+ "MQ" => "Martinique",
208
+ "MR" => "Mauritania",
209
+ "MU" => "Mauritius",
210
+ "YT" => "Mayotte",
211
+ "MX" => "Mexico",
212
+ "FM" => "Micronesia",
213
+ "MD" => "Moldavia",
214
+ "MC" => "Monaco",
215
+ "MN" => "Mongolia",
216
+ "ME" => "Montenegro",
217
+ "MS" => "Montserrat",
218
+ "MA" => "Morocco",
219
+ "MZ" => "Mozambique",
220
+ "MM" => "Union Of Myanmar",
221
+ "NA" => "Namibia",
222
+ "NR" => "Nauru Island",
223
+ "NP" => "Nepal",
224
+ "NL" => "Netherlands",
225
+ "AN" => "Netherlands Antilles",
226
+ "NC" => "New Caledonia",
227
+ "NZ" => "New Zealand",
228
+ "NI" => "Nicaragua",
229
+ "NE" => "Niger",
230
+ "NG" => "Nigeria",
231
+ "NU" => "Niue",
232
+ "NF" => "Norfolk Island",
233
+ "MP" => "Mariana Islands, Northern",
234
+ "NO" => "Norway",
235
+ "OM" => "Oman",
236
+ "PK" => "Pakistan",
237
+ "PW" => "Palau Islands",
238
+ "PS" => "Palestine",
239
+ "PA" => "Panama",
240
+ "PG" => "Papua New Guinea",
241
+ "PY" => "Paraguay",
242
+ "PE" => "Peru",
243
+ "PH" => "Philippines",
244
+ "PN" => "Pitcairn",
245
+ "PL" => "Poland",
246
+ "PT" => "Portugal",
247
+ "PR" => "Puerto Rico",
248
+ "QA" => "Qatar",
249
+ "RE" => "Reunion Island",
250
+ "RO" => "Romania",
251
+ "RU" => "Russian Federation",
252
+ "RW" => "Rwanda",
253
+ "WS" => "Samoa",
254
+ "SH" => "St Helena",
255
+ "KN" => "St Kitts & Nevis",
256
+ "LC" => "St Lucia",
257
+ "PM" => "St Pierre & Miquelon",
258
+ "VC" => "St Vincent",
259
+ "SM" => "San Marino",
260
+ "ST" => "Sao Tome & Principe",
261
+ "SA" => "Saudi Arabia",
262
+ "SN" => "Senegal",
263
+ "RS" => "Serbia",
264
+ "SC" => "Seychelles",
265
+ "SL" => "Sierra Leone",
266
+ "SG" => "Singapore",
267
+ "SK" => "Slovakia",
268
+ "SI" => "Slovenia",
269
+ "SB" => "Solomon Islands",
270
+ "SO" => "Somalia",
271
+ "ZA" => "South Africa",
272
+ "GS" => "South Georgia and South Sandwich",
273
+ "ES" => "Spain",
274
+ "LK" => "Sri Lanka",
275
+ "XX" => "Stateless Persons",
276
+ "SD" => "Sudan",
277
+ "SR" => "Suriname",
278
+ "SJ" => "Svalbard and Jan Mayen",
279
+ "SZ" => "Swaziland",
280
+ "SE" => "Sweden",
281
+ "CH" => "Switzerland",
282
+ "SY" => "Syrian Arab Republic",
283
+ "TW" => "Taiwan, Republic of China",
284
+ "TJ" => "Tajikistan",
285
+ "TZ" => "Tanzania",
286
+ "TH" => "Thailand",
287
+ "TL" => "Timor Leste",
288
+ "TG" => "Togo",
289
+ "TK" => "Tokelau",
290
+ "TO" => "Tonga",
291
+ "TT" => "Trinidad & Tobago",
292
+ "TN" => "Tunisia",
293
+ "TR" => "Turkey",
294
+ "TM" => "Turkmenistan",
295
+ "TC" => "Turks And Caicos Islands",
296
+ "TV" => "Tuvalu",
297
+ "UG" => "Uganda",
298
+ "UA" => "Ukraine",
299
+ "AE" => "United Arab Emirates",
300
+ "GB" => "United Kingdom",
301
+ "UM" => "US Minor Outlying Islands",
302
+ "US" => "USA",
303
+ "HV" => "Upper Volta",
304
+ "UY" => "Uruguay",
305
+ "UZ" => "Uzbekistan",
306
+ "VU" => "Vanuatu",
307
+ "VA" => "Vatican City State",
308
+ "VE" => "Venezuela",
309
+ "VN" => "Vietnam",
310
+ "VG" => "Virgin Islands (British)",
311
+ "VI" => "Virgin Islands (US)",
312
+ "WF" => "Wallis And Futuna Islands",
313
+ "EH" => "Western Sahara",
314
+ "YE" => "Yemen Arab Rep.",
315
+ "YD" => "Yemen Democratic",
316
+ "YU" => "Yugoslavia",
317
+ "ZR" => "Zaire",
318
+ "ZM" => "Zambia",
319
+ "ZW" => "Zimbabwe"
320
+ }
321
+
322
+ def validate tag
323
+ unless COUNTRY_CODES.keys.include? tag.text!.strip.upcase
324
+ raise InvalidValueError, "invalid country code: #{tag.text!}"
325
+ end
326
+ end
327
+ end
328
+
329
+ class TextIsValidCurrency
330
+ CURRENCIES = {
331
+ 'AF' => 'AFA',
332
+ 'AL' => 'ALL',
333
+ 'DZ' => 'DZD',
334
+ 'AS' => 'USD',
335
+ 'AD' => 'EUR',
336
+ 'AO' => 'AOA',
337
+ 'AI' => 'XCD',
338
+ 'AQ' => 'NOK',
339
+ 'AG' => 'XCD',
340
+ 'AR' => 'ARA',
341
+ 'AM' => 'AMD',
342
+ 'AW' => 'AWG',
343
+ 'AU' => 'AUD',
344
+ 'AT' => 'EUR',
345
+ 'AZ' => 'AZM',
346
+ 'BS' => 'BSD',
347
+ 'BH' => 'BHD',
348
+ 'BD' => 'BDT',
349
+ 'BB' => 'BBD',
350
+ 'BY' => 'BYR',
351
+ 'BE' => 'EUR',
352
+ 'BZ' => 'BZD',
353
+ 'BJ' => 'XAF',
354
+ 'BM' => 'BMD',
355
+ 'BT' => 'BTN',
356
+ 'BO' => 'BOB',
357
+ 'BA' => 'BAM',
358
+ 'BW' => 'BWP',
359
+ 'BV' => 'NOK',
360
+ 'BR' => 'BRL',
361
+ 'IO' => 'GBP',
362
+ 'BN' => 'BND',
363
+ 'BG' => 'BGN',
364
+ 'BF' => 'XAF',
365
+ 'BI' => 'BIF',
366
+ 'KH' => 'KHR',
367
+ 'CM' => 'XAF',
368
+ 'CA' => 'CAD',
369
+ 'CV' => 'CVE',
370
+ 'KY' => 'KYD',
371
+ 'CF' => 'XAF',
372
+ 'TD' => 'XAF',
373
+ 'CL' => 'CLF',
374
+ 'CN' => 'CNY',
375
+ 'CX' => 'AUD',
376
+ 'CC' => 'AUD',
377
+ 'CO' => 'COP',
378
+ 'KM' => 'KMF',
379
+ 'CD' => 'CDZ',
380
+ 'CG' => 'XAF',
381
+ 'CK' => 'NZD',
382
+ 'CR' => 'CRC',
383
+ 'HR' => 'HRK',
384
+ 'CU' => 'CUP',
385
+ 'CY' => 'EUR',
386
+ 'CZ' => 'CZK',
387
+ 'DK' => 'DKK',
388
+ 'DJ' => 'DJF',
389
+ 'DM' => 'XCD',
390
+ 'DO' => 'DOP',
391
+ 'TP' => 'TPE',
392
+ 'EC' => 'USD',
393
+ 'EG' => 'EGP',
394
+ 'SV' => 'USD',
395
+ 'GQ' => 'XAF',
396
+ 'ER' => 'ERN',
397
+ 'EE' => 'EEK',
398
+ 'ET' => 'ETB',
399
+ 'FK' => 'FKP',
400
+ 'FO' => 'DKK',
401
+ 'FJ' => 'FJD',
402
+ 'FI' => 'EUR',
403
+ 'FR' => 'EUR',
404
+ 'FX' => 'EUR',
405
+ 'GF' => 'EUR',
406
+ 'PF' => 'XPF',
407
+ 'TF' => 'EUR',
408
+ 'GA' => 'XAF',
409
+ 'GM' => 'GMD',
410
+ 'GE' => 'GEL',
411
+ 'DE' => 'EUR',
412
+ 'GH' => 'GHC',
413
+ 'GI' => 'GIP',
414
+ 'GR' => 'EUR',
415
+ 'GL' => 'DKK',
416
+ 'GD' => 'XCD',
417
+ 'GP' => 'EUR',
418
+ 'GU' => 'USD',
419
+ 'GT' => 'GTQ',
420
+ 'GN' => 'GNS',
421
+ 'GW' => 'GWP',
422
+ 'GY' => 'GYD',
423
+ 'HT' => 'HTG',
424
+ 'HM' => 'AUD',
425
+ 'VA' => 'EUR',
426
+ 'HN' => 'HNL',
427
+ 'HK' => 'HKD',
428
+ 'HU' => 'HUF',
429
+ 'IS' => 'ISK',
430
+ 'IN' => 'INR',
431
+ 'ID' => 'IDR',
432
+ 'IR' => 'IRR',
433
+ 'IQ' => 'IQD',
434
+ 'IE' => 'EUR',
435
+ 'IL' => 'ILS',
436
+ 'IT' => 'EUR',
437
+ 'CI' => 'XAF',
438
+ 'JM' => 'JMD',
439
+ 'JP' => 'JPY',
440
+ 'JO' => 'JOD',
441
+ 'KZ' => 'KZT',
442
+ 'KE' => 'KES',
443
+ 'KI' => 'AUD',
444
+ 'KP' => 'KPW',
445
+ 'KR' => 'KRW',
446
+ 'KW' => 'KWD',
447
+ 'KG' => 'KGS',
448
+ 'LA' => 'LAK',
449
+ 'LV' => 'LVL',
450
+ 'LB' => 'LBP',
451
+ 'LS' => 'LSL',
452
+ 'LR' => 'LRD',
453
+ 'LY' => 'LYD',
454
+ 'LI' => 'CHF',
455
+ 'LT' => 'LTL',
456
+ 'LU' => 'EUR',
457
+ 'MO' => 'MOP',
458
+ 'MK' => 'MKD',
459
+ 'MG' => 'MGF',
460
+ 'MW' => 'MWK',
461
+ 'MY' => 'MYR',
462
+ 'MV' => 'MVR',
463
+ 'ML' => 'XAF',
464
+ 'MT' => 'EUR',
465
+ 'MH' => 'USD',
466
+ 'MQ' => 'EUR',
467
+ 'MR' => 'MRO',
468
+ 'MU' => 'MUR',
469
+ 'YT' => 'EUR',
470
+ 'MX' => 'MXN',
471
+ 'FM' => 'USD',
472
+ 'MD' => 'MDL',
473
+ 'MC' => 'EUR',
474
+ 'MN' => 'MNT',
475
+ 'MS' => 'XCD',
476
+ 'MA' => 'MAD',
477
+ 'MZ' => 'MZM',
478
+ 'MM' => 'MMK',
479
+ 'NA' => 'NAD',
480
+ 'NR' => 'AUD',
481
+ 'NP' => 'NPR',
482
+ 'NL' => 'EUR',
483
+ 'AN' => 'ANG',
484
+ 'NC' => 'XPF',
485
+ 'NZ' => 'NZD',
486
+ 'NI' => 'NIC',
487
+ 'NE' => 'XOF',
488
+ 'NG' => 'NGN',
489
+ 'NU' => 'NZD',
490
+ 'NF' => 'AUD',
491
+ 'MP' => 'USD',
492
+ 'NO' => 'NOK',
493
+ 'OM' => 'OMR',
494
+ 'PK' => 'PKR',
495
+ 'PW' => 'USD',
496
+ 'PA' => 'PAB',
497
+ 'PG' => 'PGK',
498
+ 'PY' => 'PYG',
499
+ 'PE' => 'PEI',
500
+ 'PH' => 'PHP',
501
+ 'PN' => 'NZD',
502
+ 'PL' => 'PLN',
503
+ 'PT' => 'EUR',
504
+ 'PR' => 'USD',
505
+ 'QA' => 'QAR',
506
+ 'RE' => 'EUR',
507
+ 'RO' => 'ROL',
508
+ 'RU' => 'RUB',
509
+ 'RW' => 'RWF',
510
+ 'KN' => 'XCD',
511
+ 'LC' => 'XCD',
512
+ 'VC' => 'XCD',
513
+ 'WS' => 'WST',
514
+ 'SM' => 'EUR',
515
+ 'ST' => 'STD',
516
+ 'SA' => 'SAR',
517
+ 'SN' => 'XOF',
518
+ 'CS' => 'EUR',
519
+ 'SC' => 'SCR',
520
+ 'SL' => 'SLL',
521
+ 'SG' => 'SGD',
522
+ 'SK' => 'EUR',
523
+ 'SI' => 'EUR',
524
+ 'SB' => 'SBD',
525
+ 'SO' => 'SOS',
526
+ 'ZA' => 'ZAR',
527
+ 'GS' => 'GBP',
528
+ 'ES' => 'EUR',
529
+ 'LK' => 'LKR',
530
+ 'SH' => 'SHP',
531
+ 'PM' => 'EUR',
532
+ 'SD' => 'SDG',
533
+ 'SR' => 'SRG',
534
+ 'SJ' => 'NOK',
535
+ 'SZ' => 'SZL',
536
+ 'SE' => 'SEK',
537
+ 'CH' => 'CHF',
538
+ 'SY' => 'SYP',
539
+ 'TW' => 'TWD',
540
+ 'TJ' => 'TJR',
541
+ 'TZ' => 'TZS',
542
+ 'TH' => 'THB',
543
+ 'TG' => 'XAF',
544
+ 'TK' => 'NZD',
545
+ 'TO' => 'TOP',
546
+ 'TT' => 'TTD',
547
+ 'TN' => 'TND',
548
+ 'TR' => 'TRY',
549
+ 'TM' => 'TMM',
550
+ 'TC' => 'USD',
551
+ 'TV' => 'AUD',
552
+ 'UG' => 'UGS',
553
+ 'UA' => 'UAH',
554
+ 'SU' => 'SUR',
555
+ 'AE' => 'AED',
556
+ 'GB' => 'GBP',
557
+ 'US' => 'USD',
558
+ 'UM' => 'USD',
559
+ 'UY' => 'UYU',
560
+ 'UZ' => 'UZS',
561
+ 'VU' => 'VUV',
562
+ 'VE' => 'VEF',
563
+ 'VN' => 'VND',
564
+ 'VG' => 'USD',
565
+ 'VI' => 'USD',
566
+ 'WF' => 'XPF',
567
+ 'XO' => 'XOF',
568
+ 'EH' => 'MAD',
569
+ 'ZM' => 'ZMK',
570
+ 'ZW' => 'USD'
571
+ }
572
+
573
+ def validate tag
574
+ unless CURRENCIES.values.include? tag.text!.strip.upcase
575
+ raise InvalidValueError, "invalid currency: #{tag.text!}"
576
+ end
577
+ end
578
+ end
579
+
580
+ class CurrMandatoryIfValueGT0
581
+ def validate price_tag
582
+ if price_tag.value.text!.to_i != 0
583
+ if price_tag.currency.text! == ""
584
+ raise InvalidValueError, "the <currency> element of a price item cannot be empty if <value> is not 0"
585
+ end
586
+ end
587
+ end
588
+ end
589
+
590
+ class LangIsValid
591
+ LANGUAGES = {
592
+ 'aa' => 'Afar',
593
+ 'ab' => 'Abkhaz',
594
+ 'ae' => 'Avestan',
595
+ 'af' => 'Afrikaans',
596
+ 'ak' => 'Akan',
597
+ 'am' => 'Amharic',
598
+ 'an' => 'Aragonese',
599
+ 'ar' => 'Arabic',
600
+ 'as' => 'Assamese',
601
+ 'av' => 'Avaric',
602
+ 'ay' => 'Aymara',
603
+ 'az' => 'Azerbaijani',
604
+ 'ba' => 'Bashkir',
605
+ 'be' => 'Belarusian',
606
+ 'bg' => 'Bulgarian',
607
+ 'bh' => 'Bihari',
608
+ 'bi' => 'Bislama',
609
+ 'bm' => 'Bambara',
610
+ 'bn' => 'Bengali',
611
+ 'bo' => 'Tibetan Standard, Tibetan, Central',
612
+ 'br' => 'Breton',
613
+ 'bs' => 'Bosnian',
614
+ 'ca' => 'Catalan; Valencian',
615
+ 'ce' => 'Chechen',
616
+ 'ch' => 'Chamorro',
617
+ 'co' => 'Corsican',
618
+ 'cr' => 'Cree',
619
+ 'cs' => 'Czech',
620
+ 'cu' => 'Old Church Slavonic, Church Slavic, Church Slavonic, Old Bulgarian, Old Slavonic',
621
+ 'cv' => 'Chuvash',
622
+ 'cy' => 'Welsh',
623
+ 'da' => 'Danish',
624
+ 'de' => 'German',
625
+ 'dv' => 'Divehi; Dhivehi; Maldivian;',
626
+ 'dz' => 'Dzongkha',
627
+ 'ee' => 'Ewe',
628
+ 'el' => 'Greek, Modern',
629
+ 'en' => 'English',
630
+ 'eo' => 'Esperanto',
631
+ 'es' => 'Spanish; Castilian',
632
+ 'et' => 'Estonian',
633
+ 'eu' => 'Basque',
634
+ 'fa' => 'Persian',
635
+ 'ff' => 'Fula; Fulah; Pulaar; Pular',
636
+ 'fi' => 'Finnish',
637
+ 'fj' => 'Fijian',
638
+ 'fo' => 'Faroese',
639
+ 'fr' => 'French',
640
+ 'fy' => 'Western Frisian',
641
+ 'ga' => 'Irish',
642
+ 'gd' => 'Scottish Gaelic; Gaelic',
643
+ 'gl' => 'Galician',
644
+ 'gn' => 'Guaran',
645
+ 'gu' => 'Gujarati',
646
+ 'gv' => 'Manx',
647
+ 'ha' => 'Hausa',
648
+ 'he' => 'Hebrew (modern)',
649
+ 'hi' => 'Hindi',
650
+ 'ho' => 'Hiri Motu',
651
+ 'hr' => 'Croatian',
652
+ 'ht' => 'Haitian; Haitian Creole',
653
+ 'hu' => 'Hungarian',
654
+ 'hy' => 'Armenian',
655
+ 'hz' => 'Herero',
656
+ 'ia' => 'Interlingua',
657
+ 'id' => 'Indonesian',
658
+ 'ie' => 'Interlingue',
659
+ 'ig' => 'Igbo',
660
+ 'ii' => 'Nuosu',
661
+ 'ik' => 'Inupiaq',
662
+ 'io' => 'Ido',
663
+ 'is' => 'Icelandic',
664
+ 'it' => 'Italian',
665
+ 'iu' => 'Inuktitut',
666
+ 'ja' => 'Japanese (ja)',
667
+ 'jv' => 'Javanese (jv)',
668
+ 'ka' => 'Georgian',
669
+ 'kg' => 'Kongo',
670
+ 'ki' => 'Kikuyu, Gikuyu',
671
+ 'kj' => 'Kwanyama, Kuanyama',
672
+ 'kk' => 'Kazakh',
673
+ 'kl' => 'Kalaallisut, Greenlandic',
674
+ 'km' => 'Khmer',
675
+ 'kn' => 'Kannada',
676
+ 'ko' => 'Korean',
677
+ 'kr' => 'Kanuri',
678
+ 'ks' => 'Kashmiri',
679
+ 'ku' => 'Kurdish',
680
+ 'kv' => 'Komi',
681
+ 'kw' => 'Cornish',
682
+ 'ky' => 'Kirghiz, Kyrgyz',
683
+ 'la' => 'Latin',
684
+ 'lb' => 'Luxembourgish, Letzeburgesch',
685
+ 'lg' => 'Luganda',
686
+ 'li' => 'Limburgish, Limburgan, Limburger',
687
+ 'ln' => 'Lingala',
688
+ 'lo' => 'Lao',
689
+ 'lt' => 'Lithuanian',
690
+ 'lu' => 'Luba-Katanga',
691
+ 'lv' => 'Latvian',
692
+ 'mg' => 'Malagasy',
693
+ 'mh' => 'Marshallese',
694
+ 'mi' => 'Maori',
695
+ 'mk' => 'Macedonian',
696
+ 'ml' => 'Malayalam',
697
+ 'mn' => 'Mongolian',
698
+ 'mr' => 'Marathi (Mara?hi)',
699
+ 'ms' => 'Malay',
700
+ 'mt' => 'Maltese',
701
+ 'my' => 'Burmese',
702
+ 'na' => 'Nauru',
703
+ 'nb' => 'Norwegian Bokm',
704
+ 'nd' => 'North Ndebele',
705
+ 'ne' => 'Nepali',
706
+ 'ng' => 'Ndonga',
707
+ 'nl' => 'Dutch',
708
+ 'nn' => 'Norwegian Nynorsk',
709
+ 'no' => 'Norwegian',
710
+ 'nr' => 'South Ndebele',
711
+ 'nv' => 'Navajo, Navaho',
712
+ 'ny' => 'Chichewa; Chewa; Nyanja',
713
+ 'oc' => 'Occitan',
714
+ 'oj' => 'Ojibwe, Ojibwa',
715
+ 'om' => 'Oromo',
716
+ 'or' => 'Oriya',
717
+ 'os' => 'Ossetian, Ossetic',
718
+ 'pa' => 'Panjabi, Punjabi',
719
+ 'pi' => 'Pali',
720
+ 'pl' => 'Polish',
721
+ 'ps' => 'Pashto, Pushto',
722
+ 'pt' => 'Portuguese',
723
+ 'qu' => 'Quechua',
724
+ 'rm' => 'Romansh',
725
+ 'rn' => 'Kirundi',
726
+ 'ro' => 'Romanian, Moldavian, Moldovan',
727
+ 'ru' => 'Russian',
728
+ 'rw' => 'Kinyarwanda',
729
+ 'sa' => 'Sanskrit (Sa?sk?ta)',
730
+ 'sc' => 'Sardinian',
731
+ 'sd' => 'Sindhi',
732
+ 'se' => 'Northern Sami',
733
+ 'sg' => 'Sango',
734
+ 'si' => 'Sinhala, Sinhalese',
735
+ 'sk' => 'Slovak',
736
+ 'sl' => 'Slovene',
737
+ 'sm' => 'Samoan',
738
+ 'sn' => 'Shona',
739
+ 'so' => 'Somali',
740
+ 'sq' => 'Albanian',
741
+ 'sr' => 'Serbian',
742
+ 'ss' => 'Swati',
743
+ 'st' => 'Southern Sotho',
744
+ 'su' => 'Sundanese',
745
+ 'sv' => 'Swedish',
746
+ 'sw' => 'Swahili',
747
+ 'ta' => 'Tamil',
748
+ 'te' => 'Telugu',
749
+ 'tg' => 'Tajik',
750
+ 'th' => 'Thai',
751
+ 'ti' => 'Tigrinya',
752
+ 'tk' => 'Turkmen',
753
+ 'tl' => 'Tagalog',
754
+ 'tn' => 'Tswana',
755
+ 'to' => 'Tonga (Tonga Islands)',
756
+ 'tr' => 'Turkish',
757
+ 'ts' => 'Tsonga',
758
+ 'tt' => 'Tatar',
759
+ 'tw' => 'Twi',
760
+ 'ty' => 'Tahitian',
761
+ 'ug' => 'Uighur, Uyghur',
762
+ 'uk' => 'Ukrainian',
763
+ 'ur' => 'Urdu',
764
+ 'uz' => 'Uzbek',
765
+ 've' => 'Venda',
766
+ 'vi' => 'Vietnamese',
767
+ 'vo' => 'Volapk',
768
+ 'wa' => 'Walloon',
769
+ 'wo' => 'Wolof',
770
+ 'xh' => 'Xhosa',
771
+ 'yi' => 'Yiddish',
772
+ 'yo' => 'Yoruba',
773
+ 'za' => 'Zhuang, Chuang',
774
+ 'zh' => 'Chinese',
775
+ 'zu' => 'Zulu'
776
+ }
777
+
778
+ def validate ess_tag
779
+ unless LANGUAGES.has_key?(ess_tag.lang_attr) || ess_tag.lang_attr == ""
780
+ raise InvalidValueError, "the \"lang\" attribute value is invalid: #{ess_tag.lang_attr}"
781
+ end
782
+ end
783
+ end
784
+
785
+ class UnitMandatoryIfRecurrent
786
+ def validate item_tag
787
+ if item_tag.type_attr == "recurrent"
788
+ unless item_tag.unit_attr != ""
789
+ raise InvalidValueError, "the \"unit\" attribute is mandatory in a date item if type is recurrent"
790
+ end
791
+ end
792
+ end
793
+ end
794
+
795
+ end
796
+ end
797
+