rialto-etl 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ce6dc39a28a8eaf343077ff27d0f8c2db190cdde
4
+ data.tar.gz: 0b0d5f057a895517ddd28948f474938b2bec9684
5
+ SHA512:
6
+ metadata.gz: da68daa6efc58935ab2506d66a0331dd07806185d763f9eaa907df4280d349d6216264205a1c3e37da501f90a6cbbf11d1be819c08485875521c85f96f5fb417
7
+ data.tar.gz: 11d1b2a16c38e672a313f98caae41b1f0e43099062fd10af0ae2082d70d17b03974159cebd43d141d7bd43b94694f67ae11bbfa53800501692a6f9cd71fb3b63
@@ -0,0 +1,9 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,8 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 2.3
5
+
6
+ Style/MixinUsage:
7
+ Exclude:
8
+ - lib/rialto/etl/configs/stanford_organizations.rb
@@ -0,0 +1,13 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2017-12-19 16:17:32 -0800 using RuboCop version 0.52.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 15
10
+ # Configuration parameters: AllowHeredoc, AllowURI, URISchemes, IgnoreCopDirectives, IgnoredPatterns.
11
+ # URISchemes: http, https
12
+ Metrics/LineLength:
13
+ Max: 125
@@ -0,0 +1,8 @@
1
+ language: ruby
2
+ sudo: false
3
+ dist: trusty
4
+ cache:
5
+ bundler: true
6
+ rvm:
7
+ - 2.4.2
8
+ before_install: gem install bundler
data/Gemfile ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ source 'https://rubygems.org'
4
+
5
+ # Specify your gem's dependencies in rialto-etl.gemspec
6
+ gemspec
7
+
8
+ gem 'pry'
9
+ gem 'pry-byebug'
@@ -0,0 +1,64 @@
1
+ # Rialto::Etl
2
+
3
+ [![Build Status](https://travis-ci.org/sul-dlss-labs/rialto-etl.svg?branch=master)](https://travis-ci.org/sul-dlss-labs/rialto-etl)
4
+
5
+ Rialto::Etl is a set of ETL tools for RIALTO, Stanford University Libraries' research intelligence project
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'rialto-etl'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install rialto-etl
22
+
23
+ ## Usage
24
+
25
+ ### Extract
26
+
27
+ Run `bin/extract` to run a named extractor and print output to STDOUT:
28
+
29
+ $ bin/extract -s StanfordResearchers
30
+ {"count":10,"firstPage":true,"lastPage":false,"page":1,"totalCount":29089,"totalPages":2909,"values":[{"administrativeAppointments":[...
31
+
32
+ Note: if you need to run any of the extractors that inherit from `AbstractStanfordExtractor`, you will first need to obtain a token for the CAP API and set the `CAP_TOKEN` environment variable in your session.
33
+
34
+ ### Transform
35
+
36
+ Run `bin/transform` to run a named transformer, based on [Traject](https://github.com/traject/traject), on a named input file and print output to STDOUT:
37
+
38
+ $ bin/transform -s StanfordOrganizationsToVivo -i stanford_organizations.json
39
+ {"@id":"http://authorities.stanford.edu/orgs#vice-provost-for-undergraduate-education/stanford-introductory-studies/freshman-and-sophomore-programs","@type":"http://vivoweb.org/ontology/core#Division","rdfs:label":"Freshman and Sophomore Programs","vivo:abbreviation":["FFQH"]}
40
+
41
+ ### Load
42
+
43
+ TBD
44
+
45
+ ## Help
46
+
47
+ $ bin/extract -h
48
+ Usage: bin/extract [options]
49
+ -n, --name NAME Name of the extractor to run (REQUIRED)
50
+
51
+ $ bin/transform -h
52
+ Usage: bin/transform [options]
53
+ -n, --name NAME Name of the transformer to run (REQUIRED)
54
+ -i, --input-file FILENAME Name of file holding data to be transformed (REQUIRED)
55
+
56
+ ## Development
57
+
58
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
59
+
60
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
61
+
62
+ ## Contributing
63
+
64
+ Bug reports and pull requests are welcome on GitHub at https://github.com/sul-dlss-labs/rialto-etl.
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+ require 'rubocop/rake_task'
6
+
7
+ desc 'Run style checker'
8
+ RuboCop::RakeTask.new(:rubocop) do |task|
9
+ task.fail_on_error = true
10
+ end
11
+
12
+ RSpec::Core::RakeTask.new(:spec)
13
+
14
+ task ci: [:rubocop] do
15
+ Rake::Task['spec'].invoke
16
+ end
17
+
18
+ task default: :ci
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'rialto/etl'
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require 'irb'
15
+ IRB.start
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'optparse'
6
+ require 'rialto/etl'
7
+
8
+ options = {}
9
+
10
+ OptionParser.new do |parser|
11
+ parser.banner = 'Usage: bin/extract [options]'
12
+ parser.on('-n', '--name NAME', 'Name of the extractor to run (REQUIRED)') do |value|
13
+ options[:name] = value
14
+ end
15
+ end.parse!
16
+
17
+ raise OptionParser::MissingArgument, '-n NAME' unless options[:name]
18
+
19
+ puts Rialto::Etl::Extractors.const_get(options[:name]).new.extract
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'bundler/setup'
5
+ require 'optparse'
6
+ require 'rialto/etl'
7
+
8
+ options = {}
9
+
10
+ OptionParser.new do |parser|
11
+ parser.banner = 'Usage: bin/transform [options]'
12
+ parser.on('-n', '--name NAME', 'Name of the transformer to run (REQUIRED)') do |value|
13
+ options[:name] = value
14
+ end
15
+ parser.on('-i', '--input-file FILENAME', 'Name of file holding data to be transformed (REQUIRED)') do |value|
16
+ options[:input] = value
17
+ end
18
+ end.parse!
19
+
20
+ raise OptionParser::MissingArgument, '-n NAME' unless options[:name]
21
+ raise OptionParser::MissingArgument, '-i FILENAME' unless options[:input]
22
+
23
+ Rialto::Etl::Transformers.const_get(options[:name]).new(input: options[:input]).transform
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rialto/etl/version'
4
+ require 'rialto/etl/extractors'
5
+ require 'rialto/etl/transformers'
6
+
7
+ module Rialto
8
+ # The top-level Rialto::Etl module
9
+ module Etl
10
+ end
11
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ extend TrajectPlus::Macros
4
+ extend TrajectPlus::Macros::JSON
5
+
6
+ settings do
7
+ provide 'writer_class_name', 'JsonWriter'
8
+ provide 'reader_class_name', 'Rialto::Etl::StanfordOrganizationsJsonReader'
9
+ end
10
+
11
+ # context_object = {
12
+ # '@context' => {
13
+ # obo: 'http://purl.obolibrary.org/obo/',
14
+ # rdfs: 'http://www.w3.org/2000/01/rdf-schema#',
15
+ # vcard: 'http://www.w3.org/2006/vcard/ns#',
16
+ # vivo: 'http://vivoweb.org/ontology/core#',
17
+ # stanford: 'http://authorities.stanford.edu/orgs#'
18
+ # }
19
+ # }
20
+
21
+ # puts context_object.to_json
22
+ to_field '@id', extract_json('$.alias'), transform: transform(prepend: 'http://authorities.stanford.edu/orgs#'), single: true
23
+ to_field '@type', extract_json('$.type', translation_map: 'stanford_organizations_to_vivo_types'), single: true
24
+ to_field 'rdfs:label', extract_json('$.name'), single: true
25
+ to_field 'rdfs:seeAlso', extract_json('$.url'), single: true
26
+ to_field 'vivo:abbreviation', extract_json('$.orgCodes'), single: true
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rialto/etl/extractors/stanford_researchers'
4
+ require 'rialto/etl/extractors/stanford_organizations'
5
+
6
+ module Rialto
7
+ module Etl
8
+ # A module to hold extractors
9
+ module Extractors
10
+ end
11
+ end
12
+ end
@@ -0,0 +1,86 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'faraday'
4
+ require 'openssl'
5
+ require 'base64'
6
+ require 'json'
7
+
8
+ module Rialto
9
+ module Etl
10
+ module Extractors
11
+ # Abstract class hitting Stanford APIs using Stanford authz
12
+ class AbstractStanfordExtractor
13
+ attr_reader :access_token_expiry_time
14
+
15
+ def extract
16
+ raise NotImplementedError, 'Implement #extract in a child class'
17
+ end
18
+
19
+ private
20
+
21
+ def client
22
+ connection(uri: 'https://api.stanford.edu').tap do |conn|
23
+ conn.headers['Authorization'] = access_token
24
+ end
25
+ end
26
+
27
+ def connection(uri:)
28
+ Faraday.new(uri, headers: connection_headers) do |connection|
29
+ connection.request :retry, max: 3, interval: 0.8, interval_randomness: 0.2, backoff_factor: 2
30
+ connection.ssl.update(verify: true, verify_mode: OpenSSL::SSL::VERIFY_PEER)
31
+ connection.use Faraday::Response::RaiseError
32
+ connection.adapter :httpclient
33
+ connection.options.timeout = 500
34
+ connection.options.open_timeout = 10
35
+ end
36
+ end
37
+
38
+ def connection_headers
39
+ {
40
+ accept: 'application/json',
41
+ content_type: 'application/json'
42
+ }
43
+ end
44
+
45
+ def access_token
46
+ reset_access_token! if token_expired?
47
+ @access_token ||= begin
48
+ response = auth_client.get '?grant_type=client_credentials'
49
+ raise 'Failed to authenticate' unless response.success?
50
+ auth_data = JSON.parse(response.body)
51
+ reset_expiry_time!(expires_in: auth_data['expires_in'])
52
+ "Bearer #{auth_data['access_token']}"
53
+ end
54
+ end
55
+
56
+ def reset_access_token!
57
+ @access_token = nil
58
+ end
59
+
60
+ def token_expired?
61
+ access_token_expiry_time < current_time
62
+ rescue NoMethodError
63
+ true
64
+ end
65
+
66
+ def reset_expiry_time!(expires_in:)
67
+ @access_token_expiry_time = current_time + expires_in.to_i
68
+ end
69
+
70
+ def current_time
71
+ Time.local(*Time.now).to_i
72
+ end
73
+
74
+ def auth_client
75
+ @auth_client ||= connection(uri: 'https://authz.stanford.edu/oauth/token').tap do |conn|
76
+ conn.headers['Authorization'] = "Basic #{auth_code}"
77
+ end
78
+ end
79
+
80
+ def auth_code
81
+ @auth_code ||= Base64.strict_encode64("sul:#{ENV['CAP_TOKEN']}")
82
+ end
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rialto/etl/extractors/abstract_stanford_extractor'
4
+
5
+ module Rialto
6
+ module Etl
7
+ module Extractors
8
+ # Stanford CAP API for orgs
9
+ class StanfordOrganizations < AbstractStanfordExtractor
10
+ def extract
11
+ client.get('/cap/v1/orgs/stanford?p=1&ps=10').body
12
+ rescue StandardError => exception
13
+ puts "Error: #{exception.message}"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rialto/etl/extractors/abstract_stanford_extractor'
4
+
5
+ module Rialto
6
+ module Etl
7
+ module Extractors
8
+ # Stanford Profiles API
9
+ class StanfordResearchers < AbstractStanfordExtractor
10
+ def extract
11
+ client.get('/profiles/v1?p=1&ps=10').body
12
+ rescue StandardError => exception
13
+ puts "Error: #{exception.message}"
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rialto
4
+ module Etl
5
+ # Read JSON that maps to Stanford orgs
6
+ class StanfordOrganizationsJsonReader < TrajectPlus::JsonReader
7
+ def each(&block)
8
+ yield_children(json, block)
9
+ end
10
+
11
+ private
12
+
13
+ def yield_children(hash, block)
14
+ block.call(hash)
15
+ children = children_path(hash)
16
+ return if children.blank?
17
+ children.each do |child|
18
+ yield_children(child, block)
19
+ end
20
+ end
21
+
22
+ def children_path(hash)
23
+ JsonPath.on(hash, '$.children').first
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rialto/etl/transformers/stanford_organizations_to_vivo'
4
+
5
+ module Rialto
6
+ module Etl
7
+ # A module to hold transformers
8
+ module Transformers
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'traject_plus'
4
+ require 'rialto/etl/stanford_organizations_json_reader'
5
+
6
+ module Rialto
7
+ module Etl
8
+ module Transformers
9
+ # Transformer turning Stanford org info into Vivo format
10
+ class StanfordOrganizationsToVivo
11
+ attr_reader :input
12
+
13
+ def initialize(input:)
14
+ @input = input
15
+ end
16
+
17
+ def transform
18
+ File.open(input, 'r') do |stream|
19
+ transformer.process(stream)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def transformer
26
+ @transformer ||= Traject::Indexer.new.tap do |indexer|
27
+ indexer.load_config_file('lib/rialto/etl/configs/stanford_organizations.rb')
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Rialto
4
+ module Etl
5
+ VERSION = '0.0.1'
6
+ end
7
+ end
@@ -0,0 +1,5 @@
1
+ DIVISION: 'http://vivoweb.org/ontology/core#Division'
2
+ SUB_DIVISION: 'http://vivoweb.org/ontology/core#Division'
3
+ ROOT: 'http://vivoweb.org/ontology/core#University'
4
+ SCHOOL: 'http://vivoweb.org/ontology/core#School'
5
+ DEPARTMENT: 'http://vivoweb.org/ontology/core#Department'
@@ -0,0 +1,22 @@
1
+ TODO: wrap below mappings in @graph => {}
2
+
3
+ each mapping should include: @id, @type, rdfs:label, one or more obo:BFO\_0000050 or obo:BFO\_0000051
4
+
5
+ alias (string) => @id http://authorities.stanford.edu/orgs#{alias}
6
+ browsable (boolean) => ignore
7
+ children (array) => keep track of parent, iterate over values (for each obo:BFO\_0000050/partOf) and map, keep track of children for obo:BFO\_0000051/hasPart
8
+ name (string) => rdfs:label
9
+ onboarding (boolean) => ignore
10
+ orgCodes (array) => vivo:abbreviation
11
+ type (string) => see type mappings
12
+ url (string) => rdfs:seeAlso
13
+
14
+ type mappings
15
+
16
+ DIVISION @type: http://vivoweb.org/ontology/core#Division
17
+ SUB_DIVISION @type: http://vivoweb.org/ontology/core#Division
18
+ ROOT @type: http://vivoweb.org/ontology/core#University
19
+ SCHOOL @type: http://vivoweb.org/ontology/core#School
20
+ DEPARTMENT @type: http://vivoweb.org/ontology/core#Department
21
+
22
+
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path('../lib', __FILE__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require 'rialto/etl/version'
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = 'rialto-etl'
9
+ spec.version = Rialto::Etl::VERSION
10
+ spec.authors = ['Michael J. Giarlo']
11
+ spec.email = ['mjgiarlo@stanford.edu']
12
+
13
+ spec.summary = "ETL tools for RIALTO, Stanford University Libraries' research intelligence project"
14
+ spec.homepage = 'https://github.com/sul-dlss-labs/rialto-etl'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
17
+ spec.bindir = 'exe'
18
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
19
+ spec.require_paths = ['lib']
20
+
21
+ spec.add_dependency 'faraday'
22
+ spec.add_dependency 'httpclient'
23
+ spec.add_dependency 'traject_plus', '>= 0.0.2'
24
+
25
+ spec.add_development_dependency 'bundler', '~> 1.11'
26
+ spec.add_development_dependency 'rake', '~> 10.0'
27
+ spec.add_development_dependency 'rspec', '~> 3.0'
28
+ spec.add_development_dependency 'rubocop', '~> 0.52.0'
29
+ end
metadata ADDED
@@ -0,0 +1,167 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rialto-etl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Michael J. Giarlo
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-12-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: httpclient
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: traject_plus
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: 0.0.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: 0.0.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.11'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.11'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: rubocop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: 0.52.0
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: 0.52.0
111
+ description:
112
+ email:
113
+ - mjgiarlo@stanford.edu
114
+ executables: []
115
+ extensions: []
116
+ extra_rdoc_files: []
117
+ files:
118
+ - ".gitignore"
119
+ - ".rspec"
120
+ - ".rubocop.yml"
121
+ - ".rubocop_todo.yml"
122
+ - ".travis.yml"
123
+ - Gemfile
124
+ - README.md
125
+ - Rakefile
126
+ - bin/console
127
+ - bin/extract
128
+ - bin/setup
129
+ - bin/transform
130
+ - lib/rialto/etl.rb
131
+ - lib/rialto/etl/configs/stanford_organizations.rb
132
+ - lib/rialto/etl/extractors.rb
133
+ - lib/rialto/etl/extractors/abstract_stanford_extractor.rb
134
+ - lib/rialto/etl/extractors/stanford_organizations.rb
135
+ - lib/rialto/etl/extractors/stanford_researchers.rb
136
+ - lib/rialto/etl/stanford_organizations_json_reader.rb
137
+ - lib/rialto/etl/transformers.rb
138
+ - lib/rialto/etl/transformers/stanford_organizations_to_vivo.rb
139
+ - lib/rialto/etl/version.rb
140
+ - lib/translation_maps/stanford_organizations_to_vivo_types.yaml
141
+ - mapping.md
142
+ - rialto-etl.gemspec
143
+ homepage: https://github.com/sul-dlss-labs/rialto-etl
144
+ licenses: []
145
+ metadata: {}
146
+ post_install_message:
147
+ rdoc_options: []
148
+ require_paths:
149
+ - lib
150
+ required_ruby_version: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - ">="
153
+ - !ruby/object:Gem::Version
154
+ version: '0'
155
+ required_rubygems_version: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ requirements: []
161
+ rubyforge_project:
162
+ rubygems_version: 2.6.13
163
+ signing_key:
164
+ specification_version: 4
165
+ summary: ETL tools for RIALTO, Stanford University Libraries' research intelligence
166
+ project
167
+ test_files: []