commit 0929b3eb8086c13623c880f2e4efe951f8fed0d3 Author: Dan Milne Date: Wed Apr 22 00:18:09 2020 +1000 Initial import diff --git a/.byebug_history b/.byebug_history new file mode 100644 index 0000000..0365720 --- /dev/null +++ b/.byebug_history @@ -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 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9106b2a --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +/.bundle/ +/.yardoc +/_yardoc/ +/coverage/ +/doc/ +/pkg/ +/spec/reports/ +/tmp/ diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..d4d04d5 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,6 @@ +--- +language: ruby +cache: bundler +rvm: + - 2.6.6 +before_install: gem install bundler -v 2.1.4 diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..9b5430c --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,2 @@ +## 0.1.0 +- Initial version diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..7a1d8bf --- /dev/null +++ b/Gemfile @@ -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' diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..29ae474 --- /dev/null +++ b/Gemfile.lock @@ -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 diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 0000000..ca59a68 --- /dev/null +++ b/LICENSE.txt @@ -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. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d107db8 --- /dev/null +++ b/README.md @@ -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). diff --git a/Rakefile b/Rakefile new file mode 100644 index 0000000..d433a1e --- /dev/null +++ b/Rakefile @@ -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 diff --git a/bin/console b/bin/console new file mode 100755 index 0000000..3366275 --- /dev/null +++ b/bin/console @@ -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__) diff --git a/bin/setup b/bin/setup new file mode 100755 index 0000000..dce67d8 --- /dev/null +++ b/bin/setup @@ -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 diff --git a/lib/openlib.rb b/lib/openlib.rb new file mode 100644 index 0000000..d4929bf --- /dev/null +++ b/lib/openlib.rb @@ -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 diff --git a/lib/openlib/book.rb b/lib/openlib/book.rb new file mode 100644 index 0000000..fdd2bb3 --- /dev/null +++ b/lib/openlib/book.rb @@ -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 \ No newline at end of file diff --git a/lib/openlib/client.rb b/lib/openlib/client.rb new file mode 100644 index 0000000..32062d6 --- /dev/null +++ b/lib/openlib/client.rb @@ -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 diff --git a/lib/openlib/version.rb b/lib/openlib/version.rb new file mode 100644 index 0000000..31c0a05 --- /dev/null +++ b/lib/openlib/version.rb @@ -0,0 +1,3 @@ +module Openlib + VERSION = "0.1.0" +end diff --git a/openlib.gemspec b/openlib.gemspec new file mode 100644 index 0000000..d4820b7 --- /dev/null +++ b/openlib.gemspec @@ -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 diff --git a/test/openlib_test.rb b/test/openlib_test.rb new file mode 100644 index 0000000..518719d --- /dev/null +++ b/test/openlib_test.rb @@ -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 diff --git a/test/test_helper.rb b/test/test_helper.rb new file mode 100644 index 0000000..f4fa690 --- /dev/null +++ b/test/test_helper.rb @@ -0,0 +1,4 @@ +$LOAD_PATH.unshift File.expand_path("../lib", __dir__) +require "openlib" + +require "minitest/autorun"