institutions 0.0.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.
data/.gitignore ADDED
@@ -0,0 +1 @@
1
+ Gemfile.lock
data/.travis.yml ADDED
@@ -0,0 +1,9 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.8.7
4
+ - 1.9.3
5
+ - jruby-18mode # JRuby in 1.8 mode
6
+ - jruby-19mode # JRuby in 1.9 mode
7
+ - rbx-18mode
8
+ - rbx-19mode
9
+
data/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source 'https://rubygems.org'
2
+ gemspec
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,6 @@
1
+ module Institutions#:no_doc
2
+ module Auth#:no_doc
3
+ # Auth attributes
4
+ attr_reader :auth
5
+ end
6
+ 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,6 @@
1
+ module Institutions#:no_doc
2
+ module Mvc#:no_doc
3
+ # MVC pattern attributes
4
+ attr_reader :models, :views, :controllers
5
+ end
6
+ 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,6 @@
1
+ module Institutions#:no_doc
2
+ module Services#:no_doc
3
+ # Services attributes
4
+ attr_reader :services
5
+ end
6
+ 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
@@ -0,0 +1,3 @@
1
+ module Institutions
2
+ VERSION = "0.0.1"
3
+ end
@@ -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,4 @@
1
+ NS:
2
+ views:
3
+ tag: ns tag
4
+
@@ -0,0 +1,7 @@
1
+ require 'test_helper'
2
+
3
+ class AuthTest < Test::Unit::TestCase
4
+ def test_truth
5
+ assert true
6
+ end
7
+ end
@@ -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,7 @@
1
+ require 'test_helper'
2
+
3
+ class MvcTest < Test::Unit::TestCase
4
+ def test_truth
5
+ assert true
6
+ end
7
+ 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,7 @@
1
+ require 'test_helper'
2
+
3
+ class ServicesTest < Test::Unit::TestCase
4
+ def test_truth
5
+ assert true
6
+ end
7
+ 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,7 @@
1
+ require 'test_helper'
2
+
3
+ class InstitutionTest < Test::Unit::TestCase
4
+ def test_class
5
+ assert_kind_of Class, Institutions::Institution
6
+ end
7
+ 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
@@ -0,0 +1,3 @@
1
+ $:.unshift("#{File.dirname(__FILE__)}/..")
2
+ require 'test/unit'
3
+ require File.expand_path("../../lib/institutions.rb", __FILE__)
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