ess 0.9.1

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.
@@ -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
+