Source

ocaml-bitbucket / api.ml

Full commit
camlspotter 4e97499 
camlspotter ab68943 
camlspotter 4fafae1 

camlspotter 31339bc 
camlspotter d0b5325 

camlspotter 430c29c 

camlspotter 4e97499 







camlspotter d5035b3 
camlspotter ab68943 
camlspotter 32095fd 
camlspotter ab68943 

camlspotter a676a3c 







camlspotter b760f49 

camlspotter 4fafae1 
camlspotter 32095fd 

camlspotter 4e97499 
camlspotter 32095fd 

camlspotter a676a3c 



camlspotter 32095fd 


















camlspotter b760f49 

camlspotter 32095fd 


camlspotter b760f49 
camlspotter 4e97499 






camlspotter 430c29c 
camlspotter 4e97499 











camlspotter b760f49 


camlspotter 2c28ebd 
camlspotter ab68943 
camlspotter b760f49 








camlspotter 4e97499 
camlspotter 4fafae1 
camlspotter b760f49 
camlspotter 430c29c 
camlspotter 4fafae1 






camlspotter 4e97499 
camlspotter 4fafae1 



camlspotter d0b5325 


camlspotter 2c28ebd 




camlspotter d0b5325 
camlspotter ab68943 
camlspotter d0b5325 
camlspotter 2c28ebd 

camlspotter 4fafae1 
camlspotter 2c28ebd 



camlspotter ab68943 
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