institutions 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/.travis.yml +9 -0
- data/Gemfile +2 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +23 -0
- data/Rakefile +53 -0
- data/institutions.gemspec +24 -0
- data/lib/institutions/institution/auth.rb +6 -0
- data/lib/institutions/institution/core.rb +52 -0
- data/lib/institutions/institution/ip_addresses.rb +39 -0
- data/lib/institutions/institution/merge.rb +85 -0
- data/lib/institutions/institution/mvc.rb +6 -0
- data/lib/institutions/institution/parents.rb +15 -0
- data/lib/institutions/institution/services.rb +6 -0
- data/lib/institutions/institution/util.rb +65 -0
- data/lib/institutions/institution.rb +29 -0
- data/lib/institutions/version.rb +3 -0
- data/lib/institutions.rb +99 -0
- data/test/config/institutions.yml +89 -0
- data/test/config/overwrite.yml +4 -0
- data/test/institution/auth_test.rb +7 -0
- data/test/institution/core_test.rb +34 -0
- data/test/institution/ip_addresses_test.rb +21 -0
- data/test/institution/merge_test.rb +34 -0
- data/test/institution/mvc_test.rb +7 -0
- data/test/institution/parents_test.rb +13 -0
- data/test/institution/services_test.rb +7 -0
- data/test/institution/util_test.rb +13 -0
- data/test/institution_test.rb +7 -0
- data/test/institutions_test.rb +36 -0
- data/test/test_helper.rb +3 -0
- metadata +175 -0
data/.gitignore
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
Gemfile.lock
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2012 Scot Dalton
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.rdoc
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
= Institutions
|
2
|
+
{<img src="https://secure.travis-ci.org/scotdalton/institutions.png?branch=master" alt="Build Status" />}[https://travis-ci.org/scotdalton/institutions]
|
3
|
+
{<img src="https://gemnasium.com/scotdalton/institutions.png" alt="Dependency Status" />}[https://gemnasium.com/scotdalton/institutions]
|
4
|
+
{<img src="https://codeclimate.com/badge.png" alt="Code Climage" />}[https://codeclimate.com/github/scotdalton/institutions]
|
5
|
+
|
6
|
+
This gem provides a mechanism for creating Institutions from a hash of Institutional data elements.
|
7
|
+
|
8
|
+
== Institutions Basics
|
9
|
+
=== Getting institutions
|
10
|
+
Institutions reads in YAML files and creates a Hash of Institution instances
|
11
|
+
with the Institution#code as the Hash key.
|
12
|
+
require 'institutions'
|
13
|
+
institutions = Institutions.institutions
|
14
|
+
|
15
|
+
=== Setting load paths
|
16
|
+
Specify additional directories to search for institutional YAMLs.
|
17
|
+
require 'institutions'
|
18
|
+
Institutions.loadpaths << File.join("path", "to", "new", "load", "directory")
|
19
|
+
|
20
|
+
=== Setting file name
|
21
|
+
Specify additional YAML file names that contain institutions.
|
22
|
+
require 'institutions'
|
23
|
+
Institutions.filenames << "my_institution.yml"
|
data/Rakefile
ADDED
@@ -0,0 +1,53 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
begin
|
3
|
+
require 'bundler/setup'
|
4
|
+
rescue LoadError
|
5
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
6
|
+
end
|
7
|
+
begin
|
8
|
+
require 'rdoc/task'
|
9
|
+
rescue LoadError
|
10
|
+
require 'rdoc/rdoc'
|
11
|
+
require 'rake/rdoctask'
|
12
|
+
RDoc::Task = Rake::RDocTask
|
13
|
+
end
|
14
|
+
|
15
|
+
require 'rake/testtask'
|
16
|
+
require 'git'
|
17
|
+
require 'fileutils'
|
18
|
+
|
19
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
20
|
+
rdoc.rdoc_dir = 'rdoc'
|
21
|
+
rdoc.title = 'Institutions'
|
22
|
+
rdoc.options << '--line-numbers'
|
23
|
+
rdoc.main = "README.rdoc"
|
24
|
+
rdoc.rdoc_files.include('README.rdoc')
|
25
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
26
|
+
end
|
27
|
+
|
28
|
+
Bundler::GemHelper.install_tasks
|
29
|
+
|
30
|
+
require 'rake/testtask'
|
31
|
+
Rake::TestTask.new(:test) do |t|
|
32
|
+
t.libs << 'lib'
|
33
|
+
t.libs << 'test'
|
34
|
+
t.pattern = 'test/**/*_test.rb'
|
35
|
+
t.verbose = false
|
36
|
+
end
|
37
|
+
|
38
|
+
desc "Push latest RDocs to gh-pages."
|
39
|
+
task :ghpages => [:rerdoc] do
|
40
|
+
g = Git.open(Dir.pwd)
|
41
|
+
g.checkout(g.branch('gh-pages'))
|
42
|
+
g.pull("origin", "gh-pages")
|
43
|
+
FileUtils.rm_r("rdocs", :force => true)
|
44
|
+
Dir.mkdir("rdocs")
|
45
|
+
FileUtils.mv(Dir.glob("html/*"), "./rdocs", :force => true)
|
46
|
+
FileUtils.rm_r("html", :force => true)
|
47
|
+
g.add(".")
|
48
|
+
g.commit_all("Update gh-pages.")
|
49
|
+
g.push("origin", "gh-pages")
|
50
|
+
g.checkout(g.branch('master'))
|
51
|
+
end
|
52
|
+
|
53
|
+
task :default => :test
|
@@ -0,0 +1,24 @@
|
|
1
|
+
$:.push File.expand_path("../lib", __FILE__)
|
2
|
+
|
3
|
+
# Maintain your gem's version:
|
4
|
+
require "institutions/version"
|
5
|
+
|
6
|
+
# Describe your gem and declare its dependencies:
|
7
|
+
Gem::Specification.new do |s|
|
8
|
+
s.name = "institutions"
|
9
|
+
s.version = Institutions::VERSION
|
10
|
+
s.authors = ["Scot Dalton"]
|
11
|
+
s.email = ["scotdalton@gmail.com"]
|
12
|
+
s.homepage = "https://github.com/scotdalton/institutions"
|
13
|
+
s.summary = "Abstract mechanism for setting up Institutions (whatever that means)."
|
14
|
+
s.description = "Abstract mechanism for setting up Institutions with arbitrary data elements."
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split($\)
|
17
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
18
|
+
|
19
|
+
s.add_dependency "require_all", "~> 1.2.1"
|
20
|
+
s.add_dependency "ipaddr_range_set", "~> 0.9.1"
|
21
|
+
s.add_dependency "git", "~> 1.2.5"
|
22
|
+
s.add_dependency "rdoc"
|
23
|
+
s.add_dependency "rake"
|
24
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Institutions#:no_doc
|
2
|
+
module Core#:no_doc
|
3
|
+
# Required attributes
|
4
|
+
attr_reader :code, :name
|
5
|
+
alias :display_name :name
|
6
|
+
|
7
|
+
# Optional core attributes
|
8
|
+
attr_reader :default
|
9
|
+
alias :default? :default
|
10
|
+
|
11
|
+
#
|
12
|
+
# Creates a new Institution object from the given code, name and hash.
|
13
|
+
#
|
14
|
+
# The optional +hash+, if given, will generate additional attributes and values.
|
15
|
+
#
|
16
|
+
#
|
17
|
+
# For example:
|
18
|
+
#
|
19
|
+
# require 'institutions'
|
20
|
+
# hash = { "attribute1" => "My first attribute.", :array_attribute => [1, 2] }
|
21
|
+
# institution = Institutions::Institution.new("my_inst", "My Institution", hash)
|
22
|
+
#
|
23
|
+
# p institution # -> <Institutions::Institution @code=:my_inst @name="My Institution" @attribute1=My first attribute." @array_attribute=[1, 2] @default=false>
|
24
|
+
#
|
25
|
+
def initialize(code, name, h={})
|
26
|
+
# Set the required attributes
|
27
|
+
set_required_attributes code, name
|
28
|
+
# Merge in the optional hash attribute
|
29
|
+
merge h unless h.nil?
|
30
|
+
# If the institution is named default, take that as an
|
31
|
+
# indication that it's the default institution
|
32
|
+
@default = true if (name.eql? "default" or name.eql? "DEFAULT")
|
33
|
+
# If default was never set, explicitly set default as false.
|
34
|
+
@default = false if default.nil?
|
35
|
+
end
|
36
|
+
|
37
|
+
#
|
38
|
+
# Sets the required attributes.
|
39
|
+
# Raises an ArgumentError specifying the missing arguments if they are nil.
|
40
|
+
#
|
41
|
+
def set_required_attributes(code, name)
|
42
|
+
missing_arguments = []
|
43
|
+
missing_arguments << :code if code.nil?
|
44
|
+
missing_arguments << :name if name.nil?
|
45
|
+
raise ArgumentError.new("Cannot create the Institution based on the given arguments (:code => #{code.inspect}, :name => #{name.inspect}).\n"+
|
46
|
+
"The following arguments cannot be nil: #{missing_arguments.inspect}") unless missing_arguments.empty?
|
47
|
+
# Set the instance variables
|
48
|
+
@code, @name = code.to_sym, name
|
49
|
+
end
|
50
|
+
private :set_required_attributes
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module Institutions#:no_doc
|
2
|
+
module IpAddresses#:no_doc
|
3
|
+
require 'ipaddr_range_set'
|
4
|
+
attr_reader :ip_addresses
|
5
|
+
|
6
|
+
def ip_addresses=(args)
|
7
|
+
args.collect! do |arg|
|
8
|
+
arg.match(/-/) ? convert_to_range(arg) : arg
|
9
|
+
end
|
10
|
+
@ip_addresses = IPAddrRangeSet.new(*args)
|
11
|
+
end
|
12
|
+
protected :ip_addresses=
|
13
|
+
|
14
|
+
def ip_addresses_add(arg1, arg2)
|
15
|
+
arg1.add(arg2)
|
16
|
+
end
|
17
|
+
protected :ip_addresses_add
|
18
|
+
|
19
|
+
def convert_to_range(s)
|
20
|
+
s.split("-")[0]...s.split("-")[1]
|
21
|
+
end
|
22
|
+
private :convert_to_range
|
23
|
+
|
24
|
+
#
|
25
|
+
# Returns a +boolean+ indicating whether the candidate IP
|
26
|
+
# address is in the Institution's IP range.
|
27
|
+
# Example:
|
28
|
+
#
|
29
|
+
# require 'institutions'
|
30
|
+
# institution = Institution.new("my_inst", "My Institution", "ip_addresses" => ["127.0.0.1", 127.0.0.2"])
|
31
|
+
# data.includes_ip?("127.0.0.1") # => true
|
32
|
+
# data.includes_ip?("127.0.0.3") # => false
|
33
|
+
#
|
34
|
+
def includes_ip?(candidate)
|
35
|
+
return false if ip_addresses.nil?
|
36
|
+
return ip_addresses.include? candidate
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module Institutions#:no_doc
|
2
|
+
module Merge#:no_doc
|
3
|
+
#
|
4
|
+
# Merges the given arguments into the Institution.
|
5
|
+
# Internally uses a "recursive merge" algorithm to
|
6
|
+
# preserve as much of the original Institution as possible.
|
7
|
+
# Assumes the argument has a to_hash method
|
8
|
+
# Example.
|
9
|
+
#
|
10
|
+
# require 'institutions'
|
11
|
+
# hash1 = { "string_attribute" => "first string",
|
12
|
+
# :nested_hash_attribute => {
|
13
|
+
# :h1 => {:h1_2 => "first12"},
|
14
|
+
# :h2 => {:h2_1 => "first21", :h2_2 => "first22"}},
|
15
|
+
# :array_attribute => [1, 2, 4] }
|
16
|
+
# institution1 = Institutions::Institution.new("first_inst", "First Institution", hash1)
|
17
|
+
# p institution1 # -> #<Institutions::Institution @code=:first_inst, @name="First Institution", @array_attribute=[1, 2, 4], @default=false, @string_attribute="first string", @nested_hash_attribute={:h1=>{:h1_2=>"first12"}, :h2=>{:h2_1=>"first21", :h2_2=>"first22"}}>
|
18
|
+
# hash2 = { "string_attribute" => "second string",
|
19
|
+
# :nested_hash_attribute => {:h1 => {
|
20
|
+
# :h1_2 => "second12"},
|
21
|
+
# :h2 => {:h2_2 => "second22"}},
|
22
|
+
# :array_attribute => [1, 2, 3], :default => true }
|
23
|
+
# institution2 = Institutions::Institution.new("second_inst", "Second Institution", hash2)
|
24
|
+
# p institution2 # -> <Institutions::Institution @code=:second_inst, @name="Second Institution", @array_attribute=[1, 2, 3], @default=true, @string_attribute="second string", @nested_hash_attribute={:h1=>{:h1_2=>"second12"}, :h2=>{:h2_2=>"second22"}}>
|
25
|
+
# institution1.merge(institution2)
|
26
|
+
# p institution1 # -> #<Institutions::Institution @code=:first_inst, @name="First Institution", @array_attribute=[1, 2, 4, 3], @default=true, @string_attribute="second string", @nested_hash_attribute={:h1=>{:h1_2=>"second12"}, :h2=>{:h2_1=>"first21", :h2_2=>"second22"}}>
|
27
|
+
#
|
28
|
+
def merge(arg={})
|
29
|
+
arg.to_hash.each do |key, value|
|
30
|
+
next unless valid_instance_variable? key
|
31
|
+
instance_variable = instance_variablize(key)
|
32
|
+
if instance_variable_defined? instance_variable
|
33
|
+
instance_variable_set(instance_variable, deep_merge(instance_variable_get(instance_variable), value, key))
|
34
|
+
else
|
35
|
+
writer_method = "#{key}=".to_sym
|
36
|
+
if respond_to? writer_method
|
37
|
+
send writer_method, value
|
38
|
+
else
|
39
|
+
next if [:code, :name].include? key.to_sym
|
40
|
+
# Set each hash value as an instance variable, but don't overwrite code or name values.
|
41
|
+
instance_variable_set(instance_variable, value)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
#
|
48
|
+
# Recursively merges Hash (or any Object that can be converted to a Hash),
|
49
|
+
# Array and attributes that have implemented an :attribute_add method.
|
50
|
+
#
|
51
|
+
def deep_merge(arg1, arg2, key=nil)
|
52
|
+
# Attempt deep merge if the two arguments are
|
53
|
+
# instances of the same class.
|
54
|
+
if arg1.class == arg2.class
|
55
|
+
# Preserve arg1's :code and :name.
|
56
|
+
if (not key.nil?) and [:code, :name].include? key.to_sym
|
57
|
+
return arg1
|
58
|
+
# Recursively call deep merge for Hash objects.
|
59
|
+
elsif arg1.respond_to? :to_hash
|
60
|
+
r = {}
|
61
|
+
return arg1.to_hash.merge(arg2.to_hash) do |key, oldval, newval|
|
62
|
+
r[key] = deep_merge(oldval, newval, key)
|
63
|
+
end
|
64
|
+
# Concatenate Arrays and return uniq elements.
|
65
|
+
elsif arg1.instance_of? Array
|
66
|
+
return arg1.concat(arg2).uniq
|
67
|
+
# If Institutions responds to the :key_add method,
|
68
|
+
# go ahead and use that to add the Objects together.
|
69
|
+
elsif respond_to? "#{key}_add".to_sym
|
70
|
+
return send "#{key}_add".to_sym, arg1, arg2
|
71
|
+
end
|
72
|
+
end
|
73
|
+
# NOTE: Commenting this out since I'm not sure this is desirable functionality.
|
74
|
+
# If the two args aren't the same class, but arg1 is
|
75
|
+
# Array, append arg2 to arg1.
|
76
|
+
# if arg1.instance_of? Array
|
77
|
+
# return arg1.dup<<arg2
|
78
|
+
# end
|
79
|
+
# We tried.
|
80
|
+
# If all else fails just replace arg1 with arg2.
|
81
|
+
return arg2
|
82
|
+
end
|
83
|
+
protected :deep_merge
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Institutions#:no_doc
|
2
|
+
module Parents#:no_doc
|
3
|
+
# Parents attributes
|
4
|
+
attr_reader :parent_code
|
5
|
+
|
6
|
+
#
|
7
|
+
# Merges the given parent into the Institution.
|
8
|
+
# Assumes the parent has a to_hash method
|
9
|
+
#
|
10
|
+
def merge_parent(parent={})
|
11
|
+
# Use the parent as the base and merge in the current institution
|
12
|
+
merge(deep_merge(parent.to_hash, to_hash))
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,65 @@
|
|
1
|
+
module Institutions#:no_doc
|
2
|
+
module Util#:no_doc
|
3
|
+
#
|
4
|
+
# Converts the Institution to a hash with keys representing
|
5
|
+
# each Institutional attribute (as symbols) and their corresponding values.
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# require 'institutions'
|
9
|
+
# institution = Institution.new("my_inst", "My Institution")
|
10
|
+
# data.to_hash # => {:code => "my_inst", :name => "My Institution", :default => false }
|
11
|
+
#
|
12
|
+
def to_hash
|
13
|
+
hash = {}
|
14
|
+
instance_variables.each do |inst_var|
|
15
|
+
hash[hash_keyize(inst_var)] = instance_variable_get(inst_var)
|
16
|
+
end
|
17
|
+
hash
|
18
|
+
end
|
19
|
+
|
20
|
+
#
|
21
|
+
# Dynamically sets attr_readers for elements
|
22
|
+
#
|
23
|
+
def method_missing(method, *args, &block)
|
24
|
+
instance_variable = instance_variablize(method)
|
25
|
+
if instance_variable_defined? instance_variable
|
26
|
+
self.class.send :attr_reader, method.to_sym
|
27
|
+
instance_variable_get instance_variable
|
28
|
+
else
|
29
|
+
super
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
#
|
34
|
+
# Tells users that we respond to missing methods
|
35
|
+
# if they are instance variables.
|
36
|
+
#
|
37
|
+
def respond_to_missing?(method, include_private = false)
|
38
|
+
# Short circuit if we have invalid instance variable name,
|
39
|
+
# otherwise we get an exception that we don't need.
|
40
|
+
return super unless valid_instance_variable? method
|
41
|
+
if instance_variable_defined? instance_variablize(method)
|
42
|
+
true
|
43
|
+
else
|
44
|
+
super
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
def valid_instance_variable?(id)
|
49
|
+
id.to_sym.id2name.match(/[\@\=\?+]/).nil?
|
50
|
+
end
|
51
|
+
|
52
|
+
# Convert s to an instance variable
|
53
|
+
def instance_variablize(s)
|
54
|
+
"@#{s.to_sym.id2name.downcase}".to_sym
|
55
|
+
end
|
56
|
+
private :instance_variablize
|
57
|
+
|
58
|
+
# Convert s to a hash key
|
59
|
+
def hash_keyize(s)
|
60
|
+
# Remove beginning '@' and convert to symbol for hash keys.
|
61
|
+
s.to_s.sub(/^@/,'').to_sym
|
62
|
+
end
|
63
|
+
private :instance_variablize
|
64
|
+
end
|
65
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Institutions#:no_doc
|
2
|
+
#
|
3
|
+
# = institution.rb: Institution
|
4
|
+
#
|
5
|
+
# Author:: Scot Dalton
|
6
|
+
#
|
7
|
+
# An Institution represents an administrative unit and its unique configuration data.
|
8
|
+
# Institutions are necessarily abstract and fairly flexible to accomodate the myriad
|
9
|
+
# needs of applications. An institution only requires a code and name to be instantiated.
|
10
|
+
#
|
11
|
+
# == Examples:
|
12
|
+
#
|
13
|
+
# require 'institutions'
|
14
|
+
# hash = { "attribute1" => "My first attribute.", :array_attribute => [1, 2] }
|
15
|
+
# institution = Institutions::Institution.new("my_inst", "My Institution", hash)
|
16
|
+
#
|
17
|
+
# p institution # -> #<Institutions::Institution @code=:my_inst, @name="My Institution", @attribute1="My first attribute.", @array_attribute=[1, 2], @default=false>
|
18
|
+
#
|
19
|
+
class Institution
|
20
|
+
include Core
|
21
|
+
include Auth
|
22
|
+
include IpAddresses
|
23
|
+
include Merge
|
24
|
+
include Mvc
|
25
|
+
include Parents
|
26
|
+
include Services
|
27
|
+
include Util
|
28
|
+
end
|
29
|
+
end
|
data/lib/institutions.rb
ADDED
@@ -0,0 +1,99 @@
|
|
1
|
+
# Order of paths, then order of files dictates overrides.
|
2
|
+
|
3
|
+
module Institutions
|
4
|
+
require 'require_all'
|
5
|
+
require_rel 'institutions'
|
6
|
+
|
7
|
+
# Default paths/files for the module.
|
8
|
+
DEFAULT_LOADPATHS = [
|
9
|
+
(defined?(Rails) and Rails.root) ?
|
10
|
+
"#{Rails.root}/config" : "./config" ]
|
11
|
+
DEFAULT_FILENAMES = ["institutions.yml"]
|
12
|
+
|
13
|
+
def self.loadpaths
|
14
|
+
@loadpaths ||= DEFAULT_LOADPATHS.dup
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.filenames
|
18
|
+
@filenames ||= DEFAULT_FILENAMES.dup
|
19
|
+
end
|
20
|
+
|
21
|
+
# Intended for internal use only.
|
22
|
+
def self.loadfiles
|
23
|
+
loadfiles = []
|
24
|
+
if loadfiles.empty?
|
25
|
+
loadpaths.each do |loadpath|
|
26
|
+
filenames.each do |filename|
|
27
|
+
loadfile = File.join(loadpath, filename)
|
28
|
+
loadfiles<< loadfile if File.exists?(loadfile)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
loadfiles
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.reload
|
36
|
+
@institutions = nil
|
37
|
+
institutions
|
38
|
+
end
|
39
|
+
|
40
|
+
# Returns an Array of Institutions
|
41
|
+
def self.defaults
|
42
|
+
return institutions.values.find_all { |institution| institution.default? }
|
43
|
+
end
|
44
|
+
|
45
|
+
# Returns an Array of Institutions that contain the given IP.
|
46
|
+
def self.with_ip(ip)
|
47
|
+
return institutions.values.find_all { |institution| institution.includes_ip?(ip) }
|
48
|
+
end
|
49
|
+
|
50
|
+
#
|
51
|
+
# Returns a Hash of Institution instances with the Institution#code as the Hash key.
|
52
|
+
# Load file order can be change by the calling application by using Array methods.
|
53
|
+
# The default load file in Rails apps is
|
54
|
+
# "#{Rails.root}/config/institutions.yml"
|
55
|
+
# and if not Rails
|
56
|
+
# "./config/institutions.yml"
|
57
|
+
# To manipulate load path order and/or add directories to the path
|
58
|
+
# Institutions.loadpaths << File.join("path", "to", "new", "load", "directory")
|
59
|
+
# To manipulate file name order and/or add file names
|
60
|
+
# Institutions.filenames << "newfile.yml"
|
61
|
+
#
|
62
|
+
def self.institutions
|
63
|
+
unless @institutions
|
64
|
+
raise NameError.new("No load path was specified.") if loadpaths.nil?
|
65
|
+
raise NameError.new("No files named #{filenames} exist to load in the configured load paths, #{loadpaths}. ") if filenames.empty?
|
66
|
+
@institutions = {}
|
67
|
+
loadfiles.each do |loadfile|
|
68
|
+
# Loop through institutions in the yaml
|
69
|
+
YAML.load_file(loadfile).each_pair do |code, elements|
|
70
|
+
code = code.to_sym
|
71
|
+
# Merge the new elements or add a new Institution
|
72
|
+
@institutions.has_key?(code) ?
|
73
|
+
@institutions[code].merge(elements) :
|
74
|
+
@institutions[code] =
|
75
|
+
Institution.new(code, elements["name"] ? elements["name"] : code, elements)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
# Handle inheritance for institutions
|
79
|
+
merge_parents
|
80
|
+
end
|
81
|
+
@institutions
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.empty?
|
85
|
+
institutions.empty?
|
86
|
+
end
|
87
|
+
|
88
|
+
def self.institutions?
|
89
|
+
(not empty?)
|
90
|
+
end
|
91
|
+
|
92
|
+
# Handle inheritance for institutions
|
93
|
+
def self.merge_parents
|
94
|
+
@institutions.each do |key, institution|
|
95
|
+
parent_code = institution.parent_code
|
96
|
+
institution.merge_parent(@institutions[parent_code]) if parent_code
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
# Configure what service plugins are used by Umlaut. This skeleton file
|
2
|
+
# has been generated into your app to help you get started.
|
3
|
+
#
|
4
|
+
# If a service has "disabled:true", it's currently turned off.
|
5
|
+
#
|
6
|
+
# Some services require local api key or connection details as config.
|
7
|
+
# Most services take other options for custom configuration too, not
|
8
|
+
# all options are neccesarily listed as examples here, see source
|
9
|
+
# or source-generated docs for more info.
|
10
|
+
default:
|
11
|
+
name: NYU Libraries
|
12
|
+
auth:
|
13
|
+
link_code: NYU
|
14
|
+
views:
|
15
|
+
dir: nyu
|
16
|
+
sfx_base_url: http://sfx.library.nyu.edu/sfxlcl41?
|
17
|
+
NYU:
|
18
|
+
parent_institution: default
|
19
|
+
ip_addresses:
|
20
|
+
- 128.122.0.0-128.122.149.239
|
21
|
+
- 172.26.*.*
|
22
|
+
- 172.27.*.*
|
23
|
+
- 172.22.88.*
|
24
|
+
- 216.165.*.*
|
25
|
+
- 128.238.*.*
|
26
|
+
NYUAD:
|
27
|
+
name: NYU Abu Dhabi Library
|
28
|
+
parent_institution: NYU
|
29
|
+
views:
|
30
|
+
dir: nyuad
|
31
|
+
sfx_base_url: http://sfx.library.nyu.edu/sfxlcl41?
|
32
|
+
ip_addresses:
|
33
|
+
- 192.168.224.0/23
|
34
|
+
- 192.168.226.0/24
|
35
|
+
- 192.168.227.0/25
|
36
|
+
- 192.168.227.128/26
|
37
|
+
- 172.25.79.0/26
|
38
|
+
- 172.26.240.0/22
|
39
|
+
- 172.30.60.0/24
|
40
|
+
- 172.27.240.0/22
|
41
|
+
- 172.29.252.0/24
|
42
|
+
- 172.29.120.0/23
|
43
|
+
- 192.168.192.0/23
|
44
|
+
- 192.168.195.0/25
|
45
|
+
- 172.25.76.0/23
|
46
|
+
- 172.26.232.0/22
|
47
|
+
- 172.30.58.0/24
|
48
|
+
- 172.27.232.0/22
|
49
|
+
- 172.29.250.0/24
|
50
|
+
- 172.29.116.0/23
|
51
|
+
- 192.168.194.0/24
|
52
|
+
- 172.25.78.0/26
|
53
|
+
- 172.26.236.0/22
|
54
|
+
- 172.30.59.0/24
|
55
|
+
- 172.27.236.0/22
|
56
|
+
- 172.29.251.0/24
|
57
|
+
- 172.29.118.0/23
|
58
|
+
CU:
|
59
|
+
name: The Cooper Union Library
|
60
|
+
login:
|
61
|
+
link_code: CU
|
62
|
+
views:
|
63
|
+
dir: cu
|
64
|
+
sfx_base_url: http://sfx.library.nyu.edu/sfxcooper?
|
65
|
+
controllers:
|
66
|
+
searcher: SearchMethods::Sfx4Solr::CU
|
67
|
+
ip_addresses:
|
68
|
+
- 199.98.16.0-199.98.31.255
|
69
|
+
NS:
|
70
|
+
name: New School Libraries
|
71
|
+
login:
|
72
|
+
link_code: NS
|
73
|
+
views:
|
74
|
+
dir: ns
|
75
|
+
sfx_base_url: http://sfx4.library.newschool.edu/ns?
|
76
|
+
controllers:
|
77
|
+
searcher: SearchMethods::Sfx4Solr::NS
|
78
|
+
ip_addresses:
|
79
|
+
- 149.31.0.0-149.31.255.255
|
80
|
+
- 69.64.210.46
|
81
|
+
- 69.64.210.50
|
82
|
+
- 69.64.210.42
|
83
|
+
- 69.193.198.126
|
84
|
+
NYSID:
|
85
|
+
login:
|
86
|
+
link_code: NYSID
|
87
|
+
name: New York School of Interior Design Library
|
88
|
+
ip_addresses:
|
89
|
+
- 128.122.0.1
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class CoreTest < Test::Unit::TestCase
|
4
|
+
def test_new
|
5
|
+
hash = { "first" => "My first attribute.", :array_attribute => [1, 2] }
|
6
|
+
assert_nothing_raised {
|
7
|
+
institution = Institutions::Institution.new("my_inst", "My Institution", hash)
|
8
|
+
}
|
9
|
+
end
|
10
|
+
|
11
|
+
def test_new_no_hash
|
12
|
+
assert_nothing_raised {
|
13
|
+
institution = Institutions::Institution.new("my_inst", "My Institution")
|
14
|
+
}
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_new_nil_hash
|
18
|
+
assert_nothing_raised {
|
19
|
+
institution = Institutions::Institution.new("my_inst", "My Institution", nil)
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_new_nil_code
|
24
|
+
assert_raise(ArgumentError) {
|
25
|
+
institution = Institutions::Institution.new(nil, "My Institution")
|
26
|
+
}
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_new_nil_name
|
30
|
+
assert_raise(ArgumentError) {
|
31
|
+
institution = Institutions::Institution.new("my_inst", nil)
|
32
|
+
}
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class IpAddressesTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
@hash = { "ip_addresses" => ["134.122.0.0-134.122.149.239",
|
6
|
+
"134.22.88.*", "134.165.*.*", "134.238.*.*", "134.168.224.0/23"] }
|
7
|
+
end
|
8
|
+
|
9
|
+
def test_ip_addresses
|
10
|
+
assert_nothing_raised {
|
11
|
+
institution = Institutions::Institution.new("my_inst", "My Institution", @hash)
|
12
|
+
}
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_include_ip?
|
16
|
+
institution = Institutions::Institution.new("my_inst", "My Institution", @hash)
|
17
|
+
assert institution.includes_ip? "134.165.4.1"
|
18
|
+
assert institution.includes_ip? "134.168.224.255"
|
19
|
+
assert institution.includes_ip? "134.122.21.12"
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class MergeTest < Test::Unit::TestCase
|
4
|
+
def test_merge
|
5
|
+
hash1 = { "string_attribute" => "first string", :nested_hash_attribute => {:h1 => {:h1_2 => "first12"},
|
6
|
+
:h2 => {:h2_1 => "first21", :h2_2 => "first22"}}, :array_attribute => [1, 2, 4] }
|
7
|
+
institution1 = Institutions::Institution.new("first_inst", "First Institution", hash1)
|
8
|
+
assert_equal(:first_inst, institution1.code)
|
9
|
+
assert_equal("First Institution", institution1.name)
|
10
|
+
assert_equal({:h1 => {:h1_2 => "first12"}, :h2 => {:h2_1 => "first21", :h2_2 => "first22"}},
|
11
|
+
institution1.nested_hash_attribute)
|
12
|
+
assert_equal([1,2,4], institution1.array_attribute)
|
13
|
+
assert_equal("first string", institution1.string_attribute)
|
14
|
+
assert_equal(false, institution1.default)
|
15
|
+
hash2 = { "string_attribute" => "second string", :nested_hash_attribute => {:h1 => {:h1_2 => "second12"},
|
16
|
+
:h2 => {:h2_2 => "second22"}}, :array_attribute => [1, 2, 3], :default => true }
|
17
|
+
institution2 = Institutions::Institution.new("second_inst", "Second Institution", hash2)
|
18
|
+
assert_equal(:second_inst, institution2.code)
|
19
|
+
assert_equal("Second Institution", institution2.name)
|
20
|
+
assert_equal({:h1 => {:h1_2 => "second12"}, :h2 => {:h2_2 => "second22"}},
|
21
|
+
institution2.nested_hash_attribute)
|
22
|
+
assert_equal([1,2,3], institution2.array_attribute)
|
23
|
+
assert_equal("second string", institution2.string_attribute)
|
24
|
+
assert_equal(true, institution2.default)
|
25
|
+
institution1.merge(institution2)
|
26
|
+
assert_equal(:first_inst, institution1.code)
|
27
|
+
assert_equal("First Institution", institution1.name)
|
28
|
+
assert_equal({:h1 => {:h1_2 => "second12"}, :h2 => {:h2_1 => "first21", :h2_2 => "second22"}},
|
29
|
+
institution1.nested_hash_attribute)
|
30
|
+
assert_equal([1,2,3,4], institution1.array_attribute.sort)
|
31
|
+
assert_equal("second string", institution1.string_attribute)
|
32
|
+
assert_equal(true, institution1.default)
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class ParentsTest < Test::Unit::TestCase
|
4
|
+
def test_parent
|
5
|
+
hash = { "first" => "My first attribute.", :array_attribute => [1, 2] }
|
6
|
+
institution = Institutions::Institution.new("my_inst", "My Institution", hash)
|
7
|
+
parent_hash = { "first" => "parent first", :array_attribute => [1, 2, 3], :inherited_trait => "inherited" }
|
8
|
+
parent_institution = Institutions::Institution.new("parent", "My Parent Institution", parent_hash)
|
9
|
+
institution.merge_parent(parent_institution)
|
10
|
+
assert_equal("My first attribute.", institution.first)
|
11
|
+
assert_equal("inherited", institution.inherited_trait)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class UtilTest < Test::Unit::TestCase
|
4
|
+
def test_missing_method
|
5
|
+
hash = { "an_attr" => "My first attribute.", :some_numbers => [1, 2] }
|
6
|
+
institution = Institutions::Institution.new("my_inst", "My Institution", hash)
|
7
|
+
assert_nothing_raised {
|
8
|
+
institution.an_attr
|
9
|
+
}
|
10
|
+
assert_equal("My first attribute.", institution.an_attr)
|
11
|
+
assert_equal([1, 2], institution.some_numbers)
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'test_helper'
|
2
|
+
|
3
|
+
class InstitutionsTest < Test::Unit::TestCase
|
4
|
+
def setup
|
5
|
+
# Undo any instance variable settings.
|
6
|
+
Institutions.send(:instance_variable_set, :@loadpaths, nil)
|
7
|
+
assert_equal(Institutions::DEFAULT_LOADPATHS, Institutions.loadpaths)
|
8
|
+
Institutions.send(:instance_variable_set, :@filenames, nil)
|
9
|
+
assert_equal(Institutions::DEFAULT_FILENAMES, Institutions.filenames)
|
10
|
+
Institutions.send(:instance_variable_set, :@institutions, nil)
|
11
|
+
assert_nil(Institutions.send(:instance_variable_get, :@institutions))
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_module
|
15
|
+
assert_kind_of Module, Institutions
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_path
|
19
|
+
assert_equal Institutions::DEFAULT_LOADPATHS, Institutions.loadpaths
|
20
|
+
Institutions.loadpaths << File.join("../config")
|
21
|
+
assert_equal Institutions::DEFAULT_LOADPATHS.concat(["../config"]), Institutions.loadpaths
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_institutions
|
25
|
+
Institutions.loadpaths << File.join("test", "config")
|
26
|
+
institutions = Institutions.institutions
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_institutions_overwrite
|
30
|
+
Institutions.loadpaths << File.join("test", "config")
|
31
|
+
Institutions.filenames << "overwrite.yml"
|
32
|
+
institutions = Institutions.institutions
|
33
|
+
assert_equal "ns", institutions[:NS].views["dir"]
|
34
|
+
assert_equal "ns tag", institutions[:NS].views["tag"]
|
35
|
+
end
|
36
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,175 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: institutions
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Scot Dalton
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-11-10 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: require_all
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.2.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.2.1
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: ipaddr_range_set
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ~>
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: 0.9.1
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ~>
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: 0.9.1
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: git
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: 1.2.5
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 1.2.5
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rdoc
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :runtime
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
- !ruby/object:Gem::Dependency
|
79
|
+
name: rake
|
80
|
+
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
type: :runtime
|
87
|
+
prerelease: false
|
88
|
+
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
90
|
+
requirements:
|
91
|
+
- - ! '>='
|
92
|
+
- !ruby/object:Gem::Version
|
93
|
+
version: '0'
|
94
|
+
description: Abstract mechanism for setting up Institutions with arbitrary data elements.
|
95
|
+
email:
|
96
|
+
- scotdalton@gmail.com
|
97
|
+
executables: []
|
98
|
+
extensions: []
|
99
|
+
extra_rdoc_files: []
|
100
|
+
files:
|
101
|
+
- .gitignore
|
102
|
+
- .travis.yml
|
103
|
+
- Gemfile
|
104
|
+
- MIT-LICENSE
|
105
|
+
- README.rdoc
|
106
|
+
- Rakefile
|
107
|
+
- institutions.gemspec
|
108
|
+
- lib/institutions.rb
|
109
|
+
- lib/institutions/institution.rb
|
110
|
+
- lib/institutions/institution/auth.rb
|
111
|
+
- lib/institutions/institution/core.rb
|
112
|
+
- lib/institutions/institution/ip_addresses.rb
|
113
|
+
- lib/institutions/institution/merge.rb
|
114
|
+
- lib/institutions/institution/mvc.rb
|
115
|
+
- lib/institutions/institution/parents.rb
|
116
|
+
- lib/institutions/institution/services.rb
|
117
|
+
- lib/institutions/institution/util.rb
|
118
|
+
- lib/institutions/version.rb
|
119
|
+
- test/config/institutions.yml
|
120
|
+
- test/config/overwrite.yml
|
121
|
+
- test/institution/auth_test.rb
|
122
|
+
- test/institution/core_test.rb
|
123
|
+
- test/institution/ip_addresses_test.rb
|
124
|
+
- test/institution/merge_test.rb
|
125
|
+
- test/institution/mvc_test.rb
|
126
|
+
- test/institution/parents_test.rb
|
127
|
+
- test/institution/services_test.rb
|
128
|
+
- test/institution/util_test.rb
|
129
|
+
- test/institution_test.rb
|
130
|
+
- test/institutions_test.rb
|
131
|
+
- test/test_helper.rb
|
132
|
+
homepage: https://github.com/scotdalton/institutions
|
133
|
+
licenses: []
|
134
|
+
post_install_message:
|
135
|
+
rdoc_options: []
|
136
|
+
require_paths:
|
137
|
+
- lib
|
138
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
139
|
+
none: false
|
140
|
+
requirements:
|
141
|
+
- - ! '>='
|
142
|
+
- !ruby/object:Gem::Version
|
143
|
+
version: '0'
|
144
|
+
segments:
|
145
|
+
- 0
|
146
|
+
hash: -78613404009586632
|
147
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
none: false
|
149
|
+
requirements:
|
150
|
+
- - ! '>='
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0'
|
153
|
+
segments:
|
154
|
+
- 0
|
155
|
+
hash: -78613404009586632
|
156
|
+
requirements: []
|
157
|
+
rubyforge_project:
|
158
|
+
rubygems_version: 1.8.24
|
159
|
+
signing_key:
|
160
|
+
specification_version: 3
|
161
|
+
summary: Abstract mechanism for setting up Institutions (whatever that means).
|
162
|
+
test_files:
|
163
|
+
- test/config/institutions.yml
|
164
|
+
- test/config/overwrite.yml
|
165
|
+
- test/institution/auth_test.rb
|
166
|
+
- test/institution/core_test.rb
|
167
|
+
- test/institution/ip_addresses_test.rb
|
168
|
+
- test/institution/merge_test.rb
|
169
|
+
- test/institution/mvc_test.rb
|
170
|
+
- test/institution/parents_test.rb
|
171
|
+
- test/institution/services_test.rb
|
172
|
+
- test/institution/util_test.rb
|
173
|
+
- test/institution_test.rb
|
174
|
+
- test/institutions_test.rb
|
175
|
+
- test/test_helper.rb
|