mirror of
https://github.com/dkam/openlib.git
synced 2025-12-28 11:14:52 +00:00
Initial import
This commit is contained in:
102
.byebug_history
Normal file
102
.byebug_history
Normal file
@@ -0,0 +1,102 @@
|
|||||||
|
c
|
||||||
|
resp.status.first
|
||||||
|
resp.status
|
||||||
|
resp.200
|
||||||
|
resp.ok?
|
||||||
|
resp.status.to_i
|
||||||
|
resp.status.first
|
||||||
|
resp.status
|
||||||
|
c
|
||||||
|
n
|
||||||
|
c
|
||||||
|
resp.status
|
||||||
|
resp
|
||||||
|
c
|
||||||
|
view.first.last.dig("preview_url")
|
||||||
|
view.first.last.keys
|
||||||
|
view.first.last
|
||||||
|
c
|
||||||
|
view.first.last.dig(data.to_s)
|
||||||
|
view.first.last.dig(data)
|
||||||
|
view.first.last
|
||||||
|
view
|
||||||
|
data
|
||||||
|
c
|
||||||
|
n
|
||||||
|
@view.info_url
|
||||||
|
n
|
||||||
|
c
|
||||||
|
@view.response
|
||||||
|
@view.response.first.last.keys
|
||||||
|
@view.response.first.last.dig("info_url")
|
||||||
|
@view.response.first.last
|
||||||
|
@view.response.first.last.dig("info_url")
|
||||||
|
@view.response
|
||||||
|
@view
|
||||||
|
@view.info_url
|
||||||
|
@view
|
||||||
|
n
|
||||||
|
c
|
||||||
|
@view.
|
||||||
|
@view
|
||||||
|
c
|
||||||
|
pp JSON.parse(d)
|
||||||
|
JSON.parse(d)
|
||||||
|
d.class
|
||||||
|
puts d
|
||||||
|
pp d
|
||||||
|
puts d
|
||||||
|
d
|
||||||
|
ap d
|
||||||
|
d =URI.open( "https://openlibrary.org/api/books?jscmd=#{format}&format=json&bibkeys=#{id_kind.to_s.upcase}#{id}" ).read
|
||||||
|
n
|
||||||
|
s
|
||||||
|
c
|
||||||
|
id_kind
|
||||||
|
ID_KINDS
|
||||||
|
ID_KINDS.include?(id_kind)
|
||||||
|
id_kind
|
||||||
|
s
|
||||||
|
c
|
||||||
|
n
|
||||||
|
s
|
||||||
|
c
|
||||||
|
n
|
||||||
|
s
|
||||||
|
c
|
||||||
|
@id_kind
|
||||||
|
c
|
||||||
|
s
|
||||||
|
@view
|
||||||
|
c
|
||||||
|
n
|
||||||
|
s
|
||||||
|
c
|
||||||
|
id
|
||||||
|
format
|
||||||
|
d
|
||||||
|
"https://openlibrary.org/api/books?jscmd=#{format}&format=json&bibkeys=#{kind.to_s.upcase}#{id}"
|
||||||
|
n
|
||||||
|
s
|
||||||
|
@view = nil
|
||||||
|
c
|
||||||
|
n
|
||||||
|
@view = nil
|
||||||
|
@view
|
||||||
|
c
|
||||||
|
s
|
||||||
|
c
|
||||||
|
n
|
||||||
|
s
|
||||||
|
c
|
||||||
|
n
|
||||||
|
@view
|
||||||
|
n
|
||||||
|
c
|
||||||
|
d.read
|
||||||
|
d.body
|
||||||
|
ap d
|
||||||
|
d = URI.open( "https://openlibrary.org/api/books?jscmd=#{format}&format=json&bibkeys=#{kind.to_s.upcase}")
|
||||||
|
"https://openlibrary.org/api/books?jscmd=#{format}&format=json&bibkeys=#{kind.to_s.upcase}"
|
||||||
|
n
|
||||||
|
s
|
||||||
8
.gitignore
vendored
Normal file
8
.gitignore
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
/.bundle/
|
||||||
|
/.yardoc
|
||||||
|
/_yardoc/
|
||||||
|
/coverage/
|
||||||
|
/doc/
|
||||||
|
/pkg/
|
||||||
|
/spec/reports/
|
||||||
|
/tmp/
|
||||||
6
.travis.yml
Normal file
6
.travis.yml
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
language: ruby
|
||||||
|
cache: bundler
|
||||||
|
rvm:
|
||||||
|
- 2.6.6
|
||||||
|
before_install: gem install bundler -v 2.1.4
|
||||||
2
CHANGELOG.md
Normal file
2
CHANGELOG.md
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
## 0.1.0
|
||||||
|
- Initial version
|
||||||
9
Gemfile
Normal file
9
Gemfile
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
source "https://rubygems.org"
|
||||||
|
|
||||||
|
# Specify your gem's dependencies in openlib.gemspec
|
||||||
|
gemspec
|
||||||
|
|
||||||
|
gem "rake", "~> 12.0"
|
||||||
|
gem "minitest", "~> 5.0"
|
||||||
|
|
||||||
|
gem 'byebug'
|
||||||
23
Gemfile.lock
Normal file
23
Gemfile.lock
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
PATH
|
||||||
|
remote: .
|
||||||
|
specs:
|
||||||
|
openlib (0.1.0)
|
||||||
|
|
||||||
|
GEM
|
||||||
|
remote: https://rubygems.org/
|
||||||
|
specs:
|
||||||
|
byebug (11.1.2)
|
||||||
|
minitest (5.14.0)
|
||||||
|
rake (12.3.3)
|
||||||
|
|
||||||
|
PLATFORMS
|
||||||
|
ruby
|
||||||
|
|
||||||
|
DEPENDENCIES
|
||||||
|
byebug
|
||||||
|
minitest (~> 5.0)
|
||||||
|
openlib!
|
||||||
|
rake (~> 12.0)
|
||||||
|
|
||||||
|
BUNDLED WITH
|
||||||
|
2.1.4
|
||||||
21
LICENSE.txt
Normal file
21
LICENSE.txt
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2020 Dan Milne
|
||||||
|
|
||||||
|
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:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
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.
|
||||||
52
README.md
Normal file
52
README.md
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
# Openlib
|
||||||
|
|
||||||
|
This is a tiny client to the Open Library's [Books API](https://openlibrary.org/dev/docs/api/books)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
Add this line to your application's Gemfile:
|
||||||
|
|
||||||
|
```ruby
|
||||||
|
gem 'openlib'
|
||||||
|
```
|
||||||
|
|
||||||
|
And then execute:
|
||||||
|
|
||||||
|
$ bundle install
|
||||||
|
|
||||||
|
Or install it yourself as:
|
||||||
|
|
||||||
|
$ gem install openlib
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
> book = Openlib::Book.new(id: '9780316030571')
|
||||||
|
> book.title
|
||||||
|
=> "Cryptonomicon"
|
||||||
|
> book.authors
|
||||||
|
=> ["Neal Stephenson"]
|
||||||
|
> book.subjects
|
||||||
|
=> ["Fiction", "World War, 1939-1945", "World War, 1939-1945 in fiction", "Data encryption (Computer science)", "Cryptography", "Literature", "Science Fiction", "Long Now Manual for Civilization", "Code and cipher stories"]
|
||||||
|
```
|
||||||
|
|
||||||
|
## Development
|
||||||
|
|
||||||
|
### TODO
|
||||||
|
|
||||||
|
Write some tests
|
||||||
|
|
||||||
|
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
||||||
|
|
||||||
|
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/openlib.
|
||||||
|
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
|
||||||
10
Rakefile
Normal file
10
Rakefile
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
require "bundler/gem_tasks"
|
||||||
|
require "rake/testtask"
|
||||||
|
|
||||||
|
Rake::TestTask.new(:test) do |t|
|
||||||
|
t.libs << "test"
|
||||||
|
t.libs << "lib"
|
||||||
|
t.test_files = FileList["test/**/*_test.rb"]
|
||||||
|
end
|
||||||
|
|
||||||
|
task :default => :test
|
||||||
14
bin/console
Executable file
14
bin/console
Executable file
@@ -0,0 +1,14 @@
|
|||||||
|
#!/usr/bin/env ruby
|
||||||
|
|
||||||
|
require "bundler/setup"
|
||||||
|
require "openlib"
|
||||||
|
|
||||||
|
# You can add fixtures and/or initialization code here to make experimenting
|
||||||
|
# with your gem easier. You can also use a different console, if you like.
|
||||||
|
|
||||||
|
# (If you use this, don't forget to add pry to your Gemfile!)
|
||||||
|
# require "pry"
|
||||||
|
# Pry.start
|
||||||
|
|
||||||
|
require "irb"
|
||||||
|
IRB.start(__FILE__)
|
||||||
8
bin/setup
Executable file
8
bin/setup
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -euo pipefail
|
||||||
|
IFS=$'\n\t'
|
||||||
|
set -vx
|
||||||
|
|
||||||
|
bundle install
|
||||||
|
|
||||||
|
# Do any other automated setup that you need to do here
|
||||||
14
lib/openlib.rb
Normal file
14
lib/openlib.rb
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
require 'openlib/version'
|
||||||
|
require 'openlib/client'
|
||||||
|
require 'openlib/book'
|
||||||
|
|
||||||
|
module Openlib
|
||||||
|
ID_KINDS = %i[isbn oclc lccn olid].freeze
|
||||||
|
|
||||||
|
class Error < StandardError; end
|
||||||
|
# Your code goes here...
|
||||||
|
|
||||||
|
|
||||||
|
end
|
||||||
54
lib/openlib/book.rb
Normal file
54
lib/openlib/book.rb
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
require 'json'
|
||||||
|
|
||||||
|
module Openlib
|
||||||
|
class Book
|
||||||
|
def initialize(id, id_kind: :isbn, user_agent: nil)
|
||||||
|
@id = id
|
||||||
|
@id_kind= id_kind.to_sym
|
||||||
|
@client = Openlib::Client.new(user_agent: user_agent)
|
||||||
|
@view = nil
|
||||||
|
@data = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
##
|
||||||
|
# Check that we got back the expected data
|
||||||
|
def view
|
||||||
|
@view ||= @client.get(id: @id, id_kind: @id_kind, format: 'viewapi')
|
||||||
|
end
|
||||||
|
|
||||||
|
def data
|
||||||
|
@data ||= @client.get(id: @id, id_kind: @id_kind, format: 'data')
|
||||||
|
end
|
||||||
|
|
||||||
|
def view_data(req: )
|
||||||
|
view.first.last.dig(req.to_s)
|
||||||
|
end
|
||||||
|
|
||||||
|
def data_data(req:)
|
||||||
|
case req
|
||||||
|
when :authors, :publishers, :subjects then data.first.last.dig(req.to_s).map {|p| p.dig('name') }
|
||||||
|
else
|
||||||
|
data.first.last.dig(req.to_s)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def author
|
||||||
|
authors
|
||||||
|
end
|
||||||
|
|
||||||
|
def method_missing(m, *args, &block)
|
||||||
|
case m
|
||||||
|
when :info_url, :preview, :preview_url, :thumbnail_url
|
||||||
|
then self.send('view_data', req: m)
|
||||||
|
when :url, :authors, :identifiers, :classifications, :subjects,
|
||||||
|
:subject_places, :subject_people, :subject_times, :publishers,
|
||||||
|
:publish_places, :publish_date, :excerpts, :links, :cover, :ebooks,
|
||||||
|
:number_of_pages, :weight, :title
|
||||||
|
then self.send('data_data', req: m)
|
||||||
|
else
|
||||||
|
super
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
23
lib/openlib/client.rb
Normal file
23
lib/openlib/client.rb
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
module Openlib
|
||||||
|
require 'open-uri'
|
||||||
|
USER_AGENT = "Ruby OpenLib/#{Openlib::VERSION}"
|
||||||
|
|
||||||
|
class Client
|
||||||
|
def initialize(user_agent: nil)
|
||||||
|
@user_agent = user_agent || USER_AGENT
|
||||||
|
end
|
||||||
|
|
||||||
|
def get(id:, format: 'data', id_kind: :isbn)
|
||||||
|
raise ArgumetError, "Kind must be one of #{ID_KINDS}" unless ID_KINDS.include?(id_kind)
|
||||||
|
|
||||||
|
resp = URI.open( "https://openlibrary.org/api/books?jscmd=#{format}&format=json&bibkeys=#{id_kind.to_s.upcase}#{id}", 'User-Agent' => @user_agent )
|
||||||
|
|
||||||
|
byebug unless resp.status.first == '200'
|
||||||
|
|
||||||
|
JSON.parse(resp.read)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
3
lib/openlib/version.rb
Normal file
3
lib/openlib/version.rb
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
module Openlib
|
||||||
|
VERSION = "0.1.0"
|
||||||
|
end
|
||||||
28
openlib.gemspec
Normal file
28
openlib.gemspec
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
require_relative 'lib/openlib/version'
|
||||||
|
|
||||||
|
Gem::Specification.new do |spec|
|
||||||
|
spec.name = "openlib"
|
||||||
|
spec.version = Openlib::VERSION
|
||||||
|
spec.authors = ["Dan Milne"]
|
||||||
|
spec.email = ["d@nmilne.com"]
|
||||||
|
|
||||||
|
spec.summary = %q{Simple OpenLibrary Client.}
|
||||||
|
spec.homepage = "https://github.com/dkam/openlib"
|
||||||
|
spec.license = "MIT"
|
||||||
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
||||||
|
|
||||||
|
spec.metadata["allowed_push_host"] = "TODO: Set to 'http://mygemserver.com'"
|
||||||
|
|
||||||
|
spec.metadata["homepage_uri"] = spec.homepage
|
||||||
|
spec.metadata["source_code_uri"] = "https://github.com/dkam/openlib"
|
||||||
|
spec.metadata["changelog_uri"] = "https://github.com/dkam/openlib/blob/master/CHANGELOG.md"
|
||||||
|
|
||||||
|
# Specify which files should be added to the gem when it is released.
|
||||||
|
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
||||||
|
spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
|
||||||
|
`git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
|
||||||
|
end
|
||||||
|
spec.bindir = "exe"
|
||||||
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
||||||
|
spec.require_paths = ["lib"]
|
||||||
|
end
|
||||||
11
test/openlib_test.rb
Normal file
11
test/openlib_test.rb
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
require "test_helper"
|
||||||
|
|
||||||
|
class OpenlibTest < Minitest::Test
|
||||||
|
def test_that_it_has_a_version_number
|
||||||
|
refute_nil ::Openlib::VERSION
|
||||||
|
end
|
||||||
|
|
||||||
|
def test_it_does_something_useful
|
||||||
|
assert false
|
||||||
|
end
|
||||||
|
end
|
||||||
4
test/test_helper.rb
Normal file
4
test/test_helper.rb
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
$LOAD_PATH.unshift File.expand_path("../lib", __dir__)
|
||||||
|
require "openlib"
|
||||||
|
|
||||||
|
require "minitest/autorun"
|
||||||
Reference in New Issue
Block a user