#!/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://gitbox.apache.org/repos/asf?p=qpid-python.git;a=blob_plain;f=examples/README.txt;hb={}".format(release)
    source_url = "https://gitbox.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")
