#!/usr/bin/python
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
# 
#   http://www.apache.org/licenses/LICENSE-2.0
# 
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#

from generate import *

def gen_python_apis(release, source_dir, release_dir):
    component_dir = join(release_dir, "messaging-api")
    remove(component_dir)

    input_path = join(source_dir, "python")
    input_namespace = "qpid.messaging"
    output_dir = join(component_dir, "api")

    gen_epydoc(release=release,
               title="Qpid Python Messaging API",
               input_paths=(input_path,),
               input_namespaces=(input_namespace,),
               output_dir=output_dir)

def gen_python_examples(release, source_dir, release_dir):
    component_dir = join(release_dir, "messaging-api")
    input_dir = join(source_dir, "examples", "api")
    output_dir = join(component_dir, "examples")

    readme_url = "https://git-wip-us.apache.org/repos/asf?p=qpid-python.git;a=blob_plain;f=examples/README.txt;hb={}".format(release)
    source_url = "https://git-wip-us.apache.org/repos/asf?p=qpid-python.git;a=tree;f=examples;hb={}".format(release)

    input_names = list_dir(input_dir)

    gen_examples(release=release,
                 title="Python Messaging API Examples",
                 lang="python",
                 input_dir=input_dir,
                 input_names=input_names,
                 output_dir=output_dir,
                 readme_url=readme_url,
                 source_url=source_url)
    
## Now do stuff ##

release, issues_release, source_release, release_dir, checkout_dir = setup_release_script()
source_dir = checkout_dir or fetch_source("python", source_release)

gen_python_apis(release, source_dir, release_dir)
gen_python_examples(release, source_dir, release_dir)

notice("Docs generated")
