active_fedora_finders 0.1.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/Gemfile ADDED
@@ -0,0 +1,3 @@
1
+ source "http://rubygems.org"
2
+ # see active_fedora_finders.gemspec
3
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2012 Benjamin Armintor
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.textile ADDED
@@ -0,0 +1,29 @@
1
+ ActiveFedora::Finders
2
+
3
+ A mixin to allow use of dynamic finder methods (a la Rails) with ActiveFedora. These methods operate against the FCRepo Object Search.
4
+ Allowed fields are the 15 DCES metadata fields, and the FCRepo object properties, ie:
5
+
6
+ SINGLE_VALUE_FIELDS = [:pid, :cDate, :mDate, :label]
7
+ SYSTEM_FIELDS = SINGLE_VALUE_FIELDS.concat [:ownerId]
8
+ DC_FIELDS = [:contributor, :coverage, :creator, :date, :description, :format,
9
+ :identifier, :language, :publisher, :relation, :rights, :source,
10
+ :subject, :title, :type ]
11
+ SUPPORTED_ALTS = [:cdate, :create_date, :mdate, :modified_date, :owner_id]
12
+
13
+
14
+ Example:
15
+
16
+ class MyModel < ActiveFedora::Base
17
+ include ActiveFedora::Finders
18
+ end
19
+
20
+ obj = MyModel.find_by_identifier("fedora-system:ContentModel-3.0")
21
+
22
+ **
23
+
24
+ Roadmap:
25
+
26
+ 0.1: dynamic finders, bang support
27
+ 0.2: support or_create|initialize
28
+ 0.3: support _all and _last
29
+ 0.4: support scopes
data/Rakefile ADDED
@@ -0,0 +1,19 @@
1
+ require 'rake/clean'
2
+ require 'rubygems'
3
+ require 'bundler'
4
+ require "bundler/setup"
5
+ require "active-fedora"
6
+ require "active_fedora_finders"
7
+
8
+ Bundler::GemHelper.install_tasks
9
+
10
+ # load rake tasks defined in lib/tasks that are not loaded in lib/active_fedora.rb
11
+ load "lib/tasks/af_finders_dev.rake" if defined?(Rake)
12
+
13
+ CLEAN.include %w[**/.DS_Store tmp *.log *.orig *.tmp **/*~]
14
+
15
+ task :spec => ['active_fedora_finders:rspec']
16
+ task :rcov => ['active_fedora_finders:rcov']
17
+
18
+
19
+ task :default => [:spec]
@@ -0,0 +1,37 @@
1
+ # -*- encoding: utf-8 -*-
2
+ $:.push File.expand_path("../lib", __FILE__)
3
+ require "active_fedora_finders/version"
4
+
5
+ Gem::Specification.new do |s|
6
+ s.name = "active_fedora_finders"
7
+ s.version = ActiveFedora::Finders::VERSION
8
+ s.platform = Gem::Platform::RUBY
9
+ s.authors = ["Benjamin Armintor"]
10
+ s.email = ["armintor@gmail.com"]
11
+ s.homepage = %q{https://github.com/barmintor/active_fedora_finders}
12
+ s.summary = %q{A library for adding ActiveRecord-style dynamic finders to ActiveFedora::Base subclasses.}
13
+ s.description = %q{A mixin library for ActiveFedora. Generates dynamic finder methods operating against the FCRepo object search terms (DCES elements and object properties).}
14
+
15
+ s.rubygems_version = %q{1.3.7}
16
+
17
+ s.add_dependency('active-fedora', '>=4.2.0')
18
+ s.add_dependency('nokogiri')
19
+ s.add_dependency("activerecord", '~>3.2.0')
20
+ s.add_dependency("activesupport", '~>3.2.0')
21
+ s.add_dependency("rubydora", '~>0.5.9')
22
+ s.add_development_dependency("yard")
23
+ s.add_development_dependency("RedCloth") # for RDoc formatting
24
+ s.add_development_dependency("rake")
25
+ s.add_development_dependency("rspec", ">= 2.9.0")
26
+ s.add_development_dependency("mocha", "0.10.5")
27
+
28
+ s.files = `git ls-files`.split("\n")
29
+ s.test_files = `git ls-files -- {test,spec}/*`.split("\n")
30
+ s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
31
+ s.extra_rdoc_files = [
32
+ "LICENSE.txt",
33
+ "README.textile"
34
+ ]
35
+ s.require_paths = ["lib"]
36
+
37
+ end
@@ -0,0 +1,128 @@
1
+ require 'active-fedora'
2
+ require 'active_support'
3
+ require 'active_record'
4
+ require 'active_record/errors' # RecordNotFound is not autoloaded, and ActiveRecord::Base not referenced
5
+ module ActiveFedora
6
+ module Finders
7
+ extend ActiveSupport::Concern
8
+ extend ActiveSupport::Autoload
9
+ autoload :Version
10
+
11
+ SINGLE_VALUE_FIELDS = [:pid, :cDate, :mDate, :label]
12
+ SYSTEM_FIELDS = SINGLE_VALUE_FIELDS.concat [:ownerId]
13
+ DC_FIELDS = [:contributor, :coverage, :creator, :date, :description, :format,
14
+ :identifier, :language, :publisher, :relation, :rights, :source,
15
+ :subject, :title, :type ]
16
+ SUPPORTED_ALTS = [:cdate, :create_date, :mdate, :modified_date, :owner_id]
17
+ ALL_FIELDS = SYSTEM_FIELDS.concat(DC_FIELDS)
18
+ FIELD_KEYS = begin
19
+ fk = Hash[ALL_FIELDS.map {|a| [a.to_s, a]}]
20
+ fk["cdate"] = :cDate
21
+ fk["create_date"] = :cDate
22
+ fk["mdate"] = :mDate
23
+ fk["modified_date"] = :mDate
24
+ fk["owner_id"] = :ownerId
25
+ fk
26
+ end
27
+
28
+ included do
29
+ class << self
30
+ alias_method :active_fedora_find, :find
31
+ end
32
+ end
33
+
34
+ module ClassMethods
35
+ def find(args)
36
+ if args.is_a? String
37
+ return active_fedora_find(args)
38
+ else
39
+ return find_by_conditions(nil, args)
40
+ end
41
+ end
42
+
43
+ # modeled after ActiveRecord::FinderMethods.find_by_attributes
44
+ def find_by_attributes(match, attribute_names, *args)
45
+ conditions = Hash[attribute_names.map {|a| [a, args[attribute_names.index(a)]]}]
46
+ result = find_by_conditions(match, conditions)
47
+ if match.bang? && result.blank?
48
+ raise ActiveRecord::RecordNotFound, "Couldn't find #{self.name} with #{conditions.to_a.collect {|p| p.join(' = ')}.join(', ')}"
49
+ else
50
+ yield(result) if block_given?
51
+ result
52
+ end
53
+ end
54
+
55
+ def find_by_conditions(match, args)
56
+ parms = args.dup
57
+ maxResults = (match.nil? or match.finder == :first) ? 1 : 25 # find_all and find_last not yet supported
58
+ query = ""
59
+ parms.each { |key, val|
60
+ if SINGLE_VALUE_FIELDS.include? key
61
+ query.concat "#{key.to_s}=#{val.to_s} "
62
+ else
63
+ query.concat "#{key.to_s}~#{val.to_s} "
64
+ end
65
+ }
66
+ query.strip!
67
+ results = []
68
+ if ActiveFedora.config.sharded?
69
+ (0...ActiveFedora.config.credentials.length).each {|ix|
70
+ ActiveFedora::Base.fedora_connection[ix] ||= ActiveFedora::RubydoraConnection.new(ActiveFedora.config.credentials[ix])
71
+ rubydora = ActiveFedora::Base.fedora_connection[ix].connection
72
+ if results.length <= maxResults
73
+ results.concat process_results(rubydora.find_objects(:query=>query,:pid=>'true', :maxResults=>maxResults))
74
+ end
75
+ }
76
+ else
77
+ ActiveFedora::Base.fedora_connection[0] ||= ActiveFedora::RubydoraConnection.new(ActiveFedora.config.credentials)
78
+ rubydora = ActiveFedora::Base.fedora_connection[0].connection
79
+ results.concat process_results(rubydora.find_objects(:query=>query,:pid=>'true', :maxResults=>maxResults))
80
+ end
81
+ return (maxResults == 1) ? results[0] : results
82
+ end
83
+
84
+ def process_results(results)
85
+ results = Nokogiri::XML.parse(results)
86
+ results = results.xpath('/f:result/f:resultList/f:objectFields/f:pid',{'f'=>"http://www.fedora.info/definitions/1/0/types/"})
87
+ results.collect { |result| active_fedora_find(result.text) }
88
+ end
89
+
90
+ # this method is patterned after an analog in ActiveRecord::DynamicMatchers
91
+ def all_attributes_exists?(attribute_names)
92
+ field_keys = attribute_names.map {|val| FIELD_KEYS[val] or val}
93
+ attribute_names.replace field_keys
94
+ attribute_names.reduce(true) {|result, att| ALL_FIELDS.include? att or SUPPORTED_ALTS.include? att}
95
+ end
96
+
97
+ # adapted from ActiveRecord::DynamicMatchers
98
+ def method_missing(method_id, *arguments, &block)
99
+ if match = (ActiveRecord::DynamicFinderMatch.match(method_id) || ActiveRecord::DynamicScopeMatch.match(method_id))
100
+ attribute_names = match.attribute_names
101
+ super unless all_attributes_exists?(attribute_names)
102
+ if !(match.is_a?(ActiveRecord::DynamicFinderMatch) && match.instantiator? && arguments.first.is_a?(Hash)) && arguments.size < attribute_names.size
103
+ method_trace = "#{__FILE__}:#{__LINE__}:in `#{method_id}'"
104
+ backtrace = [method_trace] + caller
105
+ raise ArgumentError, "wrong number of arguments (#{arguments.size} for #{attribute_names.size})", backtrace
106
+ end
107
+ if match.respond_to?(:scope?) && match.scope?
108
+ self.class_eval <<-METHOD, __FILE__, __LINE__ + 1
109
+ def self.#{method_id}(*args) # def self.scoped_by_user_name_and_password(*args)
110
+ attributes = Hash[[:#{attribute_names.join(',:')}].zip(args)] # attributes = Hash[[:user_name, :password].zip(args)]
111
+ #
112
+ scoped(:conditions => attributes) # scoped(:conditions => attributes)
113
+ end # end
114
+ METHOD
115
+ send(method_id, *arguments)
116
+ elsif match.finder?
117
+ find_by_attributes(match, attribute_names, *arguments, &block)
118
+ elsif match.instantiator?
119
+ find_or_instantiator_by_attributes(match, attribute_names, *arguments, &block)
120
+ end
121
+ else
122
+ super
123
+ end
124
+ end
125
+
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,5 @@
1
+ module ActiveFedora
2
+ module Finders
3
+ VERSION = '0.1.1'
4
+ end
5
+ end
@@ -0,0 +1,37 @@
1
+ APP_ROOT = File.expand_path("#{File.dirname(__FILE__)}/../../")
2
+
3
+ namespace :active_fedora_finders do
4
+ require 'active_fedora_finders'
5
+
6
+ # Use yard to build docs
7
+ begin
8
+ require 'yard'
9
+ require 'yard/rake/yardoc_task'
10
+ project_root = APP_ROOT
11
+ doc_destination = File.join(project_root, 'doc')
12
+
13
+ YARD::Rake::YardocTask.new(:doc) do |yt|
14
+ yt.files = Dir.glob(File.join(project_root, 'lib', '**', '*.rb')) +
15
+ [ File.join(project_root, 'README.textile')]
16
+ yt.options = ['--output-dir', doc_destination, '--readme', 'README.textile']
17
+ end
18
+ rescue LoadError
19
+ desc "Generate YARD Documentation"
20
+ task :doc do
21
+ abort "Please install the YARD gem to generate rdoc."
22
+ end
23
+ end
24
+
25
+ require 'rspec/core/rake_task'
26
+ RSpec::Core::RakeTask.new(:rspec) do |spec|
27
+ spec.pattern = FileList['spec/**/*_spec.rb']
28
+ spec.pattern += FileList['spec/*_spec.rb']
29
+ end
30
+
31
+ RSpec::Core::RakeTask.new(:rcov) do |spec|
32
+ spec.pattern = FileList['spec/**/*_spec.rb']
33
+ spec.pattern += FileList['spec/*_spec.rb']
34
+ spec.rcov = true
35
+ end
36
+
37
+ end
@@ -0,0 +1,27 @@
1
+ # copied directly from active-fedora
2
+ def mock_yaml(hash, path)
3
+ mock_file = mock(path.split("/")[-1])
4
+ File.stubs(:exist?).with(path).returns(true)
5
+ File.expects(:open).with(path).returns(mock_file)
6
+ YAML.expects(:load).returns(hash)
7
+ end
8
+
9
+ def default_predicate_mapping_file
10
+ File.expand_path(File.join(File.dirname(__FILE__),"..","config","predicate_mappings.yml"))
11
+ end
12
+
13
+ def stub_rails(opts={})
14
+ Object.const_set("Rails",Class)
15
+ Rails.send(:undef_method,:env) if Rails.respond_to?(:env)
16
+ Rails.send(:undef_method,:root) if Rails.respond_to?(:root)
17
+ opts.each { |k,v| Rails.send(:define_method,k){ return v } }
18
+ end
19
+
20
+ def unstub_rails
21
+ Object.send(:remove_const,:Rails) if defined?(Rails)
22
+ end
23
+
24
+ def setup_pretest_env
25
+ ENV['RAILS_ENV']='test'
26
+ ENV['environment']='test'
27
+ end
@@ -0,0 +1,54 @@
1
+ require 'spec_helper'
2
+ require 'config_helper'
3
+
4
+ describe ActiveFedora::Finders do
5
+ class TestBase < ActiveFedora::Base
6
+ include ActiveFedora::Finders
7
+ end
8
+ FCREPO_ID = 'fedora-system:ContentModel-3.0'
9
+ FCREPO_DATE = '2012-06-01T12:34:56.000Z'
10
+
11
+ describe "finder methods" do
12
+ describe "default find method" do
13
+ it "should call the normal find method when passed a string" do
14
+ TestBase.expects(:active_fedora_find).returns TestBase.new
15
+ TestBase.find(FCREPO_ID)
16
+ end
17
+ end
18
+ describe "dynamic finder methods" do
19
+ it "should call .find_by_conditions with correct attributes" do
20
+ TestBase.expects(:find_by_conditions).with(is_a(ActiveRecord::DynamicFinderMatch), :identifier => FCREPO_ID).returns(TestBase.new)
21
+ TestBase.find_by_identifier(FCREPO_ID)
22
+ TestBase.expects(:find_by_conditions).with(is_a(ActiveRecord::DynamicFinderMatch), :cDate => FCREPO_DATE, :identifier => FCREPO_ID).returns(TestBase.new)
23
+ TestBase.find_by_create_date_and_identifier(FCREPO_DATE, FCREPO_ID)
24
+ end
25
+ it "should return an ActiveFedora::Base when there is a single result" do
26
+ stubfedora = mock("Fedora")
27
+ stubfedora.expects(:connection).returns(mock("Connection", :find_objects =>fixture('find_one.xml')))
28
+ TestBase.expects(:active_fedora_find).with(FCREPO_ID).returns TestBase.new(:pid=>FCREPO_ID)
29
+ ActiveFedora::Base.fedora_connection = [stubfedora]
30
+ TestBase.find_by_identifier(FCREPO_ID).should be_a TestBase
31
+ end
32
+ it "should return an array when there are multiple results" do
33
+ stubfedora = mock("Fedora")
34
+ stubfedora.expects(:connection).returns(mock("Connection", :find_objects =>fixture('find_multiple.xml')))
35
+ ActiveFedora::Base.fedora_connection = [stubfedora]
36
+ TestBase.expects(:active_fedora_find).with(FCREPO_ID).returns TestBase.new(:pid=>FCREPO_ID)
37
+ TestBase.expects(:active_fedora_find).with("demo:1").returns TestBase.new(:pid=>"demo:1")
38
+ TestBase.find_all_by_source("test").should be_a Array
39
+ end
40
+ it "should throw an error when no results and a bang" do
41
+ stubfedora = mock("Fedora")
42
+ stubfedora.expects(:connection).returns(mock("Connection", :find_objects =>fixture('find_none.xml')))
43
+ ActiveFedora::Base.fedora_connection = [stubfedora]
44
+ #ActiveRecord::Base
45
+ begin
46
+ TestBase.find_by_identifier!("dummy:1")
47
+ fail "should not successfully return from bang method with no results"
48
+ rescue Exception => e
49
+ e.should be_a ActiveRecord::RecordNotFound
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,10 @@
1
+ <result xmlns="http://www.fedora.info/definitions/1/0/types/">
2
+ <resultList>
3
+ <objectFields>
4
+ <pid>fedora-system:ContentModel-3.0</pid>
5
+ </objectFields>
6
+ <objectFields>
7
+ <pid>demo:1</pid>
8
+ </objectFields>
9
+ </resultList>
10
+ </result>
@@ -0,0 +1,4 @@
1
+ <result xmlns="http://www.fedora.info/definitions/1/0/types/">
2
+ <resultList>
3
+ </resultList>
4
+ </result>
@@ -0,0 +1,7 @@
1
+ <result xmlns="http://www.fedora.info/definitions/1/0/types/">
2
+ <resultList>
3
+ <objectFields>
4
+ <pid>fedora-system:ContentModel-3.0</pid>
5
+ </objectFields>
6
+ </resultList>
7
+ </result>
@@ -0,0 +1,27 @@
1
+ ENV["environment"] ||= 'test'
2
+ require "bundler/setup"
3
+
4
+ if ENV['COVERAGE'] and RUBY_VERSION =~ /^1.9/
5
+ require 'simplecov'
6
+ require 'simplecov-rcov'
7
+
8
+ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter
9
+ SimpleCov.start
10
+ end
11
+
12
+ require 'active_record'
13
+ #require 'active_record/errors'
14
+ require 'active-fedora'
15
+ require 'rspec'
16
+
17
+ require 'support/mock_fedora'
18
+ require 'active_fedora_finders'
19
+
20
+ RSpec.configure do |config|
21
+ config.mock_with :mocha
22
+ config.color_enabled = true
23
+ end
24
+
25
+ def fixture(file)
26
+ File.open(File.join(File.dirname(__FILE__), 'fixtures', file), 'rb')
27
+ end
@@ -0,0 +1,45 @@
1
+ # copied directly from active-fedora
2
+ def mock_client
3
+ return @mock_client if @mock_client
4
+ @mock_client = mock("client")
5
+ @getter = mock("getter")
6
+ @getter.stubs(:get).returns('')
7
+ @mock_client.stubs(:[]).with("describe?xml=true").returns('')
8
+ @mock_client
9
+ end
10
+
11
+ def stub_get(pid, datastreams=nil, record_exists=false)
12
+ pid.gsub!(/:/, '%3A')
13
+ if record_exists
14
+ mock_client.stubs(:[]).with("objects/#{pid}?format=xml").returns(stub('get getter', :get=>'foobar'))
15
+ else
16
+ mock_client.stubs(:[]).with("objects/#{pid}?format=xml").raises(RestClient::ResourceNotFound)
17
+ end
18
+ mock_client.stubs(:[]).with("objects/#{pid}/datastreams?format=xml").returns(@getter)
19
+ datastreams ||= ['someData', 'withText', 'withText2', 'RELS-EXT']
20
+ datastreams.each do |dsid|
21
+ mock_client.stubs(:[]).with("objects/#{pid}/datastreams/#{dsid}?format=xml").returns(@getter)
22
+ end
23
+ end
24
+
25
+ def stub_ingest(pid=nil)
26
+ n = pid ? pid.gsub(/:/, '%3A') : nil
27
+ mock_client.expects(:[]).with("objects/#{n || 'new'}").returns(stub("ingester", :post=>pid))
28
+ end
29
+
30
+ def stub_add_ds(pid, dsids)
31
+ pid.gsub!(/:/, '%3A')
32
+ dsids.each do |dsid|
33
+ client = mock_client.stubs(:[]).with do |params|
34
+ /objects\/#{pid}\/datastreams\/#{dsid}/.match(params)
35
+ end
36
+ client.returns(stub("ds_adder", :post=>pid, :get=>''))
37
+ end
38
+ end
39
+
40
+ def stub_get_content(pid, dsids)
41
+ pid.gsub!(/:/, '%3A')
42
+ dsids.each do |dsid|
43
+ mock_client.stubs(:[]).with { |params| /objects\/#{pid}\/datastreams\/#{dsid}\/content/.match(params)}.returns(stub("content_accessor", :post=>pid, :get=>''))
44
+ end
45
+ end
metadata ADDED
@@ -0,0 +1,232 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: active_fedora_finders
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Benjamin Armintor
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-06-25 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: active-fedora
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: 4.2.0
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: 4.2.0
30
+ - !ruby/object:Gem::Dependency
31
+ name: nokogiri
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
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'
46
+ - !ruby/object:Gem::Dependency
47
+ name: activerecord
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ~>
52
+ - !ruby/object:Gem::Version
53
+ version: 3.2.0
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: 3.2.0
62
+ - !ruby/object:Gem::Dependency
63
+ name: activesupport
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ~>
68
+ - !ruby/object:Gem::Version
69
+ version: 3.2.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: 3.2.0
78
+ - !ruby/object:Gem::Dependency
79
+ name: rubydora
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ~>
84
+ - !ruby/object:Gem::Version
85
+ version: 0.5.9
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.5.9
94
+ - !ruby/object:Gem::Dependency
95
+ name: yard
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ - !ruby/object:Gem::Dependency
111
+ name: RedCloth
112
+ requirement: !ruby/object:Gem::Requirement
113
+ none: false
114
+ requirements:
115
+ - - ! '>='
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ none: false
122
+ requirements:
123
+ - - ! '>='
124
+ - !ruby/object:Gem::Version
125
+ version: '0'
126
+ - !ruby/object:Gem::Dependency
127
+ name: rake
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :development
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
142
+ - !ruby/object:Gem::Dependency
143
+ name: rspec
144
+ requirement: !ruby/object:Gem::Requirement
145
+ none: false
146
+ requirements:
147
+ - - ! '>='
148
+ - !ruby/object:Gem::Version
149
+ version: 2.9.0
150
+ type: :development
151
+ prerelease: false
152
+ version_requirements: !ruby/object:Gem::Requirement
153
+ none: false
154
+ requirements:
155
+ - - ! '>='
156
+ - !ruby/object:Gem::Version
157
+ version: 2.9.0
158
+ - !ruby/object:Gem::Dependency
159
+ name: mocha
160
+ requirement: !ruby/object:Gem::Requirement
161
+ none: false
162
+ requirements:
163
+ - - '='
164
+ - !ruby/object:Gem::Version
165
+ version: 0.10.5
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ none: false
170
+ requirements:
171
+ - - '='
172
+ - !ruby/object:Gem::Version
173
+ version: 0.10.5
174
+ description: A mixin library for ActiveFedora. Generates dynamic finder methods operating
175
+ against the FCRepo object search terms (DCES elements and object properties).
176
+ email:
177
+ - armintor@gmail.com
178
+ executables: []
179
+ extensions: []
180
+ extra_rdoc_files:
181
+ - LICENSE.txt
182
+ - README.textile
183
+ files:
184
+ - Gemfile
185
+ - LICENSE.txt
186
+ - README.textile
187
+ - Rakefile
188
+ - active_fedora_finders.gemspec
189
+ - lib/active_fedora_finders.rb
190
+ - lib/active_fedora_finders/version.rb
191
+ - lib/tasks/af_finders_dev.rake
192
+ - spec/config_helper.rb
193
+ - spec/finders_spec.rb
194
+ - spec/fixtures/find_multiple.xml
195
+ - spec/fixtures/find_none.xml
196
+ - spec/fixtures/find_one.xml
197
+ - spec/spec_helper.rb
198
+ - spec/support/mock_fedora.rb
199
+ homepage: https://github.com/barmintor/active_fedora_finders
200
+ licenses: []
201
+ post_install_message:
202
+ rdoc_options: []
203
+ require_paths:
204
+ - lib
205
+ required_ruby_version: !ruby/object:Gem::Requirement
206
+ none: false
207
+ requirements:
208
+ - - ! '>='
209
+ - !ruby/object:Gem::Version
210
+ version: '0'
211
+ required_rubygems_version: !ruby/object:Gem::Requirement
212
+ none: false
213
+ requirements:
214
+ - - ! '>='
215
+ - !ruby/object:Gem::Version
216
+ version: '0'
217
+ requirements: []
218
+ rubyforge_project:
219
+ rubygems_version: 1.8.24
220
+ signing_key:
221
+ specification_version: 3
222
+ summary: A library for adding ActiveRecord-style dynamic finders to ActiveFedora::Base
223
+ subclasses.
224
+ test_files:
225
+ - spec/config_helper.rb
226
+ - spec/finders_spec.rb
227
+ - spec/fixtures/find_multiple.xml
228
+ - spec/fixtures/find_none.xml
229
+ - spec/fixtures/find_one.xml
230
+ - spec/spec_helper.rb
231
+ - spec/support/mock_fedora.rb
232
+ has_rdoc: