..
   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.

About Apache Chemistry cmislib
==============================
The goal of this project is to create a CMIS client for Python that can be used to work with any CMIS-compliant repository.

The library is being developed with the following guidelines:
 * Developers using this API should be able to work with CMIS domain objects without having to worry about the underlying implementation details.
 * The library will use the Resftul AtomPub Binding and the Browser Binding (added with CMIS 1.1).
 * The library will conform to the `CMIS spec <http://docs.oasis-open.org/cmis/CMIS/v1.1/CMIS-v1.1.html>`_ as closely as possible. Several public CMIS repositories are being used to test the API.
 * The library should have no hard-coded URL's. It should be able to get everything it needs regarding how to work with the CMIS service from the CMIS service URL response and subsequent calls.
 * There shouldn't have to be a vendor-specific version of this library. The goal is for it to be interoperable with CMIS-compliant providers.

Quick Example
-------------
This should give you an idea of how easy and natural it is to work with the API:
  >>> cmisClient = cmislib.CmisClient('http://localhost:8080/alfresco/api/-default-/public/cmis/versions/1.1/atom', 'admin', 'admin')
  >>> repo = cmisClient.defaultRepository
  >>> rootFolder = repo.rootFolder
  >>> children = rootFolder.getChildren()
  >>> newFolder = rootFolder.createFolder('testDeleteFolder folder')
  >>> props = newFolder.properties
  >>> newFolder.delete()
