revs-utils 1.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml ADDED
@@ -0,0 +1,15 @@
1
+ ---
2
+ !binary "U0hBMQ==":
3
+ metadata.gz: !binary |-
4
+ NGY1MmUzYTdjMjU1OTI2MGU5NzA0YTIzZDVkOGY0Nzg1OWYwMzZjOA==
5
+ data.tar.gz: !binary |-
6
+ ZjQ0OWRiOTlmZGQ2YzY1YjU4Zjc1NWU3MWIyODU4NjRiMTg4Nzg5MQ==
7
+ SHA512:
8
+ metadata.gz: !binary |-
9
+ Y2RkOTIyYTVhNmRlODRmYWViNzMwMzkyNGM3MjVmYTc1MzNjYWMyMDgyZDk0
10
+ OTNiYjE2NjQ2YzJiMGY2NjA0OGNjY2UzZDdhZTc0ZWRhMjhkNWRlYmY5ZTdi
11
+ M2I5NzJhMjY2OTMyYTg3NDYyZTFiYWQzYTQ3MjhiZDg5NjMxYjA=
12
+ data.tar.gz: !binary |-
13
+ MGNhMDEwMTM5Y2Q3YmNiODcxMTU5NzI3MjU5MTZkYjY4YWI1YmZmNWZhMzA0
14
+ MzhjMWY0ZjExZjg3MTdlNTBiMjJjMGVjYjhhZjk5MGIwOGYxMDBhOWU1MzEz
15
+ ZDUwNWNmOGU4YzEyNmI0NjY0MzM4OTEwYzgzNjJiOTVhMTQzMGI=
data/.gitignore ADDED
@@ -0,0 +1,10 @@
1
+ .rvmrc
2
+ *.gem
3
+ .DS_Store
4
+ .bundle
5
+ doc/*
6
+ log/*
7
+ pkg/*
8
+ tags
9
+ tmp
10
+ .yardoc/*
data/.rvmrc.example ADDED
@@ -0,0 +1 @@
1
+ rvm use 1.9.3@assembly-image --create
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ source "http://rubygems.org"
2
+ source "http://sul-gems.stanford.edu"
3
+
4
+ # Specify your gem's dependencies in revs-utils.gemspec
5
+ gemspec
data/Gemfile.lock ADDED
@@ -0,0 +1,75 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ revs-utils (1.0.8)
5
+ actionpack (~> 3)
6
+ countries (= 0.9.2)
7
+ rdf
8
+
9
+ GEM
10
+ remote: http://rubygems.org/
11
+ remote: http://sul-gems.stanford.edu/
12
+ specs:
13
+ actionpack (3.2.19)
14
+ activemodel (= 3.2.19)
15
+ activesupport (= 3.2.19)
16
+ builder (~> 3.0.0)
17
+ erubis (~> 2.7.0)
18
+ journey (~> 1.0.4)
19
+ rack (~> 1.4.5)
20
+ rack-cache (~> 1.2)
21
+ rack-test (~> 0.6.1)
22
+ sprockets (~> 2.2.1)
23
+ activemodel (3.2.19)
24
+ activesupport (= 3.2.19)
25
+ builder (~> 3.0.0)
26
+ activesupport (3.2.19)
27
+ i18n (~> 0.6, >= 0.6.4)
28
+ multi_json (~> 1.0)
29
+ builder (3.0.4)
30
+ countries (0.9.2)
31
+ currencies (>= 0.4.0)
32
+ currencies (0.4.2)
33
+ diff-lcs (1.2.4)
34
+ erubis (2.7.0)
35
+ hike (1.2.3)
36
+ i18n (0.6.11)
37
+ journey (1.0.4)
38
+ lyberteam-gems-devel (1.0.1)
39
+ rake (>= 0.8.7)
40
+ rest-client
41
+ mime-types (2.0)
42
+ multi_json (1.10.1)
43
+ rack (1.4.5)
44
+ rack-cache (1.2)
45
+ rack (>= 0.4)
46
+ rack-test (0.6.2)
47
+ rack (>= 1.0)
48
+ rake (10.1.0)
49
+ rdf (1.1.4.1)
50
+ rest-client (1.6.7)
51
+ mime-types (>= 1.16)
52
+ rspec (2.14.1)
53
+ rspec-core (~> 2.14.0)
54
+ rspec-expectations (~> 2.14.0)
55
+ rspec-mocks (~> 2.14.0)
56
+ rspec-core (2.14.7)
57
+ rspec-expectations (2.14.3)
58
+ diff-lcs (>= 1.1.3, < 2.0)
59
+ rspec-mocks (2.14.4)
60
+ sprockets (2.2.2)
61
+ hike (~> 1.2)
62
+ multi_json (~> 1.0)
63
+ rack (~> 1.0)
64
+ tilt (~> 1.1, != 1.3.0)
65
+ tilt (1.4.1)
66
+ yard (0.8.7.3)
67
+
68
+ PLATFORMS
69
+ ruby
70
+
71
+ DEPENDENCIES
72
+ lyberteam-gems-devel (> 1.0.0)
73
+ revs-utils!
74
+ rspec (~> 2.6)
75
+ yard
data/LICENSE ADDED
@@ -0,0 +1,14 @@
1
+ #############################################################################################################
2
+ # Copyright (c) 2013-2014 by The Board of Trustees of the Leland Stanford Junior University. All rights reserved.
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
data/README.rdoc ADDED
@@ -0,0 +1,54 @@
1
+ = Revs::Utils
2
+
3
+ Shared methods and functions used by revs-indexer, pre-assembly and bulk metadata loading code.
4
+
5
+ == Releases
6
+ - <b>0.0.1</b> Initial release
7
+ - <b>0.0.3</b> Add collection name cleaning method
8
+ - <b>0.0.5</b> Lock down the version of countries gem to avoid problems
9
+ - <b>0.0.5</b> Lock down the version of countries gem to avoid problems
10
+ - <b>0.0.7</b> Don't use this version, it uses the wrong method of Dir.pwd to find the root directory for loading assets.
11
+ - <b>0.0.8</b> Add in helper functions to check the .csv files for registration and metadata updates
12
+ - <b>0.0.9</b> Add in a clean marque function
13
+ - <b>1.0.0</b> Make format fixing case insensitive; add a method for loading CSV files with UTF-8 compliance
14
+ - <b>1.0.1</b> Remove a couple methods from Revs code and update the methods to make them consistent in gem
15
+ - <b>1.0.2 and 1.0.3</b> Make invalid two digit years in dates return as false
16
+ - <b>1.0.4</b> Revs-Utils now assumes .csv files are in UTF-8 format instead of Latin-1
17
+ - <b>1.0.5</b> Parse location using commas as well as pipes
18
+ - <b>1.0.6</b> Add some more conditions to CSV header checks
19
+ - <b>1.0.7</b> Label column needs to be there but does not need to have a value to register
20
+ - <b>1.0.8</b> Update clean_collection_name method to deal with other possible names
21
+
22
+ == Running tests
23
+
24
+ rake spec
25
+
26
+ == Release the gem to the gemserver
27
+
28
+ 1. Bump the version number in lib/revs-utils/version.rb
29
+ 2. Add to the release notes in this readme.
30
+ 3. Ensure the tests pass.
31
+ 4. Git commit and push
32
+ 5. rake dlss_release
33
+
34
+ == Installation
35
+
36
+ Add this line to your application's Gemfile:
37
+
38
+ gem 'revs-utils'
39
+
40
+ And then execute:
41
+
42
+ $ bundle
43
+
44
+ Or install it yourself as:
45
+
46
+ $ gem install revs-utils
47
+
48
+ == Updating LC Automobile Terms in Gem
49
+
50
+ 1. Check out Gem code.
51
+ 2. CD into Gem directory
52
+ 3. ruby bin/revs_lc_automobile_terms.rb
53
+ 4. Update Gem in git, bump version number and rake dlss_release
54
+
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require "bundler/gem_tasks"
2
+
3
+ require 'dlss/rake/dlss_release'
4
+ Dlss::Release.new
5
+
6
+ require 'rspec/core/rake_task'
7
+
8
+ desc "Run specs"
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ task :default => :spec
data/bin/console ADDED
@@ -0,0 +1,16 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'rubygems'
4
+ require 'irb'
5
+
6
+ require File.expand_path(File.dirname(__FILE__) + '/../config/boot')
7
+
8
+
9
+ class RevsUtils
10
+
11
+ include Revs::Utils
12
+ extend Revs::Utils
13
+
14
+ end
15
+
16
+ IRB.start
@@ -0,0 +1,26 @@
1
+ # This file will generate a hash of LC more specific terms from the to-level term defined below (currently "Automobiles").
2
+ # It then dumps this hash to a file, so it can be loaded with each pre-assembly run and used when generating Revs Descriptive Metadata
3
+ # This method can be run periodically to refresh the list of terms. It will generate a new file in the "lib/pre_assembly/project" folder
4
+ # which can be updated in git.
5
+
6
+ # Peter Mangiafico
7
+ # May 16, 2013
8
+
9
+ require File.expand_path(File.dirname(__FILE__) + '/../config/boot')
10
+ require 'rdf'
11
+ require 'rdf/ntriples'
12
+
13
+ automobile_term='http://id.loc.gov/authorities/subjects/sh85010201' # the top-level LC term to get RDF for, "Automobiles"
14
+ term_predicate='http://www.w3.org/2004/02/skos/core#prefLabel' # the predicate which tells us when we have a term defined
15
+
16
+ results={} # the hash we will write with the terms and their LC URLs
17
+
18
+ RDF::Reader.open("#{automobile_term}.nt") do |reader|
19
+ reader.each_statement do |statement|
20
+ if statement.predicate.to_s.strip == term_predicate
21
+ results.merge!({statement.object.to_s=>statement.subject.to_s})
22
+ end
23
+ end
24
+ end
25
+
26
+ File.open(REVS_LC_TERMS_FILENAME, "wb") {|f| Marshal.dump(results, f)}
data/bin/run_all_tests ADDED
@@ -0,0 +1,3 @@
1
+ #! /bin/bash
2
+
3
+ bundle exec rspec spec
data/config/boot.rb ADDED
@@ -0,0 +1,6 @@
1
+ require 'rubygems'
2
+ project_root = File.expand_path(File.dirname(__FILE__) + '/..')
3
+ # Load config for current environment.
4
+ $LOAD_PATH.unshift(project_root + '/lib')
5
+ require 'revs-utils'
6
+
@@ -0,0 +1,34 @@
1
+ register:
2
+ label: label
3
+ sourceid: sourceid
4
+ filename: filename
5
+ metadata:
6
+ marque: marque
7
+ model: model
8
+ people: people
9
+ entrant: entrant
10
+ photographer: photographer
11
+ current_owner: current_owner
12
+ venue: venue
13
+ track: track
14
+ event: event
15
+ location: location
16
+ state: state
17
+ country: country
18
+ city: city
19
+ date: date
20
+ year: year
21
+ description: description
22
+ model_year: model_year
23
+ group_or_class: group_or_class
24
+ race_data: race_data
25
+ metadata_sources: metadata_sources
26
+ vehicle_markings: vehicle_markings
27
+ inst_notes: inst_notes
28
+ prod_notes: prod_notes
29
+ has_more_metadata: has_more_metadata
30
+ hide: hide
31
+ format: format
32
+ collection_name: collection_name
33
+
34
+
Binary file
@@ -0,0 +1,5 @@
1
+ module Revs
2
+ module Utils
3
+ VERSION = "1.0.8"
4
+ end
5
+ end
data/lib/revs-utils.rb ADDED
@@ -0,0 +1,299 @@
1
+ # encoding: UTF-8
2
+
3
+ require "revs-utils/version"
4
+ require "countries"
5
+ require 'active_support/core_ext/string'
6
+ require 'active_support/core_ext/hash'
7
+ require 'csv'
8
+
9
+ PROJECT_ROOT = File.expand_path(File.dirname(__FILE__) + '/..')
10
+
11
+
12
+ REVS_LC_TERMS_FILENAME=File.join(PROJECT_ROOT,'files','revs-lc-marque-terms.obj')
13
+ REVS_MANIFEST_HEADERS_FILEPATH = File.join(PROJECT_ROOT,'config',"manifest_headers.yml")
14
+ REGISTER = "register"
15
+ METADATA = "metadata"
16
+
17
+
18
+ module Revs
19
+ module Utils
20
+
21
+
22
+ # a hash of LC Subject Heading terms and their IDs for linking for "Automobiles" http://id.loc.gov/authorities/subjects/sh85010201.html
23
+ # this is cached and loaded from disk and deserialized back into a hash for performance reasons, then stored as a module
24
+ # level constant so it can be reused throughout the pre-assembly run as a constant
25
+ # This cached set of terms can be re-generated with "ruby devel/revs_lc_automobile_terms.rb"
26
+ AUTOMOBILE_LC_TERMS= File.open(REVS_LC_TERMS_FILENAME,'rb'){|io| Marshal.load(io)} if File.exists?(REVS_LC_TERMS_FILENAME)
27
+ REVS_MANIFEST_HEADERS_FILE = File.open(REVS_MANIFEST_HEADERS_FILEPATH)
28
+ REVS_MANIFEST_HEADERS = YAML.load( REVS_MANIFEST_HEADERS_FILE)
29
+
30
+
31
+ def get_manifest_section(section)
32
+ return REVS_MANIFEST_HEADERS[section]
33
+ end
34
+
35
+ def manifest_headers_file()
36
+ return REVS_MANIFEST_HEADERS_FILE
37
+ end
38
+
39
+ def manifest_headers_path()
40
+ return MAINFEST_HEADERS_FILEPATH
41
+ end
42
+
43
+ def manifest_register_section_name()
44
+ return REGISTER
45
+ end
46
+
47
+ def manifest_metadata_section_name()
48
+ return METADATA
49
+ end
50
+
51
+ def read_csv_with_headers(file)
52
+ # load CSV into an array of hashes, allowing UTF-8 to pass through, deleting blank columns
53
+ #file_contents = IO.read(file).force_encoding("ISO-8859-1").encode("utf-8", replace: nil)
54
+ file_contents = IO.read(file)
55
+ csv = CSV.parse(file_contents, :headers => true)
56
+ return csv.map { |row| row.to_hash.with_indifferent_access }
57
+ end
58
+
59
+ #Pass this function a list of all CSVs containing metadata for files you are about to register and it will ensure each sourceid is unique
60
+ def unique_source_ids(file_paths)
61
+ files = Array.new
62
+ file_paths.each do |fp|
63
+ files << read_csv_with_headers(fp)
64
+ end
65
+
66
+ sources = Array.new
67
+ files.each do |file|
68
+ file.each do |row|
69
+ #Make sure the sourcid and filename are the same
70
+ fname = row[get_manifest_section(REGISTER)['filename']].chomp(File.extname(row[get_manifest_section(REGISTER)['filename']]))
71
+ return false if row[get_manifest_section(REGISTER)['sourceid']] != fname
72
+ sources << row[get_manifest_section(REGISTER)['sourceid']]
73
+ end
74
+
75
+
76
+
77
+ end
78
+ return sources.uniq.size == sources.size
79
+
80
+ end
81
+
82
+
83
+ #Pass this function a CSV file and it will return true if the proper headers are there and each entry has the required fields filled in
84
+ def valid_to_register(file_path)
85
+
86
+ file = read_csv_with_headers(file_path)
87
+ #Make sure all the required headers are there
88
+ return false if not get_manifest_section(REGISTER).values-file[0].keys == []
89
+
90
+ #Make sure all files have entries for those required headers
91
+ file.each do |row|
92
+ get_manifest_section(REGISTER).keys.each do |header| # label should be there as a column but does not always need a value
93
+ return false if header.downcase !='label' && row[header].blank? #Alternatively consider row[header].class != String or row[header].size <= 0
94
+ end
95
+ end
96
+ return true
97
+ end
98
+
99
+ #Pass this function a CSV file and it will return true if the proper headers are there and each entry has the required fields filled in.
100
+ def valid_for_metadata(file_path)
101
+ file = read_csv_with_headers(file_path)
102
+ file_headers=file[0].keys
103
+ #The file doesn't need to have all the metadata values, it just can't have headers that aren't used for metadata or registration
104
+ if file_headers.include?('date') && file_headers.include?('year') # can't have both date and year
105
+ return false
106
+ elsif file_headers.include?('location') && file_headers.include?('state') && file_headers.include?('city') && file_headers.include?('country') # can't have both location and the specific fields
107
+ return false
108
+ else
109
+ return file_headers-get_manifest_section(METADATA).values-get_manifest_section(REGISTER).values == []
110
+ end
111
+ end
112
+
113
+ def clean_collection_name(name)
114
+ return "" if name.blank? || name.nil?
115
+ name=name.to_s
116
+ name.gsub!(/\A(the )/i,'')
117
+ name.gsub!(/( of the revs institute)\z/i,'')
118
+ name.gsub!(/( of the revs institute for automotive research)\z/i,'')
119
+ name.gsub!(/( of the revs institute for automotive research, inc)\z/i,'')
120
+ name.gsub!(/( of the revs institute for automotive research, inc.)\z/i,'')
121
+ return name.strip
122
+ end
123
+
124
+ def clean_marque_name(name)
125
+ return "" if name.blank? || name.nil?
126
+ name=name.to_s
127
+ name.gsub!(/(automobiles)\z/i,'')
128
+ name.gsub!(/(automobile)\z/i,'')
129
+ return name.strip
130
+ end
131
+
132
+ def parse_location(row, location)
133
+ row[location].split(/[,|]/).reverse.each do |local|
134
+ country = revs_get_country(local)
135
+ city_state = revs_get_city_state(local)
136
+ row['country'] = country.strip if country
137
+ if city_state
138
+ row['state'] = revs_get_state_name(city_state[1].strip)
139
+ row['city'] = city_state[0].strip
140
+ end
141
+ if not city_state and not country
142
+ row['city_section'] = local
143
+ end
144
+ end
145
+
146
+ return row
147
+ end
148
+
149
+ def revs_check_format(format)
150
+ return revs_check_formats([format]).first
151
+ end
152
+
153
+ # check the incoming format and fix some common issues
154
+ def revs_check_formats(format)
155
+ known_fixes = {"black-and-white negative"=>"black-and-white negatives",
156
+ "color negative"=>"color negatives",
157
+ "slides/color transparency"=>"color transparencies",
158
+ "color negatives/slides"=>"color negatives",
159
+ "black-and-white negative strips"=>"black-and-white negatives",
160
+ "color transparency"=>"color transparencies",
161
+ "slide"=>"slides"
162
+ }
163
+ count = 0
164
+ format.each do |f|
165
+ format[count] = known_fixes[f.downcase] || f.downcase
166
+ count += 1
167
+ end
168
+ return format
169
+ end
170
+
171
+ # lookup the marque sent to see if it matches any known LC terms, trying a few varieties; returns a hash of the term and its ID if match is found, else returns false
172
+ def revs_lookup_marque(marque)
173
+ result=false
174
+ variants1=[marque,marque.capitalize,marque.singularize,marque.pluralize,marque.capitalize.singularize,marque.capitalize.pluralize]
175
+ variants2=[]
176
+ variants1.each do |name|
177
+ variants2 << "#{name} automobile"
178
+ variants2 << "#{name} automobiles"
179
+ end
180
+ (variants1+variants2).each do |variant|
181
+ lookup_term=AUTOMOBILE_LC_TERMS[variant]
182
+ if lookup_term
183
+ result={'url'=>lookup_term,'value'=>variant}
184
+ break
185
+ end
186
+ end
187
+ return result
188
+ end # revs_lookup_marque
189
+
190
+ # check if the string passed is a country name or code -- if so, return the country name, if not a recognized country, return false
191
+ def revs_get_country(name)
192
+ name='US' if name=='USA' # special case; USA is not recognized by the country gem, but US is
193
+ country=Country.find_country_by_name(name.strip) # find it by name
194
+ code=Country.new(name.strip) # find it by code
195
+ if country.nil? && code.data.nil?
196
+ return false
197
+ else
198
+ return (code.data.nil? ? country.name : code.name)
199
+ end
200
+ end # revs_get_country
201
+
202
+ # parse a string like this: "San Mateo (Calif.)" to try and figure out if there is any state in there; if found, return the city and state as an array, if none found, return false
203
+ def revs_get_city_state(name)
204
+ state_match=name.match(/[(]\S+[)]/)
205
+ if state_match.nil?
206
+ return false
207
+ else
208
+ first_match=state_match[0]
209
+ state=first_match.gsub(/[()]/,'').strip # remove parens and strip
210
+ city=name.gsub(first_match,'').strip # remove state name from input string and strip
211
+ return [city,state]
212
+ end
213
+ end # revs_get_city_state
214
+
215
+ # given an abbreviated state name (e.g. "Calif." or "CA") return the full state name (e.g. "California")
216
+ def revs_get_state_name(name)
217
+ test_name=name.gsub('.','').strip.downcase
218
+ us=Country.new('US')
219
+ us.states.each do |key,value|
220
+ if value['name'].downcase.start_with?(test_name) || key.downcase == test_name
221
+ return value['name']
222
+ break
223
+ end
224
+ end
225
+ return name
226
+ end # revs_get_state_name
227
+
228
+
229
+ # tell us if the string passed is a valid year
230
+ def is_valid_year?(date_string,starting_year=1800)
231
+ date_string.to_s.strip.scan(/\D/).empty? and (starting_year..Date.today.year).include?(date_string.to_i)
232
+ end
233
+
234
+ # tell us if the string passed is in is a full date of the format M/D/YYYY, and returns the date object if it is valid
235
+ def get_full_date(date_string)
236
+ begin
237
+ date_obj=Date.strptime(date_string.gsub('-','/').delete(' '), '%m/%d/%Y')
238
+ return (is_valid_year?(date_obj.year.to_s) ? date_obj : false)
239
+ rescue
240
+ false
241
+ end
242
+ end
243
+
244
+ # given a string with dates separated by commas, split into an array
245
+ # also, parse dates like "195x" and "1961-62" into all dates in that range
246
+ def parse_years(date_string)
247
+ date_string.delete!(' ')
248
+ if date_string.include?('|')
249
+ result=date_string.split('|')
250
+ else
251
+ result=date_string.split(',')
252
+ end
253
+ years_to_add=[]
254
+ result.each do |year|
255
+
256
+ if year.scan(/[1-2][0-9][0-9][0-9][-][0-9][0-9]/).size > 0 # if we have a year that looks like "1961-62" or "1961-73", lets deal with it turning it into [1961,1962] or [1961,1962,1963,1964,1965,1966,1967...etc]
257
+ start_year=year[2..3]
258
+ end_year=year[5..6]
259
+ stem=year[0..1]
260
+ for n in start_year..end_year
261
+ years_to_add << "#{stem}#{n}"
262
+ end
263
+ elsif year.scan(/[1-2][0-9][0-9][0-9][-][1-9]/).size > 0 # if we have a year that lloks like "1961-2" or "1961-3", lets deal with it turning it into [1961,1962] or [1961,1962,1963]
264
+ start_year=year[3..3]
265
+ end_year=year[5..5]
266
+ stem=year[0..2]
267
+ for n in start_year..end_year
268
+ years_to_add << "#{stem}#{n}"
269
+ end
270
+ end
271
+
272
+ if year.scan(/[1-2][0-9][0-9][0](('s)|s)/).size > 0 || year.scan(/[1-2][0-9][0-9][x_]/).size > 0 # if we have a year that looks like "195x", let's deal with it by turning it into [1950,1951,1952..etc]
273
+ result.delete(year) # first delete the year itself from the list
274
+ stem=year[0..2] # next get the stem, and expand into the whole decade
275
+ %w{0 1 2 3 4 5 6 7 8 9}.each {|n| years_to_add << "#{stem}#{n}"} # add each year in that decade to the output array
276
+ end
277
+
278
+ if year.scan(/[1-2][0-9][0-9][0-9][-][1-2][0-9][0-9][0-9]/).size > 0 # if we have a year that lloks like "1961-1962" or "1930-1955", lets deal with it turning it into [1961,1962] or [1961,1962,1963]
279
+ start_year=year[0..3]
280
+ end_year=year[5..8]
281
+ if end_year.to_i - start_year.to_i < 10 # let's only do the expansion if we don't have some really large date range, like "1930-1985" .. only ranges less than 9 years will be split into separate years
282
+ for n in start_year..end_year
283
+ years_to_add << n
284
+ end
285
+ end
286
+ end
287
+
288
+ end
289
+
290
+ result = result.uniq
291
+ result.each do |year|
292
+ result.delete(year) if not year.scan(/\A[1-2][0-9][0-9][0-9]\z/).size == 1 #If it doesn't fit the format #### remove it
293
+ end
294
+ return result.concat(years_to_add).uniq.sort
295
+
296
+ end
297
+
298
+ end
299
+ end
@@ -0,0 +1,28 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'revs-utils/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "revs-utils"
8
+ gem.version = Revs::Utils::VERSION
9
+ gem.authors = ["Peter Mangiafico"]
10
+ gem.email = ["pmangiafico@stanford.edu"]
11
+ gem.description = "Shared methods and functions used by revs-indexer, pre-assembly and bulk metadata loading code."
12
+ gem.summary = "Shared methods and functions used by revs-indexer, pre-assembly and bulk metadata loading code."
13
+ gem.homepage = ""
14
+
15
+ gem.files = `git ls-files`.split($/)
16
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
17
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
18
+ gem.require_paths = ["lib"]
19
+
20
+ gem.add_dependency "countries", "0.9.2"
21
+ gem.add_dependency "rdf"
22
+ gem.add_dependency "actionpack", '~> 3'
23
+
24
+ gem.add_development_dependency "rspec", "~> 2.6"
25
+ gem.add_development_dependency "lyberteam-gems-devel", "> 1.0.0"
26
+ gem.add_development_dependency "yard"
27
+
28
+ end