mose/hackpad-cli

View on GitHub
lib/hackpad/cli/api.rb

Summary

Maintainability
A
25 mins
Test Coverage
require 'oauth'
require 'net/http'
require 'json'
require 'reverse_markdown'

require_relative '../../reverse_markdown/converters/head'

module Hackpad
  module Cli

    class ApiException < StandardError
    end

    module Api
      module_function

      def prepare(workspace)
        @hackpad ||= OAuth::Consumer.new(workspace.client_id, workspace.secret, site: workspace.site)
        @version = File.read(File.expand_path('../../../../CHANGELOG.md', __FILE__))[/([0-9]+\.[0-9]+\.[0-9]+)/]
      end

      def search(term, start = 0)
        get "/api/1.0/search?q=#{CGI.escape term}&start=#{start}&limit=100"
      end

      def list
        get '/api/1.0/pads/all'
      end

      def read_options(id)
        get "/api/1.0/pad/#{id}/options"
      end

      def read(id, ext)
        realext = (ext == 'md') ? 'html' : ext
        get "/api/1.0/pad/#{id}/content/latest.#{realext}", false, (ext == 'md')
      end

      def get(url, json = true, to_md = false)
        res = @hackpad.request :get, url
        if res.is_a? Net::HTTPOK
          if json
            JSON.parse(res.body)
          else
            if to_md
              cleanup_md(res.body)
            else
              res.body
            end
          end
        else
          fail ApiException, "HTTP error, code #{res.code}"
        end
      end

      def cleanup_md(text)
        back = ReverseMarkdown.convert(text, github_flavored: true).strip
        back.gsub!(/\n-\s*\n/m, "\n") # empty list items
        back.gsub!(/\n\\\*\s*\n/m, "\n") # images are shown as \*
        back.gsub!(/-([^\n]+)\n\n  -/m, "-\\1\n  -") # avoid extra blank lines in lists
        back.gsub!(/\n(  )*-([^\n]+)\n?\n(  )*-([^\n]+)\n?\n/m, "\n\\1-\\2\n\\3-\\4\n") # another more generalist for lists
        back.gsub(/\n\n?\*\*([^\*]+)\*\*\n\n?/, "\n\n### \\1\n\n") # transform isolated titles from bold to h3
      end

    end
  end
end