serrano 0.0.7
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.
- checksums.yaml +7 -0
 - data/.gitignore +36 -0
 - data/.travis.yml +4 -0
 - data/CONDUCT.md +25 -0
 - data/Gemfile +3 -0
 - data/Gemfile.lock +56 -0
 - data/LICENSE +7 -0
 - data/NEWS.md +3 -0
 - data/README.md +128 -0
 - data/Rakefile +41 -0
 - data/lib/serrano.rb +440 -0
 - data/lib/serrano/cn.rb +30 -0
 - data/lib/serrano/cnrequest.rb +83 -0
 - data/lib/serrano/constants.rb +36 -0
 - data/lib/serrano/errors.rb +67 -0
 - data/lib/serrano/filterhandler.rb +58 -0
 - data/lib/serrano/filters.rb +84 -0
 - data/lib/serrano/helpers/configuration.rb +26 -0
 - data/lib/serrano/mine_utils.rb +65 -0
 - data/lib/serrano/mined.rb +31 -0
 - data/lib/serrano/miner.rb +42 -0
 - data/lib/serrano/request.rb +99 -0
 - data/lib/serrano/version.rb +3 -0
 - data/serrano.gemspec +35 -0
 - metadata +253 -0
 
    
        checksums.yaml
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            ---
         
     | 
| 
      
 2 
     | 
    
         
            +
            SHA1:
         
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 00aa3283924fc74b4a2634759602caa5516b26e3
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: bd653f31833befbb3dd5be3a4fff893e22e13756
         
     | 
| 
      
 5 
     | 
    
         
            +
            SHA512:
         
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 874a4e19e0ac4439c75be43782d7da74adf00a082d4352e6d13458fdaac442d5048fda4faf7db5f747c76220821a4b5a1270477bf931d5202842604358f2bfe7
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: ffb5ebb232ef610865833c6b147be959a7313a8b3904bdd429aa2cac17548879693df195d91cb31a40009ce8d3a59bec46e16dfad0c5a16895d04bd3fcb8ae87
         
     | 
    
        data/.gitignore
    ADDED
    
    | 
         @@ -0,0 +1,36 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            *.gem
         
     | 
| 
      
 2 
     | 
    
         
            +
            *.rbc
         
     | 
| 
      
 3 
     | 
    
         
            +
            /.config
         
     | 
| 
      
 4 
     | 
    
         
            +
            /coverage/
         
     | 
| 
      
 5 
     | 
    
         
            +
            /InstalledFiles
         
     | 
| 
      
 6 
     | 
    
         
            +
            /pkg/
         
     | 
| 
      
 7 
     | 
    
         
            +
            /spec/reports/
         
     | 
| 
      
 8 
     | 
    
         
            +
            /test/tmp/
         
     | 
| 
      
 9 
     | 
    
         
            +
            /test/version_tmp/
         
     | 
| 
      
 10 
     | 
    
         
            +
            /tmp/
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            ## Specific to RubyMotion:
         
     | 
| 
      
 13 
     | 
    
         
            +
            .dat*
         
     | 
| 
      
 14 
     | 
    
         
            +
            .repl_history
         
     | 
| 
      
 15 
     | 
    
         
            +
            build/
         
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
      
 17 
     | 
    
         
            +
            ## Documentation cache and generated files:
         
     | 
| 
      
 18 
     | 
    
         
            +
            /.yardoc/
         
     | 
| 
      
 19 
     | 
    
         
            +
            /_yardoc/
         
     | 
| 
      
 20 
     | 
    
         
            +
            /doc/
         
     | 
| 
      
 21 
     | 
    
         
            +
            /rdoc/
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            ## Environment normalisation:
         
     | 
| 
      
 24 
     | 
    
         
            +
            /.bundle/
         
     | 
| 
      
 25 
     | 
    
         
            +
            /lib/bundler/man/
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
            # for a library or gem, you might want to ignore these files since the code is
         
     | 
| 
      
 28 
     | 
    
         
            +
            # intended to run in multiple environments; otherwise, check them in:
         
     | 
| 
      
 29 
     | 
    
         
            +
            #Gemfile.lock
         
     | 
| 
      
 30 
     | 
    
         
            +
            .ruby-version
         
     | 
| 
      
 31 
     | 
    
         
            +
            .ruby-gemset
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
         
     | 
| 
      
 34 
     | 
    
         
            +
            .rvmrc
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            cache/
         
     | 
    
        data/.travis.yml
    ADDED
    
    
    
        data/CONDUCT.md
    ADDED
    
    | 
         @@ -0,0 +1,25 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            # Contributor Code of Conduct
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            As contributors and maintainers of this project, we pledge to respect all people who 
         
     | 
| 
      
 4 
     | 
    
         
            +
            contribute through reporting issues, posting feature requests, updating documentation,
         
     | 
| 
      
 5 
     | 
    
         
            +
            submitting pull requests or patches, and other activities.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            We are committed to making participation in this project a harassment-free experience for
         
     | 
| 
      
 8 
     | 
    
         
            +
            everyone, regardless of level of experience, gender, gender identity and expression,
         
     | 
| 
      
 9 
     | 
    
         
            +
            sexual orientation, disability, personal appearance, body size, race, ethnicity, age, or religion.
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Examples of unacceptable behavior by participants include the use of sexual language or
         
     | 
| 
      
 12 
     | 
    
         
            +
            imagery, derogatory comments or personal attacks, trolling, public or private harassment,
         
     | 
| 
      
 13 
     | 
    
         
            +
            insults, or other unprofessional conduct.
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
            Project maintainers have the right and responsibility to remove, edit, or reject comments,
         
     | 
| 
      
 16 
     | 
    
         
            +
            commits, code, wiki edits, issues, and other contributions that are not aligned to this 
         
     | 
| 
      
 17 
     | 
    
         
            +
            Code of Conduct. Project maintainers who do not follow the Code of Conduct may be removed 
         
     | 
| 
      
 18 
     | 
    
         
            +
            from the project team.
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by 
         
     | 
| 
      
 21 
     | 
    
         
            +
            opening an issue or contacting one or more of the project maintainers.
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            This Code of Conduct is adapted from the Contributor Covenant 
         
     | 
| 
      
 24 
     | 
    
         
            +
            (http:contributor-covenant.org), version 1.0.0, available at 
         
     | 
| 
      
 25 
     | 
    
         
            +
            http://contributor-covenant.org/version/1/0/0/
         
     | 
    
        data/Gemfile
    ADDED
    
    
    
        data/Gemfile.lock
    ADDED
    
    | 
         @@ -0,0 +1,56 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            PATH
         
     | 
| 
      
 2 
     | 
    
         
            +
              remote: .
         
     | 
| 
      
 3 
     | 
    
         
            +
              specs:
         
     | 
| 
      
 4 
     | 
    
         
            +
                serrano (0.0.7)
         
     | 
| 
      
 5 
     | 
    
         
            +
                  faraday (~> 0.9.1)
         
     | 
| 
      
 6 
     | 
    
         
            +
                  faraday_middleware (~> 0.10.0)
         
     | 
| 
      
 7 
     | 
    
         
            +
                  multi_json (~> 1.0)
         
     | 
| 
      
 8 
     | 
    
         
            +
                  nokogiri (~> 1.6, >= 1.6.6.2)
         
     | 
| 
      
 9 
     | 
    
         
            +
                  thor (~> 0.19)
         
     | 
| 
      
 10 
     | 
    
         
            +
                  uuidtools (~> 2.1, >= 2.1.5)
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            GEM
         
     | 
| 
      
 13 
     | 
    
         
            +
              remote: https://rubygems.org/
         
     | 
| 
      
 14 
     | 
    
         
            +
              specs:
         
     | 
| 
      
 15 
     | 
    
         
            +
                codecov (0.1.1)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  json
         
     | 
| 
      
 17 
     | 
    
         
            +
                  simplecov
         
     | 
| 
      
 18 
     | 
    
         
            +
                  url
         
     | 
| 
      
 19 
     | 
    
         
            +
                docile (1.1.5)
         
     | 
| 
      
 20 
     | 
    
         
            +
                faraday (0.9.1)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  multipart-post (>= 1.2, < 3)
         
     | 
| 
      
 22 
     | 
    
         
            +
                faraday_middleware (0.10.0)
         
     | 
| 
      
 23 
     | 
    
         
            +
                  faraday (>= 0.7.4, < 0.10)
         
     | 
| 
      
 24 
     | 
    
         
            +
                json (1.8.3)
         
     | 
| 
      
 25 
     | 
    
         
            +
                mini_portile (0.6.2)
         
     | 
| 
      
 26 
     | 
    
         
            +
                multi_json (1.11.2)
         
     | 
| 
      
 27 
     | 
    
         
            +
                multipart-post (2.0.0)
         
     | 
| 
      
 28 
     | 
    
         
            +
                nokogiri (1.6.6.2)
         
     | 
| 
      
 29 
     | 
    
         
            +
                  mini_portile (~> 0.6.0)
         
     | 
| 
      
 30 
     | 
    
         
            +
                power_assert (0.2.4)
         
     | 
| 
      
 31 
     | 
    
         
            +
                rake (10.4.2)
         
     | 
| 
      
 32 
     | 
    
         
            +
                simplecov (0.10.0)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  docile (~> 1.1.0)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  json (~> 1.8)
         
     | 
| 
      
 35 
     | 
    
         
            +
                  simplecov-html (~> 0.10.0)
         
     | 
| 
      
 36 
     | 
    
         
            +
                simplecov-html (0.10.0)
         
     | 
| 
      
 37 
     | 
    
         
            +
                test-unit (3.1.3)
         
     | 
| 
      
 38 
     | 
    
         
            +
                  power_assert
         
     | 
| 
      
 39 
     | 
    
         
            +
                thor (0.19.1)
         
     | 
| 
      
 40 
     | 
    
         
            +
                url (0.3.2)
         
     | 
| 
      
 41 
     | 
    
         
            +
                uuidtools (2.1.5)
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
            PLATFORMS
         
     | 
| 
      
 44 
     | 
    
         
            +
              ruby
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            DEPENDENCIES
         
     | 
| 
      
 47 
     | 
    
         
            +
              bundler (~> 1.6)
         
     | 
| 
      
 48 
     | 
    
         
            +
              codecov (~> 0.1)
         
     | 
| 
      
 49 
     | 
    
         
            +
              json (~> 1.8, >= 1.8.3)
         
     | 
| 
      
 50 
     | 
    
         
            +
              rake (~> 10.4)
         
     | 
| 
      
 51 
     | 
    
         
            +
              serrano!
         
     | 
| 
      
 52 
     | 
    
         
            +
              simplecov (~> 0.10)
         
     | 
| 
      
 53 
     | 
    
         
            +
              test-unit (~> 3.1)
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            BUNDLED WITH
         
     | 
| 
      
 56 
     | 
    
         
            +
               1.10.6
         
     | 
    
        data/LICENSE
    ADDED
    
    | 
         @@ -0,0 +1,7 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            Copyright (C) 2015 Scott Chamberlain
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
            Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
         
     | 
    
        data/NEWS.md
    ADDED
    
    
    
        data/README.md
    ADDED
    
    | 
         @@ -0,0 +1,128 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            serrano
         
     | 
| 
      
 2 
     | 
    
         
            +
            =========
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            [](https://travis-ci.org/sckott/serrano)
         
     | 
| 
      
 5 
     | 
    
         
            +
            [](http://codecov.io/github/sckott/serrano?branch=master)
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            `serrano` is a low level client for Crossref APIs
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
      
 9 
     | 
    
         
            +
            Docs: http://recology.info/serrano/
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            Other Crossref API clients:
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            - Python: [habanero](https://github.com/sckott/habanero)
         
     | 
| 
      
 14 
     | 
    
         
            +
            - R: [rcrossref](https://github.com/ropensci/rcrossref)
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
            ## Changes
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            For changes see the [NEWS file](NEWS.md).
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            ## API
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            Methods in relation to [Crossref search API][crapi] routes
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            * `/works` - `Serrano.works()`
         
     | 
| 
      
 25 
     | 
    
         
            +
            * `/members` - `Serrano.members()`
         
     | 
| 
      
 26 
     | 
    
         
            +
            * `/prefixes` - `Serrano.prefixes()`
         
     | 
| 
      
 27 
     | 
    
         
            +
            * `/funders` - `Serrano.funders()`
         
     | 
| 
      
 28 
     | 
    
         
            +
            * `/journals` - `Serrano.journals()`
         
     | 
| 
      
 29 
     | 
    
         
            +
            * `/licenses` - `Serrano.licenses()`
         
     | 
| 
      
 30 
     | 
    
         
            +
            * `/types` - `Serrano.types()`
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
            Additional methods built on top of the Crossref search API:
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            * DOI minting agency - `Serrano.agency()`
         
     | 
| 
      
 35 
     | 
    
         
            +
            * Get random DOIs - `Serrano.random_dois()`
         
     | 
| 
      
 36 
     | 
    
         
            +
             
     | 
| 
      
 37 
     | 
    
         
            +
            Other methods:
         
     | 
| 
      
 38 
     | 
    
         
            +
             
     | 
| 
      
 39 
     | 
    
         
            +
            * [Conent negotiation][cn] - `Serrano.cn()`
         
     | 
| 
      
 40 
     | 
    
         
            +
            * [Text and data mining][tdm] - `Serrano.text()`
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
            ## Install
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            ### Release version
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
            ```
         
     | 
| 
      
 47 
     | 
    
         
            +
            gem install serrano
         
     | 
| 
      
 48 
     | 
    
         
            +
            ```
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            ### Development version
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            ```
         
     | 
| 
      
 53 
     | 
    
         
            +
            git clone git@github.com:sckott/serrano.git
         
     | 
| 
      
 54 
     | 
    
         
            +
            cd serrano
         
     | 
| 
      
 55 
     | 
    
         
            +
            rake install
         
     | 
| 
      
 56 
     | 
    
         
            +
            ```
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            ## Setup
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            Crossref's API will likely be used by others in the future, allowing the base URL to be swapped out. You can swap out the base URL by passing named options in a block to `Serrano.configuration`. 
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            This will also be the way to set up other user options, as needed down the road.
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 65 
     | 
    
         
            +
            Serrano.configuration do |config|
         
     | 
| 
      
 66 
     | 
    
         
            +
              config.base_url = "http://api.crossref.org"
         
     | 
| 
      
 67 
     | 
    
         
            +
            end
         
     | 
| 
      
 68 
     | 
    
         
            +
            ```
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            ## Examples
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
            Search works by DOI
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 75 
     | 
    
         
            +
            require 'serrano'
         
     | 
| 
      
 76 
     | 
    
         
            +
            Serrano.works(doi: '10.1371/journal.pone.0033693')
         
     | 
| 
      
 77 
     | 
    
         
            +
            ```
         
     | 
| 
      
 78 
     | 
    
         
            +
             
     | 
| 
      
 79 
     | 
    
         
            +
            Search works by query string
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 82 
     | 
    
         
            +
            Serrano.works(query: "ecology")
         
     | 
| 
      
 83 
     | 
    
         
            +
            ```
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
            Search journals by publisher name
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 88 
     | 
    
         
            +
            Serrano.journals(query: "peerj")
         
     | 
| 
      
 89 
     | 
    
         
            +
            ```
         
     | 
| 
      
 90 
     | 
    
         
            +
             
     | 
| 
      
 91 
     | 
    
         
            +
            Search funding information by DOI
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 94 
     | 
    
         
            +
            Serrano.funders(ids: ['10.13039/100000001','10.13039/100000015'])
         
     | 
| 
      
 95 
     | 
    
         
            +
            ```
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
            Get agency for a set of DOIs
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 100 
     | 
    
         
            +
            Serrano.agency(ids: ['10.1007/12080.1874-1746','10.1007/10452.1573-5125'])
         
     | 
| 
      
 101 
     | 
    
         
            +
            ```
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            Get random set of DOIs
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 106 
     | 
    
         
            +
            Serrano.random_dois(sample: 100)
         
     | 
| 
      
 107 
     | 
    
         
            +
            ```
         
     | 
| 
      
 108 
     | 
    
         
            +
             
     | 
| 
      
 109 
     | 
    
         
            +
            Content negotiation
         
     | 
| 
      
 110 
     | 
    
         
            +
             
     | 
| 
      
 111 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 112 
     | 
    
         
            +
            Serrano.cn(ids: '10.1126/science.169.3946.635', format: "citeproc-json")
         
     | 
| 
      
 113 
     | 
    
         
            +
            ```
         
     | 
| 
      
 114 
     | 
    
         
            +
             
     | 
| 
      
 115 
     | 
    
         
            +
            Text mining
         
     | 
| 
      
 116 
     | 
    
         
            +
             
     | 
| 
      
 117 
     | 
    
         
            +
            ```ruby
         
     | 
| 
      
 118 
     | 
    
         
            +
            res = Serrano.text(url: 'http://...');
         
     | 
| 
      
 119 
     | 
    
         
            +
            ```
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
            ## Meta
         
     | 
| 
      
 122 
     | 
    
         
            +
             
     | 
| 
      
 123 
     | 
    
         
            +
            * Please note that this project is released with a [Contributor Code of Conduct](CONDUCT.md). By participating in this project you agree to abide by its terms.
         
     | 
| 
      
 124 
     | 
    
         
            +
            * License: MIT
         
     | 
| 
      
 125 
     | 
    
         
            +
             
     | 
| 
      
 126 
     | 
    
         
            +
            [crapi]: https://github.com/CrossRef/rest-api-doc/blob/master/rest_api.md
         
     | 
| 
      
 127 
     | 
    
         
            +
            [cn]: http://www.crosscite.org/cn/
         
     | 
| 
      
 128 
     | 
    
         
            +
            [tdm]: http://www.crossref.org/tdm/
         
     | 
    
        data/Rakefile
    ADDED
    
    | 
         @@ -0,0 +1,41 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "bundler/gem_tasks"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require 'rake/testtask'
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            Rake::TestTask.new do |t|
         
     | 
| 
      
 5 
     | 
    
         
            +
              t.libs << "test"
         
     | 
| 
      
 6 
     | 
    
         
            +
              t.test_files = FileList['test/test-*.rb']
         
     | 
| 
      
 7 
     | 
    
         
            +
              t.verbose = true
         
     | 
| 
      
 8 
     | 
    
         
            +
            end
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            desc "Run tests"
         
     | 
| 
      
 11 
     | 
    
         
            +
            task :default => :test
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
            desc "Build serrano docs"
         
     | 
| 
      
 14 
     | 
    
         
            +
            task :docs do
         
     | 
| 
      
 15 
     | 
    
         
            +
            	system "yardoc"
         
     | 
| 
      
 16 
     | 
    
         
            +
            end
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            desc "bundle install"
         
     | 
| 
      
 19 
     | 
    
         
            +
            task :b do
         
     | 
| 
      
 20 
     | 
    
         
            +
              system "bundle install"
         
     | 
| 
      
 21 
     | 
    
         
            +
            end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
            desc "bundle install"
         
     | 
| 
      
 24 
     | 
    
         
            +
            task :clean do
         
     | 
| 
      
 25 
     | 
    
         
            +
              system "ls | grep [0-9].gem | xargs rm"
         
     | 
| 
      
 26 
     | 
    
         
            +
            end
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            desc "Build serrano"
         
     | 
| 
      
 29 
     | 
    
         
            +
            task :build do
         
     | 
| 
      
 30 
     | 
    
         
            +
            	system "gem build serrano.gemspec"
         
     | 
| 
      
 31 
     | 
    
         
            +
            end
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
            desc "Install serrano"
         
     | 
| 
      
 34 
     | 
    
         
            +
            task :install => :build do
         
     | 
| 
      
 35 
     | 
    
         
            +
            	system "gem install serrano-#{Serrano::VERSION}.gem"
         
     | 
| 
      
 36 
     | 
    
         
            +
            end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            desc "Release to Rubygems"
         
     | 
| 
      
 39 
     | 
    
         
            +
            task :release => :build do
         
     | 
| 
      
 40 
     | 
    
         
            +
              system "gem push serrano-#{Serrano::VERSION}.gem"
         
     | 
| 
      
 41 
     | 
    
         
            +
            end
         
     | 
    
        data/lib/serrano.rb
    ADDED
    
    | 
         @@ -0,0 +1,440 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            require "serrano/version"
         
     | 
| 
      
 2 
     | 
    
         
            +
            require "serrano/request"
         
     | 
| 
      
 3 
     | 
    
         
            +
            require "serrano/filterhandler"
         
     | 
| 
      
 4 
     | 
    
         
            +
            require "serrano/cnrequest"
         
     | 
| 
      
 5 
     | 
    
         
            +
            require "serrano/miner"
         
     | 
| 
      
 6 
     | 
    
         
            +
            require "serrano/filters"
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
            require 'rexml/document'
         
     | 
| 
      
 9 
     | 
    
         
            +
            require 'rexml/xpath'
         
     | 
| 
      
 10 
     | 
    
         
            +
             
     | 
| 
      
 11 
     | 
    
         
            +
            # @!macro serrano_params
         
     | 
| 
      
 12 
     | 
    
         
            +
            #   @param ids [Array] DOIs (digital object identifier) or other identifiers
         
     | 
| 
      
 13 
     | 
    
         
            +
            #   @param offset [Fixnum] Number of record to start at, from 1 to infinity.
         
     | 
| 
      
 14 
     | 
    
         
            +
            #   @param limit [Fixnum] Number of results to return. Not relavant when searching with specific dois. Default: 20. Max: 1000
         
     | 
| 
      
 15 
     | 
    
         
            +
            #   @param sample [Fixnum] Number of random results to return. when you use the sample parameter,
         
     | 
| 
      
 16 
     | 
    
         
            +
            #   the limit and offset parameters are ignored.
         
     | 
| 
      
 17 
     | 
    
         
            +
            #   @param sort [String] Field to sort on, one of score, relevance,
         
     | 
| 
      
 18 
     | 
    
         
            +
            #   updated (date of most recent change to metadata. Currently the same as deposited),
         
     | 
| 
      
 19 
     | 
    
         
            +
            #   deposited (time of most recent deposit), indexed (time of most recent index), or
         
     | 
| 
      
 20 
     | 
    
         
            +
            #   published (publication date). Note: If the API call includes a query, then the sort
         
     | 
| 
      
 21 
     | 
    
         
            +
            #   order will be by the relevance score. If no query is included, then the sort order
         
     | 
| 
      
 22 
     | 
    
         
            +
            #   will be by DOI update date.
         
     | 
| 
      
 23 
     | 
    
         
            +
            #   @param order [String] Sort order, one of 'asc' or 'desc'
         
     | 
| 
      
 24 
     | 
    
         
            +
            #   @param facet [Boolean] Include facet results. Default: false
         
     | 
| 
      
 25 
     | 
    
         
            +
            #   @param options [Hash] Hash of options for configuring the request, passed on to Faraday.new
         
     | 
| 
      
 26 
     | 
    
         
            +
            #     :timeout      - [Fixnum] open/read timeout Integer in seconds
         
     | 
| 
      
 27 
     | 
    
         
            +
            #     :open_timeout - [Fixnum] read timeout Integer in seconds
         
     | 
| 
      
 28 
     | 
    
         
            +
            #     :proxy        - [Hash] hash of proxy options
         
     | 
| 
      
 29 
     | 
    
         
            +
            #       :uri - [String] Proxy Server URI
         
     | 
| 
      
 30 
     | 
    
         
            +
            #       :user - [String] Proxy server username
         
     | 
| 
      
 31 
     | 
    
         
            +
            #       :password - [String] Proxy server password
         
     | 
| 
      
 32 
     | 
    
         
            +
            #     :params_encoder - [Hash] not sure what this is
         
     | 
| 
      
 33 
     | 
    
         
            +
            #     :bind           - [Hash] A hash with host and port values
         
     | 
| 
      
 34 
     | 
    
         
            +
            #     :boundary       - [String] of the boundary value
         
     | 
| 
      
 35 
     | 
    
         
            +
            #     :oauth          - [Hash] A hash with OAuth details
         
     | 
| 
      
 36 
     | 
    
         
            +
            #   @param verbose [Boolean] Print request headers to stdout. Default: false
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            ##
         
     | 
| 
      
 39 
     | 
    
         
            +
            # Serrano - The top level module for using methods
         
     | 
| 
      
 40 
     | 
    
         
            +
            # to access Serrano APIs
         
     | 
| 
      
 41 
     | 
    
         
            +
            #
         
     | 
| 
      
 42 
     | 
    
         
            +
            # The following methods, matching the main Crossref API routes, are available:
         
     | 
| 
      
 43 
     | 
    
         
            +
            # * works - Use the /works endpoint
         
     | 
| 
      
 44 
     | 
    
         
            +
            # * members - Use the /members endpoint
         
     | 
| 
      
 45 
     | 
    
         
            +
            # * prefixes - Use the /prefixes endpoint
         
     | 
| 
      
 46 
     | 
    
         
            +
            # * funders - Use the /funders endpoint
         
     | 
| 
      
 47 
     | 
    
         
            +
            # * journals - Use the /journals endpoint
         
     | 
| 
      
 48 
     | 
    
         
            +
            # * types - Use the /types endpoint
         
     | 
| 
      
 49 
     | 
    
         
            +
            # * licenses - Use the /licenses endpoint
         
     | 
| 
      
 50 
     | 
    
         
            +
            #
         
     | 
| 
      
 51 
     | 
    
         
            +
            # Additional methods
         
     | 
| 
      
 52 
     | 
    
         
            +
            # * agency - test the registration agency for a DOI
         
     | 
| 
      
 53 
     | 
    
         
            +
            #
         
     | 
| 
      
 54 
     | 
    
         
            +
            # All routes return an array of hashes
         
     | 
| 
      
 55 
     | 
    
         
            +
            # For example, if you want to inspect headers returned from the HTTP request,
         
     | 
| 
      
 56 
     | 
    
         
            +
            # and parse the raw result in any way you wish.
         
     | 
| 
      
 57 
     | 
    
         
            +
            #
         
     | 
| 
      
 58 
     | 
    
         
            +
            # @see https://github.com/CrossRef/rest-api-doc/blob/master/rest_api.md for
         
     | 
| 
      
 59 
     | 
    
         
            +
            # detailed description of the Crossref API
         
     | 
| 
      
 60 
     | 
    
         
            +
            module Serrano
         
     | 
| 
      
 61 
     | 
    
         
            +
              extend Configuration
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
              define_setting :access_token
         
     | 
| 
      
 64 
     | 
    
         
            +
              define_setting :access_secret
         
     | 
| 
      
 65 
     | 
    
         
            +
              define_setting :elsevier_key
         
     | 
| 
      
 66 
     | 
    
         
            +
              define_setting :base_url, "http://api.crossref.org/"
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
              ##
         
     | 
| 
      
 69 
     | 
    
         
            +
              # Search the works route
         
     | 
| 
      
 70 
     | 
    
         
            +
              #
         
     | 
| 
      
 71 
     | 
    
         
            +
              # @!macro serrano_params
         
     | 
| 
      
 72 
     | 
    
         
            +
              # @param query [String] A query string
         
     | 
| 
      
 73 
     | 
    
         
            +
              # @param filter [Hash] Filter options. See ...
         
     | 
| 
      
 74 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 75 
     | 
    
         
            +
              #
         
     | 
| 
      
 76 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 77 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 78 
     | 
    
         
            +
              #      # Search by DOI, one or more
         
     | 
| 
      
 79 
     | 
    
         
            +
              #      Serrano.works(ids: '10.5555/515151')
         
     | 
| 
      
 80 
     | 
    
         
            +
              #      Serrano.works(ids: '10.1371/journal.pone.0033693')
         
     | 
| 
      
 81 
     | 
    
         
            +
              #      Serrano.works(ids: ['10.1007/12080.1874-1746','10.1007/10452.1573-5125', '10.1111/(issn)1442-9993'])
         
     | 
| 
      
 82 
     | 
    
         
            +
              #      # query
         
     | 
| 
      
 83 
     | 
    
         
            +
              #      Serrano.works(query: "ecology")
         
     | 
| 
      
 84 
     | 
    
         
            +
              #      Serrano.works(query: "renear+-ontologies")
         
     | 
| 
      
 85 
     | 
    
         
            +
              #      # Sort
         
     | 
| 
      
 86 
     | 
    
         
            +
              #      Serrano.works(query: "ecology", sort: 'relevance', order: "asc")
         
     | 
| 
      
 87 
     | 
    
         
            +
              #      # Filters
         
     | 
| 
      
 88 
     | 
    
         
            +
              #      Serrano.works(filter: {has_full_text: true})
         
     | 
| 
      
 89 
     | 
    
         
            +
              #      Serrano.works(filter: {has_funder: true, has_full_text: true})
         
     | 
| 
      
 90 
     | 
    
         
            +
              #      Serrano.works(filter: {award_number: 'CBET-0756451', award_funder: '10.13039/100000001'})
         
     | 
| 
      
 91 
     | 
    
         
            +
              #
         
     | 
| 
      
 92 
     | 
    
         
            +
              #      # Curl options
         
     | 
| 
      
 93 
     | 
    
         
            +
              #      ## set a request timeout and an open timeout
         
     | 
| 
      
 94 
     | 
    
         
            +
              #      Serrano.works(ids: '10.1371/journal.pone.0033693', options: {timeout: 3, open_timeout: 2})
         
     | 
| 
      
 95 
     | 
    
         
            +
              #      ## log request details - uses Faraday middleware
         
     | 
| 
      
 96 
     | 
    
         
            +
              #      Serrano.works(ids: '10.1371/journal.pone.0033693', verbose: true)
         
     | 
| 
      
 97 
     | 
    
         
            +
              def self.works(ids: nil, query: nil, filter: nil, offset: nil,
         
     | 
| 
      
 98 
     | 
    
         
            +
                limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
         
     | 
| 
      
 99 
     | 
    
         
            +
                options: nil, verbose: false)
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
                Request.new('works', ids, query, filter, offset,
         
     | 
| 
      
 102 
     | 
    
         
            +
                  limit, sample, sort, order, facet, nil, nil, options, verbose).perform
         
     | 
| 
      
 103 
     | 
    
         
            +
              end
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
              ##
         
     | 
| 
      
 106 
     | 
    
         
            +
              # Search the members route
         
     | 
| 
      
 107 
     | 
    
         
            +
              #
         
     | 
| 
      
 108 
     | 
    
         
            +
              # @!macro serrano_params
         
     | 
| 
      
 109 
     | 
    
         
            +
              # @param query [String] A query string
         
     | 
| 
      
 110 
     | 
    
         
            +
              # @param filter [Hash] Filter options. See ...
         
     | 
| 
      
 111 
     | 
    
         
            +
              # @param works [Boolean] If true, works returned as well. Default: false
         
     | 
| 
      
 112 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 113 
     | 
    
         
            +
              #
         
     | 
| 
      
 114 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 115 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 116 
     | 
    
         
            +
              #      # Search by DOI, one or more
         
     | 
| 
      
 117 
     | 
    
         
            +
              #      Serrano.members(ids: 98)
         
     | 
| 
      
 118 
     | 
    
         
            +
              #      Serrano.members(ids: 340)
         
     | 
| 
      
 119 
     | 
    
         
            +
              #      Serrano.members(ids: [98, 340, 45])
         
     | 
| 
      
 120 
     | 
    
         
            +
              #      # query
         
     | 
| 
      
 121 
     | 
    
         
            +
              #      Serrano.members(query: "ecology")
         
     | 
| 
      
 122 
     | 
    
         
            +
              #      Serrano.members(query: "hindawi")
         
     | 
| 
      
 123 
     | 
    
         
            +
              #      # Sort - weird, doesn't work
         
     | 
| 
      
 124 
     | 
    
         
            +
              #      Serrano.members(query: "ecology", order: "asc")
         
     | 
| 
      
 125 
     | 
    
         
            +
              #      # Works
         
     | 
| 
      
 126 
     | 
    
         
            +
              #      Serrano.members(ids: 98, works: true)
         
     | 
| 
      
 127 
     | 
    
         
            +
              def self.members(ids: nil, query: nil, filter: nil, offset: nil,
         
     | 
| 
      
 128 
     | 
    
         
            +
                limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
         
     | 
| 
      
 129 
     | 
    
         
            +
                works: false, options: nil, verbose: false)
         
     | 
| 
      
 130 
     | 
    
         
            +
             
     | 
| 
      
 131 
     | 
    
         
            +
                Request.new('members', ids, query, filter, offset,
         
     | 
| 
      
 132 
     | 
    
         
            +
                  limit, sample, sort, order, facet, works, nil, options, verbose).perform
         
     | 
| 
      
 133 
     | 
    
         
            +
              end
         
     | 
| 
      
 134 
     | 
    
         
            +
             
     | 
| 
      
 135 
     | 
    
         
            +
              ##
         
     | 
| 
      
 136 
     | 
    
         
            +
              # Search the prefixes route
         
     | 
| 
      
 137 
     | 
    
         
            +
              #
         
     | 
| 
      
 138 
     | 
    
         
            +
              # @!macro serrano_params
         
     | 
| 
      
 139 
     | 
    
         
            +
              # @param filter [Hash] Filter options. See ...
         
     | 
| 
      
 140 
     | 
    
         
            +
              # @param works [Boolean] If true, works returned as well. Default: false
         
     | 
| 
      
 141 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 142 
     | 
    
         
            +
              #
         
     | 
| 
      
 143 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 144 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 145 
     | 
    
         
            +
              #      # Search by DOI, one or more
         
     | 
| 
      
 146 
     | 
    
         
            +
              #      Serrano.prefixes(ids: "10.1016")
         
     | 
| 
      
 147 
     | 
    
         
            +
              #      Serrano.prefixes(ids: ['10.1016','10.1371','10.1023','10.4176','10.1093'])
         
     | 
| 
      
 148 
     | 
    
         
            +
              #      # works
         
     | 
| 
      
 149 
     | 
    
         
            +
              #      Serrano.prefixes(ids: "10.1016", works: true)
         
     | 
| 
      
 150 
     | 
    
         
            +
              #      # Limit number of results
         
     | 
| 
      
 151 
     | 
    
         
            +
              #      Serrano.prefixes(ids: "10.1016", works: true, limit: 3)
         
     | 
| 
      
 152 
     | 
    
         
            +
              #      # Sort and order
         
     | 
| 
      
 153 
     | 
    
         
            +
              #      Serrano.prefixes(ids: "10.1016", works: true, sort: 'relevance', order: "asc")
         
     | 
| 
      
 154 
     | 
    
         
            +
              def self.prefixes(ids:, filter: nil, offset: nil,
         
     | 
| 
      
 155 
     | 
    
         
            +
                limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
         
     | 
| 
      
 156 
     | 
    
         
            +
                works: false, options: nil, verbose: false)
         
     | 
| 
      
 157 
     | 
    
         
            +
             
     | 
| 
      
 158 
     | 
    
         
            +
                Request.new('prefixes', ids, nil, filter, offset,
         
     | 
| 
      
 159 
     | 
    
         
            +
                  limit, sample, sort, order, facet, works, nil, options, verbose).perform
         
     | 
| 
      
 160 
     | 
    
         
            +
              end
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
              ##
         
     | 
| 
      
 163 
     | 
    
         
            +
              # Search the funders route
         
     | 
| 
      
 164 
     | 
    
         
            +
              #
         
     | 
| 
      
 165 
     | 
    
         
            +
              # @!macro serrano_params
         
     | 
| 
      
 166 
     | 
    
         
            +
              # @param query [String] A query string
         
     | 
| 
      
 167 
     | 
    
         
            +
              # @param filter [Hash] Filter options. See ...
         
     | 
| 
      
 168 
     | 
    
         
            +
              # @param works [Boolean] If true, works returned as well. Default: false
         
     | 
| 
      
 169 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 170 
     | 
    
         
            +
              #
         
     | 
| 
      
 171 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 172 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 173 
     | 
    
         
            +
              #      # Search by DOI, one or more
         
     | 
| 
      
 174 
     | 
    
         
            +
              #      Serrano.funders(ids: '10.13039/100000001')
         
     | 
| 
      
 175 
     | 
    
         
            +
              #      Serrano.funders(ids: ['10.13039/100000001','10.13039/100000015'])
         
     | 
| 
      
 176 
     | 
    
         
            +
              #      # query
         
     | 
| 
      
 177 
     | 
    
         
            +
              #      Serrano.funders(query: "NSF")
         
     | 
| 
      
 178 
     | 
    
         
            +
              #      # works
         
     | 
| 
      
 179 
     | 
    
         
            +
              #      Serrano.funders(ids: '10.13039/100000001', works: true)
         
     | 
| 
      
 180 
     | 
    
         
            +
              #      # Limit number of results
         
     | 
| 
      
 181 
     | 
    
         
            +
              #      Serrano.funders(ids: '10.13039/100000001', works: true, limit: 3)
         
     | 
| 
      
 182 
     | 
    
         
            +
              #      # Sort and order
         
     | 
| 
      
 183 
     | 
    
         
            +
              #      Serrano.funders(ids: "10.13039/100000001", works: true, sort: 'relevance', order: "asc")
         
     | 
| 
      
 184 
     | 
    
         
            +
              def self.funders(ids: nil, query: nil, filter: nil, offset: nil,
         
     | 
| 
      
 185 
     | 
    
         
            +
                limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
         
     | 
| 
      
 186 
     | 
    
         
            +
                works: false, options: nil, verbose: false)
         
     | 
| 
      
 187 
     | 
    
         
            +
             
     | 
| 
      
 188 
     | 
    
         
            +
                Request.new('funders', ids, query, filter, offset,
         
     | 
| 
      
 189 
     | 
    
         
            +
                  limit, sample, sort, order, facet, works, nil, options, verbose).perform
         
     | 
| 
      
 190 
     | 
    
         
            +
              end
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
      
 192 
     | 
    
         
            +
              ##
         
     | 
| 
      
 193 
     | 
    
         
            +
              # Search the journals route
         
     | 
| 
      
 194 
     | 
    
         
            +
              #
         
     | 
| 
      
 195 
     | 
    
         
            +
              # @!macro serrano_params
         
     | 
| 
      
 196 
     | 
    
         
            +
              # @param query [String] A query string
         
     | 
| 
      
 197 
     | 
    
         
            +
              # @param filter [Hash] Filter options. See ...
         
     | 
| 
      
 198 
     | 
    
         
            +
              # @param works [Boolean] If true, works returned as well. Default: false
         
     | 
| 
      
 199 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 200 
     | 
    
         
            +
              #
         
     | 
| 
      
 201 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 202 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 203 
     | 
    
         
            +
              #      Serrano.journals(ids: "2167-8359")
         
     | 
| 
      
 204 
     | 
    
         
            +
              #      Serrano.journals()
         
     | 
| 
      
 205 
     | 
    
         
            +
              #      Serrano.journals(ids: "2167-8359", works: true)
         
     | 
| 
      
 206 
     | 
    
         
            +
              #      Serrano.journals(ids: ['1803-2427', '2326-4225'])
         
     | 
| 
      
 207 
     | 
    
         
            +
              #      Serrano.journals(query: "ecology")
         
     | 
| 
      
 208 
     | 
    
         
            +
              #      Serrano.journals(query: "peerj")
         
     | 
| 
      
 209 
     | 
    
         
            +
              #      Serrano.journals(ids: "2167-8359", query: 'ecology', works: true, sort: 'score', order: "asc")
         
     | 
| 
      
 210 
     | 
    
         
            +
              #      Serrano.journals(ids: "2167-8359", query: 'ecology', works: true, sort: 'score', order: "desc")
         
     | 
| 
      
 211 
     | 
    
         
            +
              #      Serrano.journals(ids: "2167-8359", works: true, filter: {from_pub_date: '2014-03-03'})
         
     | 
| 
      
 212 
     | 
    
         
            +
              #      Serrano.journals(ids: '1803-2427', works: true)
         
     | 
| 
      
 213 
     | 
    
         
            +
              #      Serrano.journals(ids: '1803-2427', works: true)
         
     | 
| 
      
 214 
     | 
    
         
            +
              #      Serrano.journals(limit: 2)
         
     | 
| 
      
 215 
     | 
    
         
            +
              #      Serrano.journals(sample: 2)
         
     | 
| 
      
 216 
     | 
    
         
            +
              def self.journals(ids: nil, query: nil, filter: nil, offset: nil,
         
     | 
| 
      
 217 
     | 
    
         
            +
                limit: nil, sample: nil, sort: nil, order: nil, facet: nil,
         
     | 
| 
      
 218 
     | 
    
         
            +
                works: false, options: nil, verbose: false)
         
     | 
| 
      
 219 
     | 
    
         
            +
             
     | 
| 
      
 220 
     | 
    
         
            +
                Request.new('journals', ids, query, filter, offset,
         
     | 
| 
      
 221 
     | 
    
         
            +
                  limit, sample, sort, order, facet, works, nil, options, verbose).perform
         
     | 
| 
      
 222 
     | 
    
         
            +
              end
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
              ##
         
     | 
| 
      
 225 
     | 
    
         
            +
              # Search the types route
         
     | 
| 
      
 226 
     | 
    
         
            +
              #
         
     | 
| 
      
 227 
     | 
    
         
            +
              # @param ids [Array] DOIs (digital object identifier) or other identifiers
         
     | 
| 
      
 228 
     | 
    
         
            +
              # @param works [Boolean] If true, works returned as well. Default: false
         
     | 
| 
      
 229 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 230 
     | 
    
         
            +
              #
         
     | 
| 
      
 231 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 232 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 233 
     | 
    
         
            +
              #      Serrano.types()
         
     | 
| 
      
 234 
     | 
    
         
            +
              #      Serrano.types(ids: "journal")
         
     | 
| 
      
 235 
     | 
    
         
            +
              #      Serrano.types(ids: ["journal", "dissertation"])
         
     | 
| 
      
 236 
     | 
    
         
            +
              #      Serrano.types(ids: "journal", works: true)
         
     | 
| 
      
 237 
     | 
    
         
            +
              def self.types(ids: nil, works: false, options: nil, verbose: false)
         
     | 
| 
      
 238 
     | 
    
         
            +
             
     | 
| 
      
 239 
     | 
    
         
            +
                Request.new('types', ids, nil, nil, nil,
         
     | 
| 
      
 240 
     | 
    
         
            +
                  nil, nil, nil, nil, nil, works, nil, options, verbose).perform
         
     | 
| 
      
 241 
     | 
    
         
            +
              end
         
     | 
| 
      
 242 
     | 
    
         
            +
             
     | 
| 
      
 243 
     | 
    
         
            +
              ##
         
     | 
| 
      
 244 
     | 
    
         
            +
              # Search the licenses route
         
     | 
| 
      
 245 
     | 
    
         
            +
              #
         
     | 
| 
      
 246 
     | 
    
         
            +
              # @!macro serrano_params
         
     | 
| 
      
 247 
     | 
    
         
            +
              # @param query [String] A query string
         
     | 
| 
      
 248 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 249 
     | 
    
         
            +
              #
         
     | 
| 
      
 250 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 251 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 252 
     | 
    
         
            +
              #      Serrano.licenses(query: "creative")
         
     | 
| 
      
 253 
     | 
    
         
            +
              #      Serrano.licenses()
         
     | 
| 
      
 254 
     | 
    
         
            +
              #      Serrano.licenses(limit: 3)
         
     | 
| 
      
 255 
     | 
    
         
            +
              def self.licenses(ids: nil, query: nil, offset: nil,
         
     | 
| 
      
 256 
     | 
    
         
            +
                limit: nil, sample: nil, sort: nil, order: nil,
         
     | 
| 
      
 257 
     | 
    
         
            +
                facet: nil, options: nil, verbose: false)
         
     | 
| 
      
 258 
     | 
    
         
            +
             
     | 
| 
      
 259 
     | 
    
         
            +
                Request.new('licenses', ids, query, nil, offset,
         
     | 
| 
      
 260 
     | 
    
         
            +
                  limit, sample, sort, order, facet, nil, nil, options, verbose).perform
         
     | 
| 
      
 261 
     | 
    
         
            +
              end
         
     | 
| 
      
 262 
     | 
    
         
            +
             
     | 
| 
      
 263 
     | 
    
         
            +
              ##
         
     | 
| 
      
 264 
     | 
    
         
            +
              # Determine registration agency for DOIs
         
     | 
| 
      
 265 
     | 
    
         
            +
              #
         
     | 
| 
      
 266 
     | 
    
         
            +
              # @param ids [Array] DOIs (digital object identifier) or other identifiers
         
     | 
| 
      
 267 
     | 
    
         
            +
              # @return [Array] An array of hashes
         
     | 
| 
      
 268 
     | 
    
         
            +
              #
         
     | 
| 
      
 269 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 270 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 271 
     | 
    
         
            +
              #      Serrano.agency(ids: '10.1371/journal.pone.0033693')
         
     | 
| 
      
 272 
     | 
    
         
            +
              #      Serrano.agency(ids: ['10.1007/12080.1874-1746','10.1007/10452.1573-5125', '10.1111/(issn)1442-9993'])
         
     | 
| 
      
 273 
     | 
    
         
            +
              def self.agency(ids:, options: nil, verbose: false)
         
     | 
| 
      
 274 
     | 
    
         
            +
             
     | 
| 
      
 275 
     | 
    
         
            +
                Request.new('works', ids, nil, nil, nil,
         
     | 
| 
      
 276 
     | 
    
         
            +
                  nil, nil, nil, nil, nil, false, true, options, verbose).perform
         
     | 
| 
      
 277 
     | 
    
         
            +
              end
         
     | 
| 
      
 278 
     | 
    
         
            +
             
     | 
| 
      
 279 
     | 
    
         
            +
              ##
         
     | 
| 
      
 280 
     | 
    
         
            +
              # Get a random set of DOI's
         
     | 
| 
      
 281 
     | 
    
         
            +
              #
         
     | 
| 
      
 282 
     | 
    
         
            +
              # @param sample [Fixnum] Number of random DOIs to return
         
     | 
| 
      
 283 
     | 
    
         
            +
              # @return [Array] A list of strings, each a DOI
         
     | 
| 
      
 284 
     | 
    
         
            +
              # @note This method uses {Serrano.works} internally, but doesn't allow you to pass on
         
     | 
| 
      
 285 
     | 
    
         
            +
              # arguments to that method.
         
     | 
| 
      
 286 
     | 
    
         
            +
              #
         
     | 
| 
      
 287 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 288 
     | 
    
         
            +
              #      require 'serrano'
         
     | 
| 
      
 289 
     | 
    
         
            +
              #      Serrano.random_dois(sample: 1)
         
     | 
| 
      
 290 
     | 
    
         
            +
              #      Serrano.random_dois(sample: 10)
         
     | 
| 
      
 291 
     | 
    
         
            +
              #      Serrano.random_dois(sample: 100)
         
     | 
| 
      
 292 
     | 
    
         
            +
              def self.random_dois(sample:, options: nil, verbose: false)
         
     | 
| 
      
 293 
     | 
    
         
            +
             
     | 
| 
      
 294 
     | 
    
         
            +
                tmp = Request.new('works', nil, nil, nil, nil,
         
     | 
| 
      
 295 
     | 
    
         
            +
                  nil, sample, nil, nil, nil, false, nil, options, verbose).perform
         
     | 
| 
      
 296 
     | 
    
         
            +
                tmp['message']['items'].collect { |x| x['DOI'] }
         
     | 
| 
      
 297 
     | 
    
         
            +
              end
         
     | 
| 
      
 298 
     | 
    
         
            +
             
     | 
| 
      
 299 
     | 
    
         
            +
              ##
         
     | 
| 
      
 300 
     | 
    
         
            +
              # Get citations in various formats from CrossRef
         
     | 
| 
      
 301 
     | 
    
         
            +
              #
         
     | 
| 
      
 302 
     | 
    
         
            +
              # @param ids [String] DOIs
         
     | 
| 
      
 303 
     | 
    
         
            +
              # @param format [String] Format
         
     | 
| 
      
 304 
     | 
    
         
            +
              # @param style [String] Style
         
     | 
| 
      
 305 
     | 
    
         
            +
              # @param locale [String] Locale
         
     | 
| 
      
 306 
     | 
    
         
            +
              # @return [Hash] A hash
         
     | 
| 
      
 307 
     | 
    
         
            +
              #
         
     | 
| 
      
 308 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 309 
     | 
    
         
            +
              #     require 'serrano'
         
     | 
| 
      
 310 
     | 
    
         
            +
              #     # By default, you get bibtex, apa format, in en-US locale
         
     | 
| 
      
 311 
     | 
    
         
            +
              #     Serrano.cn(ids: '10.1126/science.169.3946.635')
         
     | 
| 
      
 312 
     | 
    
         
            +
              #
         
     | 
| 
      
 313 
     | 
    
         
            +
              #     # get citeproc-json
         
     | 
| 
      
 314 
     | 
    
         
            +
              #     Serrano.cn(ids: '10.1126/science.169.3946.635', format: "citeproc-json")
         
     | 
| 
      
 315 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "citeproc-json")
         
     | 
| 
      
 316 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "rdf-xml")
         
     | 
| 
      
 317 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "crossref-xml")
         
     | 
| 
      
 318 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "text")
         
     | 
| 
      
 319 
     | 
    
         
            +
              #
         
     | 
| 
      
 320 
     | 
    
         
            +
              #     # return an R bibentry type
         
     | 
| 
      
 321 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "bibentry")
         
     | 
| 
      
 322 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.6084/m9.figshare.97218", format: "bibentry")
         
     | 
| 
      
 323 
     | 
    
         
            +
              #
         
     | 
| 
      
 324 
     | 
    
         
            +
              #     # return an apa style citation
         
     | 
| 
      
 325 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "text", style: "apa")
         
     | 
| 
      
 326 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "text", style: "harvard3")
         
     | 
| 
      
 327 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "text", style: "elsevier-harvard")
         
     | 
| 
      
 328 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "text", style: "ecoscience")
         
     | 
| 
      
 329 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "text", style: "heredity")
         
     | 
| 
      
 330 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.1126/science.169.3946.635", format: "text", style: "oikos")
         
     | 
| 
      
 331 
     | 
    
         
            +
              #
         
     | 
| 
      
 332 
     | 
    
         
            +
              #     # example with many DOIs
         
     | 
| 
      
 333 
     | 
    
         
            +
              #     dois <- cr_r(2)
         
     | 
| 
      
 334 
     | 
    
         
            +
              #     Serrano.cn(dois, format: "text", style: "apa")
         
     | 
| 
      
 335 
     | 
    
         
            +
              #
         
     | 
| 
      
 336 
     | 
    
         
            +
              #     # Using DataCite DOIs
         
     | 
| 
      
 337 
     | 
    
         
            +
              #     ## some formats don't work
         
     | 
| 
      
 338 
     | 
    
         
            +
              #     # Serrano.cn(ids: "10.5284/1011335", format: "text")
         
     | 
| 
      
 339 
     | 
    
         
            +
              #     # Serrano.cn(ids: "10.5284/1011335", format: "crossref-xml")
         
     | 
| 
      
 340 
     | 
    
         
            +
              #     # Serrano.cn(ids: "10.5284/1011335", format: "crossref-tdm")
         
     | 
| 
      
 341 
     | 
    
         
            +
              #
         
     | 
| 
      
 342 
     | 
    
         
            +
              #     ## But most do work
         
     | 
| 
      
 343 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "datacite-xml")
         
     | 
| 
      
 344 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "rdf-xml")
         
     | 
| 
      
 345 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "turtle")
         
     | 
| 
      
 346 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "citeproc-json")
         
     | 
| 
      
 347 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "ris")
         
     | 
| 
      
 348 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "bibtex")
         
     | 
| 
      
 349 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "bibentry")
         
     | 
| 
      
 350 
     | 
    
         
            +
              #     Serrano.cn(ids: "10.5284/1011335", format: "bibtex")
         
     | 
| 
      
 351 
     | 
    
         
            +
              #
         
     | 
| 
      
 352 
     | 
    
         
            +
              #     # many DOIs
         
     | 
| 
      
 353 
     | 
    
         
            +
              #     dois = ['10.5167/UZH-30455','10.5167/UZH-49216','10.5167/UZH-503', '10.5167/UZH-38402','10.5167/UZH-41217']
         
     | 
| 
      
 354 
     | 
    
         
            +
              #     x = Serrano.cn(ids: dois)
         
     | 
| 
      
 355 
     | 
    
         
            +
              #     puts x
         
     | 
| 
      
 356 
     | 
    
         
            +
              def self.cn(ids:, format: "bibtex", style: 'apa', locale: "en-US")
         
     | 
| 
      
 357 
     | 
    
         
            +
                CNRequest.new(ids, format, style, locale).perform
         
     | 
| 
      
 358 
     | 
    
         
            +
              end
         
     | 
| 
      
 359 
     | 
    
         
            +
             
     | 
| 
      
 360 
     | 
    
         
            +
              ##
         
     | 
| 
      
 361 
     | 
    
         
            +
              # Get full text
         
     | 
| 
      
 362 
     | 
    
         
            +
              #
         
     | 
| 
      
 363 
     | 
    
         
            +
              # Should work for open access papers, but for closed, requires authentication and
         
     | 
| 
      
 364 
     | 
    
         
            +
              # likely pre-authorized IP address.
         
     | 
| 
      
 365 
     | 
    
         
            +
              #
         
     | 
| 
      
 366 
     | 
    
         
            +
              # @param url [String] A url for full text
         
     | 
| 
      
 367 
     | 
    
         
            +
              # @param type [Hash] Ignored for now. One of xml, plain, or pdf. Right now, type auto-detected from the URL
         
     | 
| 
      
 368 
     | 
    
         
            +
              # @return [Mined] An object of class Mined, with methods for extracting
         
     | 
| 
      
 369 
     | 
    
         
            +
              # the url requested, the file path, and parsing the plain text, XML, or extracting
         
     | 
| 
      
 370 
     | 
    
         
            +
              # text from the pdf.
         
     | 
| 
      
 371 
     | 
    
         
            +
              #
         
     | 
| 
      
 372 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 373 
     | 
    
         
            +
              #   require 'serrano'
         
     | 
| 
      
 374 
     | 
    
         
            +
              #   # Set authorization
         
     | 
| 
      
 375 
     | 
    
         
            +
              #   Serrano.configuration do |config|
         
     | 
| 
      
 376 
     | 
    
         
            +
              #     config.elsevier_key = "<your key>"
         
     | 
| 
      
 377 
     | 
    
         
            +
              #   end
         
     | 
| 
      
 378 
     | 
    
         
            +
              #   # Get some elsevier works
         
     | 
| 
      
 379 
     | 
    
         
            +
              #   res = Serrano.members(ids: 78, works: true);
         
     | 
| 
      
 380 
     | 
    
         
            +
              #   # get full text links, here doing xml
         
     | 
| 
      
 381 
     | 
    
         
            +
              #   links = res[0]['message']['items'].collect { |x| x['link'].keep_if { |z| z['content-type'] == 'text/xml' } };
         
     | 
| 
      
 382 
     | 
    
         
            +
              #   links = links.collect { |z| z[0].select { |k,v| k[/URL/] }.values[0] };
         
     | 
| 
      
 383 
     | 
    
         
            +
              #   # Get full text for an article
         
     | 
| 
      
 384 
     | 
    
         
            +
              #   res = Serrano.text(url: links[0]);
         
     | 
| 
      
 385 
     | 
    
         
            +
              #   res.url
         
     | 
| 
      
 386 
     | 
    
         
            +
              #   res.path
         
     | 
| 
      
 387 
     | 
    
         
            +
              #   res.type
         
     | 
| 
      
 388 
     | 
    
         
            +
              #   xml = res.parse()
         
     | 
| 
      
 389 
     | 
    
         
            +
              #   puts xml
         
     | 
| 
      
 390 
     | 
    
         
            +
              #   xml.xpath('//xocs:cover-date-text', xml.root.namespaces).text
         
     | 
| 
      
 391 
     | 
    
         
            +
              #
         
     | 
| 
      
 392 
     | 
    
         
            +
              #   ## plain text
         
     | 
| 
      
 393 
     | 
    
         
            +
              #   # get full text links, here doing xml
         
     | 
| 
      
 394 
     | 
    
         
            +
              #   links = res[0]['message']['items'].collect { |x| x['link'].keep_if { |z| z['content-type'] == 'text/plain' } };
         
     | 
| 
      
 395 
     | 
    
         
            +
              #   links = links.collect { |z| z[0].select { |k,v| k[/URL/] }.values[0] };
         
     | 
| 
      
 396 
     | 
    
         
            +
              #   # Get full text for an article
         
     | 
| 
      
 397 
     | 
    
         
            +
              #   res = Serrano.text(url: links[0]);
         
     | 
| 
      
 398 
     | 
    
         
            +
              #   res.url
         
     | 
| 
      
 399 
     | 
    
         
            +
              #   res.parse
         
     | 
| 
      
 400 
     | 
    
         
            +
              #
         
     | 
| 
      
 401 
     | 
    
         
            +
              #   # With open access content - using Pensoft
         
     | 
| 
      
 402 
     | 
    
         
            +
              #   res = Serrano.members(ids: 2258, works: true, filter: {has_full_text: true});
         
     | 
| 
      
 403 
     | 
    
         
            +
              #   links = res[0]['message']['items'].collect { |x| x['link'].keep_if { |z| z['content-type'] == 'application/xml' } };
         
     | 
| 
      
 404 
     | 
    
         
            +
              #   links = links.collect { |z| z[0].select { |k,v| k[/URL/] }.values[0] };
         
     | 
| 
      
 405 
     | 
    
         
            +
              #   # Get full text for an article
         
     | 
| 
      
 406 
     | 
    
         
            +
              #   res = Serrano.text(url: links[0]);
         
     | 
| 
      
 407 
     | 
    
         
            +
              #   res.url
         
     | 
| 
      
 408 
     | 
    
         
            +
              #   res.parse
         
     | 
| 
      
 409 
     | 
    
         
            +
              def self.text(url:, type: 'xml')
         
     | 
| 
      
 410 
     | 
    
         
            +
                Miner.new(url, type).perform
         
     | 
| 
      
 411 
     | 
    
         
            +
              end
         
     | 
| 
      
 412 
     | 
    
         
            +
             
     | 
| 
      
 413 
     | 
    
         
            +
              # Lookup article info via CrossRef with DOI and get a citation count
         
     | 
| 
      
 414 
     | 
    
         
            +
              #
         
     | 
| 
      
 415 
     | 
    
         
            +
              # @param doi [String] DOI, digital object identifier
         
     | 
| 
      
 416 
     | 
    
         
            +
              # @param url [String] the API url for the function (should be left to default)
         
     | 
| 
      
 417 
     | 
    
         
            +
              # @param key [String] your API key
         
     | 
| 
      
 418 
     | 
    
         
            +
              #
         
     | 
| 
      
 419 
     | 
    
         
            +
              # @see http://labs.crossref.org/openurl/ for more info on this Crossref API service.
         
     | 
| 
      
 420 
     | 
    
         
            +
              #
         
     | 
| 
      
 421 
     | 
    
         
            +
              # @example
         
     | 
| 
      
 422 
     | 
    
         
            +
              #   require 'serrano'
         
     | 
| 
      
 423 
     | 
    
         
            +
              #   Serrano.citation_count(doi: "10.1371/journal.pone.0042793")
         
     | 
| 
      
 424 
     | 
    
         
            +
              #   Serrano.citation_count(doi: "10.1016/j.fbr.2012.01.001")
         
     | 
| 
      
 425 
     | 
    
         
            +
              #   # DOI not found
         
     | 
| 
      
 426 
     | 
    
         
            +
              #   Serrano.citation_count(doi: "10.1016/j.fbr.2012")
         
     | 
| 
      
 427 
     | 
    
         
            +
              def self.citation_count(doi:, url: "http://www.crossref.org/openurl/",
         
     | 
| 
      
 428 
     | 
    
         
            +
                key: "cboettig@ropensci.org", options: nil)
         
     | 
| 
      
 429 
     | 
    
         
            +
             
     | 
| 
      
 430 
     | 
    
         
            +
                args = { id: "doi:" + doi, pid: key, noredirect: true }
         
     | 
| 
      
 431 
     | 
    
         
            +
                opts = args.delete_if { |k, v| v.nil? }
         
     | 
| 
      
 432 
     | 
    
         
            +
                conn = Faraday.new(:url => url, :request => options)
         
     | 
| 
      
 433 
     | 
    
         
            +
                res = conn.get '', opts
         
     | 
| 
      
 434 
     | 
    
         
            +
                x = res.body
         
     | 
| 
      
 435 
     | 
    
         
            +
                oc = REXML::Document.new("<doc>#{x}</doc>")
         
     | 
| 
      
 436 
     | 
    
         
            +
                value = REXML::XPath.first(oc, '//query').attributes['fl_count'].to_i
         
     | 
| 
      
 437 
     | 
    
         
            +
                return value
         
     | 
| 
      
 438 
     | 
    
         
            +
              end
         
     | 
| 
      
 439 
     | 
    
         
            +
             
     | 
| 
      
 440 
     | 
    
         
            +
            end
         
     |