Source

ocaml-bitbucket / api.ml

Full commit
camlspotter 4e97499 
camlspotter ab68943 
camlspotter 4fafae1 

camlspotter 31339bc 
camlspotter d0b5325 

camlspotter d5035b3 
camlspotter 31339bc 
camlspotter d5035b3 




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 b760f49 


camlspotter 2c28ebd 
camlspotter ab68943 
camlspotter b760f49 








camlspotter 4e97499 
camlspotter 4fafae1 
camlspotter b760f49 
camlspotter 9253a5c 
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

module Address = struct
  include Meta_conv.Types.Address
  let sexp_of_t _ = Sexplib.Sexp.Atom ""
  let t_of_sexp _ = top
end

type 'target fields = (string * ('target * Address.t)) list with sexp
type 'target mc_leftovers = 'target 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

  type 'a named_list = (string * 'a) list with sexp
  let json_of_named_list : ('a -> t) -> 'a named_list -> t = fun f xs -> 
    Object (List.map (fun (name, a) -> (name, f a)) xs)
  let named_list_of_json (d : 'a decoder) : (string * 'a) list decoder = fun ?(adrs=[]) ->
    function
      | Object fields -> 
          let adrs = 0::adrs in (* CR jfuruse: wrong! *)
          `Ok (List.map (fun (name, v) -> (name, d ~adrs v)) fields)
      | v -> `Error (Meta_conv.Types.Error.Primitive_decoding_failure "Object expected for named list", 
                     v,
                     adrs)

  let named_list_of_json_exn d ?adrs v = 
    match named_list_of_json d ?adrs v with
    | `Ok v -> v
    | `Error err -> raise (Json_conv.Error err)
    
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 Json.named_list 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 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