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