montague 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (45) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/CHANGELOG.md +17 -0
  4. data/Gemfile +4 -0
  5. data/README.md +138 -0
  6. data/Rakefile +2 -0
  7. data/lib/montague.rb +9 -0
  8. data/lib/montague/api/api.rb +12 -0
  9. data/lib/montague/api/base.rb +27 -0
  10. data/lib/montague/api/client.rb +27 -0
  11. data/lib/montague/api/journal.rb +52 -0
  12. data/lib/montague/api/publisher.rb +52 -0
  13. data/lib/montague/model/archiving.rb +26 -0
  14. data/lib/montague/model/copyright_link.rb +26 -0
  15. data/lib/montague/model/funder.rb +26 -0
  16. data/lib/montague/model/header.rb +22 -0
  17. data/lib/montague/model/journal.rb +26 -0
  18. data/lib/montague/model/journal_report.rb +15 -0
  19. data/lib/montague/model/journals_report.rb +15 -0
  20. data/lib/montague/model/mandate.rb +44 -0
  21. data/lib/montague/model/model.rb +22 -0
  22. data/lib/montague/model/paid_access.rb +34 -0
  23. data/lib/montague/model/publisher.rb +46 -0
  24. data/lib/montague/model/publisher_report.rb +12 -0
  25. data/lib/montague/model/publishers_report.rb +14 -0
  26. data/lib/montague/model/report_header_mixin.rb +12 -0
  27. data/lib/montague/model/report_http_response_mixin.rb +12 -0
  28. data/lib/montague/model/report_publisher_mixin.rb +12 -0
  29. data/lib/montague/model/structure.rb +18 -0
  30. data/lib/montague/reporter/journal.rb +26 -0
  31. data/lib/montague/reporter/journals.rb +26 -0
  32. data/lib/montague/reporter/publisher.rb +24 -0
  33. data/lib/montague/reporter/publishers.rb +24 -0
  34. data/lib/montague/reporter/reporter.rb +11 -0
  35. data/lib/montague/version.rb +5 -0
  36. data/lib/montague/xml_extractor/base.rb +58 -0
  37. data/lib/montague/xml_extractor/header.rb +43 -0
  38. data/lib/montague/xml_extractor/journal.rb +31 -0
  39. data/lib/montague/xml_extractor/publisher.rb +164 -0
  40. data/lib/montague/xml_extractor/xml_extractor.rb +13 -0
  41. data/montague.gemspec +22 -0
  42. data/test/test_helper.rb +102 -0
  43. data/test/test_search_by_journal.rb +90 -0
  44. data/test/test_search_by_publisher_api.rb +36 -0
  45. metadata +131 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 5226c19f5fadffaa16d55605546efceb1a8c20ad
4
+ data.tar.gz: e17f0ad06b2dee8460b17c30d15209ec2d35d611
5
+ SHA512:
6
+ metadata.gz: fbc04e1e3037e14f53f481c9e8cfacbe99daeb03282e2d3731fc7df6269bec12ebd7498e126d5e2d05408f857d90be9a60f20348ee1374990cddbaec1cb32d14
7
+ data.tar.gz: 88e6fc0cd58ad35adb326549b84ad34faf2c0b3834cc001a4f03d09b3f22497a830adff0b34df30bcf875d32712c6498c9c6637d03537cb6619c8599cf38bbbf
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .idea
data/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # Change Log
2
+ All notable changes to this project will be documented in this file.
3
+ This project adheres to [Semantic Versioning](http://semver.org/).
4
+
5
+ ## 0.2.0 - 2018-02-09
6
+ ### Removed
7
+ - Language support.
8
+
9
+ ## 0.1.1 - 2018-02-07
10
+ ### Changed
11
+ - Language support - string keyword argument replaced by symbol.
12
+
13
+ ## 0.1.0 - 2018-02-06
14
+ ### Added
15
+ - For SHERPA/RoMEO API v2.9.
16
+ - Find publisher indirectly using journal search by ISSN, search by title.
17
+ - Find publisher directly using publisher search by name, search by ID.
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source "https://rubygems.org"
2
+
3
+ # Specify your gem's dependencies in montague.gemspec
4
+ gemspec
data/README.md ADDED
@@ -0,0 +1,138 @@
1
+ # Montague
2
+
3
+ Wrapper for the SHERPA/RoMEO API.
4
+
5
+ ## Status
6
+
7
+ [![Gem Version](https://badge.fury.io/rb/montague.svg)](https://badge.fury.io/rb/montague)
8
+ [![Maintainability](https://api.codeclimate.com/v1/badges/73f9d8be3f61882a8ec6/maintainability)](https://codeclimate.com/github/lulibrary/montague/maintainability)
9
+
10
+ ## Installation
11
+
12
+ Add this line to your application's Gemfile:
13
+
14
+ ```ruby
15
+ gem 'montague'
16
+ ```
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ Or install it yourself as:
23
+
24
+ $ gem install montague
25
+
26
+ ## Usage
27
+
28
+ Discover a publisher's copyright and archiving policies by searching for a publisher directly or by searching for a publisher indirectly via a journal.
29
+
30
+ <a href="http://www.sherpa.ac.uk/romeo.php"><img src="http://www.sherpa.ac.uk/images/romeosmall.jpg" width="100" height="54" alt="SHERPA/RoMEO Database" border="0"></a>
31
+
32
+ ### Journal search
33
+ ```ruby
34
+ # without API key
35
+ journals = Montague::API::Journal.new
36
+ # with API key
37
+ journals = Montague::API::Journal.new api_key: 'YOUR_API_KEY'
38
+ ```
39
+
40
+ #### Find by journal ISSN
41
+
42
+ ```ruby
43
+ report = journals.find_by_issn '1550-7998'
44
+ #=> #<Montague::Model::JournalReport:0x00c0ffee ...>
45
+ report.journal
46
+ #=> #<Montague::Model::Journal:0x00c0ffee @title="Physical Review D - Particles, Fields, Gravitation and Cosmology", @issn="1550-7998">
47
+ report.publisher
48
+ #=> #<Montague::Model::Publisher:0x00c0ffee ...>
49
+ report.publisher.name
50
+ #=> "American Physical Society"
51
+ report.publisher.conditions
52
+ #=> ["On author's personal website, employer's website or institutional repository", ...]
53
+ report.publisher.pre_prints
54
+ #=> #<Montague::Model::Archiving:0x00c0ffee @permission="can", @restrictions=[]>
55
+ report.publisher.romeo_colour
56
+ #=> "green"
57
+ report.publisher.mandates
58
+ #=> [#<Montague::Model::Mandate:0x00c0ffee @funder=#<Montague::Model::Funder:0x00c0ffee @name="Australian Research Council", @acronym="ARC">, @publisher_complies="yes", @compliance_type="Compliant", @selected_titles="no">, ...]
59
+ ```
60
+
61
+ ```ruby
62
+ # alternative numbers for a journal, typically ESSN and ISSN
63
+ report = journals.find_by_issn '1552-3535,0013-1245'
64
+ report.journal
65
+ #=> #<Montague::Model::Journal:0xb3969e8 @title="Education and Urban Society", @issn="0013-1245">
66
+ report.publisher
67
+ #=> #<Montague::Model::Publisher:0x00c0ffee ...>
68
+ ```
69
+
70
+ #### Find by journal title
71
+ ```ruby
72
+ report = journals.find_by_title text: 'modern language', filter: :contains
73
+ #=> #<Montague::Model::JournalsReport:0x00c0ffee ...>
74
+ report.journals.size
75
+ #=> 13
76
+ report.journals
77
+ #=> [#<Montague::Model::Journal:0xacf4aa4 @title="Canadian Modern Language Review / Revue canadian des langues vivantes", @issn="0008-4506">, ...]
78
+ report.publisher
79
+ #=> nil
80
+ ```
81
+
82
+ ```ruby
83
+ # example of when the publisher is not available for a journal
84
+ report = journals.find_by_title text: 'Man', filter: :exact
85
+ #=> #<Montague::Model::JournalsReport:0x00c0ffee ...>
86
+ report.journals.size
87
+ #=> 1
88
+ report.publisher
89
+ #=> nil
90
+ ```
91
+
92
+ ### Publisher search
93
+ ```ruby
94
+ # without API key
95
+ publishers = Montague::API::Publisher.new
96
+ # with API key
97
+ publishers = Montague::API::Publisher.new api_key: 'YOUR_API_KEY'
98
+ ```
99
+
100
+ #### Find by publisher name
101
+ ```ruby
102
+ report = publishers.find_by_name text: 'institute', filter: :exact
103
+ #=> #<Montague::Model::PublishersReport:0x00c0ffee ...>
104
+ report.publishers.size
105
+ #=> 122
106
+ ```
107
+
108
+ #### Find by publisher ID (RoMEO)
109
+ ```ruby
110
+ report = publishers.find_by_id 10
111
+ #=> #<Montague::Model::PublisherReport:0x00c0ffee ...>
112
+ report.publisher
113
+ #=> #<Montague::Model::Publisher:0x00c0ffee ...>
114
+ ```
115
+
116
+ ### Search client
117
+ ```ruby
118
+ # without API key
119
+ client = Montague::API::Client.new
120
+ # with API key
121
+ client = Montague::API::Client.new api_key: 'YOUR_API_KEY'
122
+ ```
123
+
124
+ ```ruby
125
+ report = client.journals.find_by_issn '1550-7998'
126
+ #=> #<Montague::Model::JournalReport:0x00c0ffee ...>
127
+ report.publisher
128
+ #=> #<Montague::Model::Publisher:0x00c0ffee ...>
129
+ ```
130
+
131
+ ### Inspecting reports
132
+ ```ruby
133
+ report.header
134
+ #=> #<Montague::Model::Header:0x00c0ffee @api_control="journal", @hits=1, @message=nil, @outcome="singleJournal">
135
+ report.http_response
136
+ #=> #<HTTP::Response/1.1 200 OK {"Date"=>"Fri, 02 Feb 2018 11:34:38 GMT", "Server"=>"Apache/2.4.7 (Ubuntu)", "X-Powered-By"=>"PHP/5.5.9-1ubuntu4.22", "Access-Control-Allow-Origin"=>"*", "Vary"=>"Accept-Encoding", "Content-Length"=>"5056", "Connection"=>"close", "Content-Type"=>"text/xml"}>
137
+ ```
138
+
data/Rakefile ADDED
@@ -0,0 +1,2 @@
1
+ require "bundler/gem_tasks"
2
+ task :default => :spec
data/lib/montague.rb ADDED
@@ -0,0 +1,9 @@
1
+ require 'montague/api/api'
2
+ require 'montague/model/model'
3
+ require 'montague/reporter/reporter'
4
+ require 'montague/xml_extractor/xml_extractor'
5
+
6
+ # Wrapper for the SHERPA/RoMEO API
7
+ #
8
+ module Montague
9
+ end
@@ -0,0 +1,12 @@
1
+ require 'http'
2
+ require 'montague/api/base'
3
+ require 'montague/api/journal'
4
+ require 'montague/api/publisher'
5
+ require 'montague/api/client'
6
+
7
+ module Montague
8
+ # Requests for a resource
9
+ #
10
+ module API
11
+ end
12
+ end
@@ -0,0 +1,27 @@
1
+ module Montague
2
+
3
+ module API
4
+
5
+ # Base API
6
+ #
7
+ class Base
8
+
9
+ # @param config [Hash]
10
+ # @option config [String] :api_url URL of the SHERPA/RoMEO service (if it changes)
11
+ # @option config [String] :api_key API key of the SHERPA/RoMEO service user
12
+ def initialize(config = {})
13
+ @config = config
14
+ @config[:api_url] = 'http://www.sherpa.ac.uk/romeo/api29.php' unless config[:api_url]
15
+ end
16
+
17
+ private
18
+
19
+ def common_parameters
20
+ "&showfunder=all&ak=#{@config[:api_key]}"
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,27 @@
1
+ module Montague
2
+
3
+ module API
4
+
5
+ # API client
6
+ #
7
+ class Client < Montague::API::Base
8
+ # (see Montague::API::Base#initialize)
9
+ def initialize(config = {})
10
+ super
11
+ end
12
+
13
+ # @return [Montague::API::Journal]
14
+ def journals
15
+ Montague::API::Journal.new @config
16
+ end
17
+
18
+ # @return [Montague::API::Publisher]
19
+ def publishers
20
+ Montague::API::Publisher.new @config
21
+ end
22
+
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -0,0 +1,52 @@
1
+ module Montague
2
+
3
+ module API
4
+
5
+ # Journal API
6
+ #
7
+ class Journal < Montague::API::Base
8
+
9
+ # (see Montague::API::Base#initialize)
10
+ def initialize(config = {})
11
+ super
12
+ end
13
+
14
+ # @param issn [String] International Standard Serial Number e.g. 1234-5678.
15
+ # @return (see #journal_report)
16
+ def find_by_issn(issn)
17
+ url = "#{@config[:api_url]}?issn=#{issn}#{common_parameters}"
18
+ response = HTTP.get URI.encode(url)
19
+ journal_report response
20
+ end
21
+
22
+ # @param text [String] Multiple words treated as a single string. Case insensitive.
23
+ # @param filter [Symbol]
24
+ # * :exact - Verbatim e.g. 'Journal of Geology'
25
+ # * :starts - Starts with e.g. 'machine'
26
+ # * :contains - Contains e.g. 'modern language'
27
+ # @return (see #journals_report)
28
+ def find_by_title(text:, filter: :exact)
29
+ url = "#{@config[:api_url]}?jtitle=#{text}&qtype=#{filter}#{common_parameters}"
30
+ response = HTTP.get URI.encode(url)
31
+ journals_report response
32
+ end
33
+
34
+ private
35
+
36
+ # @return [Montague::Model::JournalReport]
37
+ def journal_report(response)
38
+ reporter = Montague::Reporter::Journal.new response
39
+ reporter.report
40
+ end
41
+
42
+ # @return [Montague::Model::JournalsReport]
43
+ def journals_report(response)
44
+ reporter = Montague::Reporter::Journals.new response
45
+ reporter.report
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,52 @@
1
+ module Montague
2
+
3
+ module API
4
+
5
+ # Publisher API
6
+ #
7
+ class Publisher < Montague::API::Base
8
+
9
+ # (see Montague::API::Base#initialize)
10
+ def initialize(config = {})
11
+ super
12
+ end
13
+
14
+ # @param id [Fixnum] RoMEO persistent ID
15
+ # @return (see #publisher_report)
16
+ def find_by_id(id)
17
+ url = "#{@config[:api_url]}?id=#{id}#{common_parameters}"
18
+ response = HTTP.get URI.encode(url)
19
+ publisher_report response
20
+ end
21
+
22
+ # @param text [String] e.g. 'optical society'
23
+ # @param filter [Symbol]
24
+ # * :all - All words present but in any order or location
25
+ # * :any - At least one of the words present
26
+ # * :exact - Intact phrase somewhere e.g. 'tute of'
27
+ # @return (see #publishers_report)
28
+ def find_by_name(text:, filter: :all)
29
+ url = "#{@config[:api_url]}?pub=#{text}&qtype=#{filter}#{common_parameters}"
30
+ response = HTTP.get URI.encode(url)
31
+ publishers_report response
32
+ end
33
+
34
+ private
35
+
36
+ # @return [Montague::Model::PublishersReport]
37
+ def publishers_report(response)
38
+ reporter = Montague::Reporter::Publishers.new response
39
+ reporter.report
40
+ end
41
+
42
+ # @return [Montague::Model::PublisherReport]
43
+ def publisher_report(response)
44
+ reporter = Montague::Reporter::Publisher.new response
45
+ reporter.report
46
+ end
47
+
48
+ end
49
+
50
+ end
51
+
52
+ end
@@ -0,0 +1,26 @@
1
+ module Montague
2
+ module Model
3
+
4
+ # Archiving
5
+ #
6
+ class Archiving < Montague::Model::Structure
7
+
8
+ # @return [String, nil]
9
+ attr_reader :permission
10
+
11
+ # @return [Array<String>]
12
+ attr_reader :restrictions
13
+
14
+ # @param v [String]
15
+ def permission=(v)
16
+ @permission = v if v && !v.empty?
17
+ end
18
+
19
+ # @param v [Array]
20
+ def restrictions=(v)
21
+ @restrictions = v if v
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module Montague
2
+ module Model
3
+
4
+ # Copyright link
5
+ #
6
+ class CopyrightLink < Montague::Model::Structure
7
+
8
+ # @return [String, nil]
9
+ attr_reader :text
10
+
11
+ # @return [String, nil]
12
+ attr_reader :url
13
+
14
+ # @param v [String]
15
+ def text=(v)
16
+ @text = v if v && !v.empty?
17
+ end
18
+
19
+ # @param v [String]
20
+ def url=(v)
21
+ @url = v if v && !v.empty?
22
+ end
23
+
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ module Montague
2
+ module Model
3
+
4
+ # Funder
5
+ #
6
+ class Funder < Montague::Model::Structure
7
+
8
+ # @return [String, nil]
9
+ attr_reader :acronym
10
+
11
+ # @return [String, nil]
12
+ attr_reader :name
13
+
14
+ # @param v [String]
15
+ def acronym=(v)
16
+ @acronym = v if v && !v.empty?
17
+ end
18
+
19
+ # @param v [String]
20
+ def name=(v)
21
+ @name = v if v && !v.empty?
22
+ end
23
+
24
+ end
25
+ end
26
+ end