ocaml-bitbucket / api.ml

open Printf
open Common
open Tiny_json
open Json_conv
open Meta_conv.Open
open Sexplib.Conv

type 'target mc_fields = (string * 'target) list with sexp
type 'target mc_leftovers = 'target mc_fields with sexp

module Json = struct
  include Json
  let sexp_of_t j = Sexplib.Sexp.Atom (Json.show j)
  let t_of_sexp = function
    | Sexplib.Sexp.Atom s -> Json.parse s
    | _ -> assert false
end

module Scheme = struct
  type t = Hg(:"hg":) | Git(:"git":) with conv(json), sexp
end

module LocalTime = struct
  type t = string with conv(json), sexp
end

module UTCTime = struct
  type t = string with conv(json), sexp
end

(** repositories Endpoint *)
module Repositories = struct

  module Repository = struct
    type t = {
      name              : string;
      scm               : Scheme.t;
      has_wiki          : bool;
      last_updated      : LocalTime.t;
      utc_last_updated  : UTCTime.t;
      created_on        : LocalTime.t;
      utc_created_on    : UTCTime.t;
      owner             : string;
      logo              : string;
      email_mailinglist : string option;
      is_mq             : bool;
      size              : int;
      read_only         : bool;
      followers_count   : int;
      state             : string; (* "str(available)" *)
      website           : string option;
      description       : string option;
      has_issues        : bool;
      is_fork           : bool;
      slug              : string;
      is_private        : bool;
      language          : string;
      email_writers     : bool;
      no_public_forks   : bool;
      resource_uri      : string;
      fork_of           : t option;
      mq_of             : t option;
      creator           : string option;
    } with conv(json), sexp
  end


  (* https://api.bitbucket.org/1.0/repositories/{accountname}/{repo_slug}/branches *)
  module Branches = struct

    type branch = {
      unknown : Json.t mc_leftovers;
    } with conv(json), sexp

    type t = branch mc_fields with conv(json), sexp

    let get ~accountname ~repo_slug = 
      let s = Curl.get_string (fun h ->
        h#set_url (sprintf "https://api.bitbucket.org/1.0/repositories/%s/%s/branches" accountname repo_slug);
        (* h#set_userpwd (Printf.sprintf "%s:%s" user password) *))
      in
      try t_of_json_exn (Json.parse s) with e -> 
        prerr_endline (Printexc.to_string e);
        prerr_endline s;
        raise e
      
  end
end

(** user Endpoint *)
module User = struct

  type user = {
    username     : string;
    first_name   : string;
    last_name    : string;
    is_team      : bool;
    avatar       : string;
    resource_uri : string
  } with conv(json), sexp

  type t = {
    user : user;
    repositories : Repositories.Repository.t list;
    rest (: Leftovers :) : Json.t mc_fields;
  } with conv(json), sexp

  let get ~user ~password = 
    let s = Curl.get_string (fun h ->
      h#set_url "https://api.bitbucket.org/1.0/user";
      h#set_userpwd (Printf.sprintf "%s:%s" user password))
    in
    try t_of_json_exn (Json.parse s) with e -> 
      prerr_endline (Printexc.to_string e);
      prerr_endline s;
      raise e

  module Repositories = struct

    type repo = { 
      owner      : string;
      scm        : Scheme.t;
      slug       : string;
      is_private : bool;
      name       : string
    } 

    and resp = repo list with conv(json)

    let get ~user ~password = 
      resp_of_json (Json.parse (Curl.get_string (fun h ->
        h#set_url "https://api.bitbucket.org/1.0/user/repositories/";
        h#set_userpwd (Printf.sprintf "%s:%s" user password))))
  end

end
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.