Source

ocaml-bitbucket / api.ml

Full commit
camlspotter ab68943 
camlspotter 4fafae1 

camlspotter d5035b3 
camlspotter d0b5325 


camlspotter 4fafae1 

camlspotter d0b5325 
camlspotter 4fafae1 
camlspotter d0b5325 

camlspotter ab68943 
camlspotter d5035b3 







camlspotter ab68943 
camlspotter 32095fd 
camlspotter ab68943 

camlspotter 2c28ebd 
camlspotter ab68943 
camlspotter d0b5325 


camlspotter 2c28ebd 




camlspotter d0b5325 
camlspotter ab68943 
camlspotter d0b5325 
camlspotter 2c28ebd 

camlspotter 4fafae1 
camlspotter 2c28ebd 



camlspotter d0b5325 








camlspotter 32095fd 
































camlspotter d0b5325 

camlspotter 32095fd 
camlspotter d0b5325 






camlspotter 4fafae1 
camlspotter d0b5325 



camlspotter ab68943 
open Common
open Tiny_json
open Json_conv
open Meta_conv.Conv
open Sexplib.Conv

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 Address = struct
  include Address
  let sexp_of_t _ = Sexplib.Sexp.Atom ""
  let t_of_sexp _ = top
end

type 'target fields = (string * ('target * Address.t)) list with sexp

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

module User = struct

  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

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

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

  type resp = {
    user : user;
    repositories : Repository.t list;
  } 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 resp_of_json_exn (Json.parse s) with e -> 
      prerr_endline (Printexc.to_string e);
      prerr_endline s;
      raise e

end