tools: remove unused gflags module
Its only dependant was closure-linter but that was removed in commit f9dd34d ("tools: replace closure-linter with eslint"). Remove it. Fixes: https://github.com/nodejs/node/issues/3217 PR-URL: https://github.com/nodejs/node/pull/3220 Reviewed-By: Trevor Norris <trev.norris@gmail.com>
This commit is contained in:
parent
aa97ae7cf8
commit
87d26152b4
32
LICENSE
32
LICENSE
@ -237,38 +237,6 @@ The externally maintained libraries used by Node.js are:
|
|||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
- python-gflags is located at tools/gflags. Its license follows:
|
|
||||||
"""
|
|
||||||
# Copyright (c) 2006, Google Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above
|
|
||||||
# copyright notice, this list of conditions and the following disclaimer
|
|
||||||
# in the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
# * Neither the name of Google Inc. nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
"""
|
|
||||||
|
|
||||||
- tools/cpplint.py is a C++ linter. Its license follows:
|
- tools/cpplint.py is a C++ linter. Its license follows:
|
||||||
"""
|
"""
|
||||||
# Copyright (c) 2009 Google Inc. All rights reserved.
|
# Copyright (c) 2009 Google Inc. All rights reserved.
|
||||||
|
@ -1 +0,0 @@
|
|||||||
google-gflags@googlegroups.com
|
|
@ -1,28 +0,0 @@
|
|||||||
Copyright (c) 2006, Google Inc.
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1,62 +0,0 @@
|
|||||||
Wed Jan 18 13:57:39 2012 Google Inc. <google-gflags@googlegroups.com>
|
|
||||||
|
|
||||||
* python-gflags: version 2.0
|
|
||||||
* No changes from version 1.8.
|
|
||||||
|
|
||||||
Wed Jan 18 11:54:03 2012 Google Inc. <google-gflags@googlegroups.com>
|
|
||||||
|
|
||||||
* python-gflags: version 1.8
|
|
||||||
* Don't raise DuplicateFlag when re-importing a module (mmcdonald)
|
|
||||||
* Changed the 'official' python-gflags email in setup.py/etc
|
|
||||||
* Changed copyright text to reflect Google's relinquished ownership
|
|
||||||
|
|
||||||
Tue Dec 20 17:10:41 2011 Google Inc. <opensource@google.com>
|
|
||||||
|
|
||||||
* python-gflags: version 1.7
|
|
||||||
* Prepare gflags for python 3.x, keeping 2.4 compatibility (twouters)
|
|
||||||
* If output is a tty, use terminal's width to wrap help-text (wiesmann)
|
|
||||||
* PORTING: Fix ImportError for non-Unix platforms (kdeus)
|
|
||||||
* PORTING: Run correctly when termios isn't available (shines)
|
|
||||||
* Add unicode support to flags (csilvers)
|
|
||||||
|
|
||||||
Fri Jul 29 12:24:08 2011 Google Inc. <opensource@google.com>
|
|
||||||
|
|
||||||
* python-gflags: version 1.6
|
|
||||||
* Document FlagValues.UseGnuGetOpt (garymm)
|
|
||||||
* replace fchmod with chmod to work on python 2.4 (mshields)
|
|
||||||
* Fix bug in flag decl reporting for dup flags (craigcitro)
|
|
||||||
* Add multi_float, and tests for multi_float/int (simonf)
|
|
||||||
* Make flagfiles expand in place, to follow docs (dmlynch)
|
|
||||||
* Raise exception if --flagfile can't be read (tlim)
|
|
||||||
|
|
||||||
Wed Jan 26 13:50:46 2011 Google Inc. <opensource@google.com>
|
|
||||||
|
|
||||||
* python-gflags: version 1.5.1
|
|
||||||
* Fix manifest and setup.py to include new files
|
|
||||||
|
|
||||||
Mon Jan 24 16:58:10 2011 Google Inc. <opensource@google.com>
|
|
||||||
|
|
||||||
* python-gflags: version 1.5
|
|
||||||
* Add support for flag validators (olexiy)
|
|
||||||
* Better reporting on UnrecognizedFlagError (sorenj)
|
|
||||||
* Cache ArgumentParser, to save space (tmarek)
|
|
||||||
|
|
||||||
Wed Oct 13 17:40:12 2010 Google Inc. <opensource@google.com>
|
|
||||||
|
|
||||||
* python-gflags: version 1.4
|
|
||||||
* Unregister per-command flags after running the command (dnr)
|
|
||||||
* Allow key-flags to work with special flags (salcianu)
|
|
||||||
* Allow printing flags of a specific module (mikecurtis)
|
|
||||||
* BUGFIX: Fix an error message for float flags (olexiy)
|
|
||||||
* BUGFIX: Can now import while defining flags (salcianu)
|
|
||||||
* BUGFIX: Fix flagfile parsing in python (chronos)
|
|
||||||
* DOC: Better explain the format of --helpxml output (salcianu)
|
|
||||||
* DOC: Better error message on parse failure (tstromberg)
|
|
||||||
* Better test coverage under python 2.2 (mshields)
|
|
||||||
* Added a Makefile for building the packages.
|
|
||||||
|
|
||||||
Mon Jan 4 18:46:29 2010 Tim 'mithro' Ansell <mithro@mithis.com>
|
|
||||||
|
|
||||||
* python-gflags: version 1.3
|
|
||||||
* Fork from the C++ package (google-gflags 1.3)
|
|
||||||
* Add debian packaging
|
|
@ -1,19 +0,0 @@
|
|||||||
include AUTHORS
|
|
||||||
include COPYING
|
|
||||||
include ChangeLog
|
|
||||||
include MANIFEST.in
|
|
||||||
include Makefile
|
|
||||||
include NEWS
|
|
||||||
include README
|
|
||||||
include debian/README
|
|
||||||
include debian/changelog
|
|
||||||
include debian/compat
|
|
||||||
include debian/control
|
|
||||||
include debian/copyright
|
|
||||||
include debian/docs
|
|
||||||
include debian/rules
|
|
||||||
include gflags.py
|
|
||||||
include gflags2man.py
|
|
||||||
include gflags_validators.py
|
|
||||||
include setup.py
|
|
||||||
recursive-include tests *.py
|
|
@ -1,69 +0,0 @@
|
|||||||
|
|
||||||
prep:
|
|
||||||
@echo
|
|
||||||
# Install needed packages
|
|
||||||
sudo apt-get install subversion fakeroot python-setuptools python-subversion
|
|
||||||
#
|
|
||||||
@echo
|
|
||||||
# Check that the person has .pypirc
|
|
||||||
@if [ ! -e ~/.pypirc ]; then \
|
|
||||||
echo "Please create a ~/.pypirc with the following contents:"; \
|
|
||||||
echo "[server-login]"; \
|
|
||||||
echo "username:google_opensource"; \
|
|
||||||
echo "password:<see valentine>"; \
|
|
||||||
fi
|
|
||||||
#
|
|
||||||
@echo
|
|
||||||
# FIXME(tansell): Check that the person has .dputrc for PPA
|
|
||||||
|
|
||||||
clean:
|
|
||||||
# Clean up any build files.
|
|
||||||
python setup.py clean --all
|
|
||||||
#
|
|
||||||
# Clean up the debian stuff
|
|
||||||
fakeroot ./debian/rules clean
|
|
||||||
#
|
|
||||||
# Clean up everything else
|
|
||||||
rm MANIFEST || true
|
|
||||||
rm -rf build-*
|
|
||||||
#
|
|
||||||
# Clean up the egg files
|
|
||||||
rm -rf *egg*
|
|
||||||
#
|
|
||||||
# Remove dist
|
|
||||||
rm -rf dist
|
|
||||||
|
|
||||||
dist:
|
|
||||||
# Generate the tarball based on MANIFEST.in
|
|
||||||
python setup.py sdist
|
|
||||||
#
|
|
||||||
# Build the debian packages
|
|
||||||
fakeroot ./debian/rules binary
|
|
||||||
mv ../python-gflags*.deb ./dist/
|
|
||||||
#
|
|
||||||
# Build the python Egg
|
|
||||||
python setup.py bdist_egg
|
|
||||||
#
|
|
||||||
@echo
|
|
||||||
@echo "Files to upload:"
|
|
||||||
@echo "--------------------------"
|
|
||||||
@ls -l ./dist/
|
|
||||||
|
|
||||||
push:
|
|
||||||
# Send the updates to svn
|
|
||||||
# Upload the source package to code.google.com
|
|
||||||
- /home/build/opensource/tools/googlecode_upload.py \
|
|
||||||
-p python-gflags ./dist/*
|
|
||||||
#
|
|
||||||
# Upload the package to PyPi
|
|
||||||
- python setup.py sdist upload
|
|
||||||
- python setup.py bdist_egg upload
|
|
||||||
#
|
|
||||||
# Upload the package to the ppa
|
|
||||||
# FIXME(tansell): dput should run here
|
|
||||||
|
|
||||||
check:
|
|
||||||
# Run all the tests.
|
|
||||||
for test in tests/*.py; do PYTHONPATH=. python $$test || exit 1; done
|
|
||||||
|
|
||||||
.PHONY: prep dist clean push check
|
|
@ -1,77 +0,0 @@
|
|||||||
== 18 January 2012 ==
|
|
||||||
|
|
||||||
[Prependum:] I just realized I should have named the new version 2.0,
|
|
||||||
to reflect the new ownership and status as a community run project.
|
|
||||||
Not too late, I guess. I've just released python-gflags 2.0, which is
|
|
||||||
identical to python-gflags 1.8 except for the version number.
|
|
||||||
|
|
||||||
I've just released python-gflags 1.8. This fixes a bug, allowing
|
|
||||||
modules defining flags to be re-imported without raising duplicate
|
|
||||||
flag errors.
|
|
||||||
|
|
||||||
Administrative note: In the coming weeks, I'll be stepping down as
|
|
||||||
maintainer for the python-gflags project, and as part of that Google
|
|
||||||
is relinquishing ownership of the project; it will now be entirely
|
|
||||||
community run. The remaining
|
|
||||||
[http://python-gflags.googlecode.com/svn/tags/python-gflags-1.8/ChangeLog changes]
|
|
||||||
in this release reflect that shift.
|
|
||||||
|
|
||||||
|
|
||||||
=== 20 December 2011 ===
|
|
||||||
|
|
||||||
I've just released python-gflags 1.7. The major change here is
|
|
||||||
improved unicode support, in both flag default values and
|
|
||||||
help-strings. We've also made big steps toward making gflags work
|
|
||||||
with python 3.x (while keeping 2.4 compatibility), and improving
|
|
||||||
--help output in the common case where output is a tty.
|
|
||||||
|
|
||||||
For a full list of changes since last release, see the
|
|
||||||
[http://python-gflags.googlecode.com/svn/tags/python-gflags-1.7/ChangeLog ChangeLog].
|
|
||||||
|
|
||||||
=== 29 July 2011 ===
|
|
||||||
|
|
||||||
I've just released python-gflags 1.6. This release has only minor
|
|
||||||
changes, including support for multi_float flags. The full list of
|
|
||||||
changes is in the
|
|
||||||
[http://python-gflags.googlecode.com/svn/tags/python-gflags-1.6/ChangeLog ChangeLog].
|
|
||||||
|
|
||||||
The major change with this release is procedural: I've changed the
|
|
||||||
internal tools used to integrate Google-supplied patches for gflags
|
|
||||||
into the opensource release. These new tools should result in more
|
|
||||||
frequent updates with better change descriptions. They will also
|
|
||||||
result in future `ChangeLog` entries being much more verbose (for
|
|
||||||
better or for worse).
|
|
||||||
|
|
||||||
=== 26 January 2011 ===
|
|
||||||
|
|
||||||
I've just released python-gflags 1.5.1. I had improperly packaged
|
|
||||||
python-gflags 1.5, so it probably doesn't work. All users who have
|
|
||||||
updated to python-gflags 1.5 are encouraged to update again to 1.5.1.
|
|
||||||
|
|
||||||
=== 24 January 2011 ===
|
|
||||||
|
|
||||||
I've just released python-gflags 1.5. This release adds support for
|
|
||||||
flag verifiers: small functions you can associate with flags, that are
|
|
||||||
called whenever the flag value is set or modified, and can verify that
|
|
||||||
the new value is legal. It also has other, minor changes, described
|
|
||||||
in the
|
|
||||||
[http://python-gflags.googlecode.com/svn/tags/python-gflags-1.5/ChangeLog ChangeLog].
|
|
||||||
|
|
||||||
=== 11 October 2010 ===
|
|
||||||
|
|
||||||
I've just released python-gflags 1.4. This release has only minor
|
|
||||||
changes from 1.3, including support for printing flags of a specific
|
|
||||||
module, allowing key-flags to work with special flags, somewhat better
|
|
||||||
error messaging, and
|
|
||||||
[http://python-gflags.googlecode.com/svn/tags/python-gflags-1.4/ChangeLog so forth].
|
|
||||||
If 1.3 is working well for you, there's no particular reason to upgrade.
|
|
||||||
|
|
||||||
=== 4 January 2010 ===
|
|
||||||
|
|
||||||
I just released python-gflags 1.3. This is the first python-gflags
|
|
||||||
release; it is version 1.3 because this code is forked from the 1.3
|
|
||||||
release of google-gflags.
|
|
||||||
|
|
||||||
I don't have a tarball or .deb file up quite yet, so for now you will
|
|
||||||
have to get the source files by browsing under the 'source'
|
|
||||||
tag. Downloadable files will be available soon.
|
|
@ -1,10 +0,0 @@
|
|||||||
Metadata-Version: 1.0
|
|
||||||
Name: python-gflags
|
|
||||||
Version: 2.0
|
|
||||||
Summary: Google Commandline Flags Module
|
|
||||||
Home-page: http://code.google.com/p/python-gflags
|
|
||||||
Author: Google Inc. and others
|
|
||||||
Author-email: google-gflags@googlegroups.com
|
|
||||||
License: BSD
|
|
||||||
Description: UNKNOWN
|
|
||||||
Platform: UNKNOWN
|
|
@ -1,23 +0,0 @@
|
|||||||
This repository contains a python implementation of the Google commandline
|
|
||||||
flags module.
|
|
||||||
|
|
||||||
GFlags defines a *distributed* command line system, replacing systems like
|
|
||||||
getopt(), optparse and manual argument processing. Rather than an application
|
|
||||||
having to define all flags in or near main(), each python module defines flags
|
|
||||||
that are useful to it. When one python module imports another, it gains
|
|
||||||
access to the other's flags.
|
|
||||||
|
|
||||||
It includes the ability to define flag types (boolean, float, interger, list),
|
|
||||||
autogeneration of help (in both human and machine readable format) and reading
|
|
||||||
arguments from a file. It also includes the ability to automatically generate
|
|
||||||
man pages from the help flags.
|
|
||||||
|
|
||||||
Documentation for implementation is at the top of gflags.py file.
|
|
||||||
|
|
||||||
To install the python module, run
|
|
||||||
python ./setup.py install
|
|
||||||
|
|
||||||
When you install this library, you also get a helper application,
|
|
||||||
gflags2man.py, installed into /usr/local/bin. You can run gflags2man.py to
|
|
||||||
create an instant man page, with all the commandline flags and their docs, for
|
|
||||||
any C++ or python program you've written using the gflags library.
|
|
@ -1,7 +0,0 @@
|
|||||||
The list of files here isn't complete. For a step-by-step guide on
|
|
||||||
how to set this package up correctly, check out
|
|
||||||
http://www.debian.org/doc/maint-guide/
|
|
||||||
|
|
||||||
Most of the files that are in this directory are boilerplate.
|
|
||||||
However, you may need to change the list of binary-arch dependencies
|
|
||||||
in 'rules'.
|
|
@ -1,54 +0,0 @@
|
|||||||
python-gflags (2.0-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Google Inc. <google-gflags@googlegroups.com> Wed, 18 Jan 2012 13:57:39 -0800
|
|
||||||
|
|
||||||
python-gflags (1.8-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Google Inc. <google-gflags@googlegroups.com> Wed, 18 Jan 2012 11:54:03 -0800
|
|
||||||
|
|
||||||
python-gflags (1.7-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Google Inc. <opensource@google.com> Tue, 20 Dec 2011 17:10:41 -0800
|
|
||||||
|
|
||||||
python-gflags (1.6-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Google Inc. <opensource@google.com> Fri, 29 Jul 2011 12:24:08 -0700
|
|
||||||
|
|
||||||
python-gflags (1.5.1-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release (fixes manifest and setup.py files)
|
|
||||||
|
|
||||||
-- Google Inc. <opensource@google.com> Wed, 26 Jan 2011 13:50:46 -0800
|
|
||||||
|
|
||||||
python-gflags (1.5-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Google Inc. <opensource@google.com> Mon, 24 Jan 2011 16:58:10 -0800
|
|
||||||
|
|
||||||
python-gflags (1.4-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* New upstream release.
|
|
||||||
|
|
||||||
-- Google Inc. <opensource@google.com> Wed, 13 Oct 2010 17:40:12 -0700
|
|
||||||
|
|
||||||
python-gflags (1.3-2) unstable; urgency=low
|
|
||||||
|
|
||||||
* Fixed man-page generation.
|
|
||||||
|
|
||||||
-- Tim 'mithro' Ansell <mithro@mithis.com> Mon, 07 Jan 2010 13:46:10 +1100
|
|
||||||
|
|
||||||
python-gflags (1.3-1) unstable; urgency=low
|
|
||||||
|
|
||||||
* Initial release.
|
|
||||||
* Packaging based on gflags 1.3
|
|
||||||
|
|
||||||
-- Tim 'mithro' Ansell <mithro@mithis.com> Mon, 04 Jan 2010 18:46:10 -0800
|
|
@ -1 +0,0 @@
|
|||||||
5
|
|
@ -1,25 +0,0 @@
|
|||||||
Source: python-gflags
|
|
||||||
Section: python
|
|
||||||
XS-Python-Version: all
|
|
||||||
Priority: optional
|
|
||||||
Maintainer: Craig Silverstein <google-gflags@googlegroups.com>
|
|
||||||
Build-Depends-Indep: python-central (>= 0.5.6), python-setuptools (>= 0.6b3-1), python-all
|
|
||||||
Build-Depends: debhelper (>= 5.0.38)
|
|
||||||
Standards-Version: 3.7.2
|
|
||||||
|
|
||||||
Package: python-gflags
|
|
||||||
Architecture: all
|
|
||||||
Depends: ${python:Depends}
|
|
||||||
XB-Python-Version: ${python:Versions}
|
|
||||||
Description: A Python implementation of the Google commandline flags module
|
|
||||||
.
|
|
||||||
GFlags defines a *distributed* command line system, replacing systems like
|
|
||||||
getopt(), optparse and manual argument processing. Rather than an application
|
|
||||||
having to define all flags in or near main(), each Python module defines flags
|
|
||||||
that are useful to it. When one Python module imports another, it gains
|
|
||||||
access to the other's flags.
|
|
||||||
.
|
|
||||||
It includes the ability to define flag types (boolean, float, interger, list),
|
|
||||||
autogeneration of help (in both human and machine readable format) and reading
|
|
||||||
arguments from a file. It also includes the ability to automatically generate
|
|
||||||
man pages from the help flags.
|
|
@ -1,41 +0,0 @@
|
|||||||
This package was debianized by Craig Silverstein <google-gflags@googlegroups.com> on
|
|
||||||
Wed, 18 Jan 2012 13:57:39 -0800.
|
|
||||||
|
|
||||||
It was downloaded from http://code.google.com/p/python-gflags/downloads/list
|
|
||||||
|
|
||||||
Upstream Author: Google Inc. and others <google-gflags@googlegroups.com>
|
|
||||||
Copyright: Google Inc. and others <google-gflags@googlegroups.com>
|
|
||||||
|
|
||||||
License:
|
|
||||||
|
|
||||||
Copyright (c) 2006, Google Inc.
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without
|
|
||||||
modification, are permitted provided that the following conditions are
|
|
||||||
met:
|
|
||||||
|
|
||||||
* Redistributions of source code must retain the above copyright
|
|
||||||
notice, this list of conditions and the following disclaimer.
|
|
||||||
* Redistributions in binary form must reproduce the above
|
|
||||||
copyright notice, this list of conditions and the following disclaimer
|
|
||||||
in the documentation and/or other materials provided with the
|
|
||||||
distribution.
|
|
||||||
* Neither the name of Google Inc. nor the names of its
|
|
||||||
contributors may be used to endorse or promote products derived from
|
|
||||||
this software without specific prior written permission.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
The Debian packaging is (C) 2011, Tim 'mithro' Ansell <mithro@mithis.com> and
|
|
||||||
is licensed under the above.
|
|
@ -1,2 +0,0 @@
|
|||||||
AUTHORS
|
|
||||||
README
|
|
@ -1,62 +0,0 @@
|
|||||||
#!/usr/bin/make -f
|
|
||||||
# -*- makefile -*-
|
|
||||||
# Sample debian/rules that uses debhelper.
|
|
||||||
# GNU copyright 1997 to 1999 by Joey Hess.
|
|
||||||
|
|
||||||
# Uncomment this to turn on verbose mode.
|
|
||||||
#export DH_VERBOSE=1
|
|
||||||
|
|
||||||
PYTHON := /usr/bin/python
|
|
||||||
#PYVER := $(shell $(PYTHON) -c 'import sys; print sys.version[:3]')
|
|
||||||
PYVERS = $(shell pyversions -vr)
|
|
||||||
|
|
||||||
build: $(PYVERS:%=build-python%)
|
|
||||||
touch $@
|
|
||||||
|
|
||||||
build-python%:
|
|
||||||
dh_testdir
|
|
||||||
python$* setup.py build
|
|
||||||
touch $@
|
|
||||||
|
|
||||||
clean:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
rm -f build-python*
|
|
||||||
rm -rf build
|
|
||||||
-find . -name '*.py[co]' | xargs rm -f
|
|
||||||
dh_clean
|
|
||||||
|
|
||||||
install: build $(PYVERS:%=install-python%)
|
|
||||||
|
|
||||||
install-python%:
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_clean -k
|
|
||||||
dh_installdirs
|
|
||||||
python$* setup.py install --root=$(CURDIR)/debian/python-gflags --prefix=/usr
|
|
||||||
# Scripts should not have a .py on the end of them
|
|
||||||
mv $(CURDIR)/debian/python-gflags/usr/bin/gflags2man.py $(CURDIR)/debian/python-gflags/usr/bin/gflags2man
|
|
||||||
# Generate a man file for gflags2man
|
|
||||||
mkdir -p $(CURDIR)/debian/python-gflags/usr/share/man/man1
|
|
||||||
PYTHONPATH=$(CURDIR)/debian/.. python$* gflags2man.py --dest_dir $(CURDIR)/debian/python-gflags/usr/share/man/man1 $(CURDIR)/debian/python-gflags/usr/bin/gflags2man
|
|
||||||
|
|
||||||
# Build architecture-independent files here.
|
|
||||||
binary-indep: build install
|
|
||||||
dh_testdir
|
|
||||||
dh_testroot
|
|
||||||
dh_installchangelogs -k ChangeLog
|
|
||||||
dh_installdocs
|
|
||||||
dh_pycentral
|
|
||||||
dh_compress -X.py
|
|
||||||
dh_fixperms
|
|
||||||
dh_installdeb
|
|
||||||
dh_gencontrol
|
|
||||||
dh_md5sums
|
|
||||||
dh_builddeb
|
|
||||||
|
|
||||||
# Build architecture-dependent files here.
|
|
||||||
binary-arch: build install
|
|
||||||
# We have nothing to do by default.
|
|
||||||
|
|
||||||
binary: binary-indep binary-arch
|
|
||||||
.PHONY: build clean binary-indep binary-arch binary install configure
|
|
File diff suppressed because it is too large
Load Diff
@ -1,544 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# Copyright (c) 2006, Google Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above
|
|
||||||
# copyright notice, this list of conditions and the following disclaimer
|
|
||||||
# in the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
# * Neither the name of Google Inc. nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
|
|
||||||
"""gflags2man runs a Google flags base program and generates a man page.
|
|
||||||
|
|
||||||
Run the program, parse the output, and then format that into a man
|
|
||||||
page.
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
gflags2man <program> [program] ...
|
|
||||||
"""
|
|
||||||
|
|
||||||
# TODO(csilvers): work with windows paths (\) as well as unix (/)
|
|
||||||
|
|
||||||
# This may seem a bit of an end run, but it: doesn't bloat flags, can
|
|
||||||
# support python/java/C++, supports older executables, and can be
|
|
||||||
# extended to other document formats.
|
|
||||||
# Inspired by help2man.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
import os
|
|
||||||
import re
|
|
||||||
import sys
|
|
||||||
import stat
|
|
||||||
import time
|
|
||||||
|
|
||||||
import gflags
|
|
||||||
|
|
||||||
_VERSION = '0.1'
|
|
||||||
|
|
||||||
|
|
||||||
def _GetDefaultDestDir():
|
|
||||||
home = os.environ.get('HOME', '')
|
|
||||||
homeman = os.path.join(home, 'man', 'man1')
|
|
||||||
if home and os.path.exists(homeman):
|
|
||||||
return homeman
|
|
||||||
else:
|
|
||||||
return os.environ.get('TMPDIR', '/tmp')
|
|
||||||
|
|
||||||
FLAGS = gflags.FLAGS
|
|
||||||
gflags.DEFINE_string('dest_dir', _GetDefaultDestDir(),
|
|
||||||
'Directory to write resulting manpage to.'
|
|
||||||
' Specify \'-\' for stdout')
|
|
||||||
gflags.DEFINE_string('help_flag', '--help',
|
|
||||||
'Option to pass to target program in to get help')
|
|
||||||
gflags.DEFINE_integer('v', 0, 'verbosity level to use for output')
|
|
||||||
|
|
||||||
|
|
||||||
_MIN_VALID_USAGE_MSG = 9 # if fewer lines than this, help is suspect
|
|
||||||
|
|
||||||
|
|
||||||
class Logging:
|
|
||||||
"""A super-simple logging class"""
|
|
||||||
def error(self, msg): print >>sys.stderr, "ERROR: ", msg
|
|
||||||
def warn(self, msg): print >>sys.stderr, "WARNING: ", msg
|
|
||||||
def info(self, msg): print msg
|
|
||||||
def debug(self, msg): self.vlog(1, msg)
|
|
||||||
def vlog(self, level, msg):
|
|
||||||
if FLAGS.v >= level: print msg
|
|
||||||
logging = Logging()
|
|
||||||
class App:
|
|
||||||
def usage(self, shorthelp=0):
|
|
||||||
print >>sys.stderr, __doc__
|
|
||||||
print >>sys.stderr, "flags:"
|
|
||||||
print >>sys.stderr, str(FLAGS)
|
|
||||||
def run(self):
|
|
||||||
main(sys.argv)
|
|
||||||
app = App()
|
|
||||||
|
|
||||||
|
|
||||||
def GetRealPath(filename):
|
|
||||||
"""Given an executable filename, find in the PATH or find absolute path.
|
|
||||||
Args:
|
|
||||||
filename An executable filename (string)
|
|
||||||
Returns:
|
|
||||||
Absolute version of filename.
|
|
||||||
None if filename could not be found locally, absolutely, or in PATH
|
|
||||||
"""
|
|
||||||
if os.path.isabs(filename): # already absolute
|
|
||||||
return filename
|
|
||||||
|
|
||||||
if filename.startswith('./') or filename.startswith('../'): # relative
|
|
||||||
return os.path.abspath(filename)
|
|
||||||
|
|
||||||
path = os.getenv('PATH', '')
|
|
||||||
for directory in path.split(':'):
|
|
||||||
tryname = os.path.join(directory, filename)
|
|
||||||
if os.path.exists(tryname):
|
|
||||||
if not os.path.isabs(directory): # relative directory
|
|
||||||
return os.path.abspath(tryname)
|
|
||||||
return tryname
|
|
||||||
if os.path.exists(filename):
|
|
||||||
return os.path.abspath(filename)
|
|
||||||
return None # could not determine
|
|
||||||
|
|
||||||
class Flag(object):
|
|
||||||
"""The information about a single flag."""
|
|
||||||
|
|
||||||
def __init__(self, flag_desc, help):
|
|
||||||
"""Create the flag object.
|
|
||||||
Args:
|
|
||||||
flag_desc The command line forms this could take. (string)
|
|
||||||
help The help text (string)
|
|
||||||
"""
|
|
||||||
self.desc = flag_desc # the command line forms
|
|
||||||
self.help = help # the help text
|
|
||||||
self.default = '' # default value
|
|
||||||
self.tips = '' # parsing/syntax tips
|
|
||||||
|
|
||||||
|
|
||||||
class ProgramInfo(object):
|
|
||||||
"""All the information gleaned from running a program with --help."""
|
|
||||||
|
|
||||||
# Match a module block start, for python scripts --help
|
|
||||||
# "goopy.logging:"
|
|
||||||
module_py_re = re.compile(r'(\S.+):$')
|
|
||||||
# match the start of a flag listing
|
|
||||||
# " -v,--verbosity: Logging verbosity"
|
|
||||||
flag_py_re = re.compile(r'\s+(-\S+):\s+(.*)$')
|
|
||||||
# " (default: '0')"
|
|
||||||
flag_default_py_re = re.compile(r'\s+\(default:\s+\'(.*)\'\)$')
|
|
||||||
# " (an integer)"
|
|
||||||
flag_tips_py_re = re.compile(r'\s+\((.*)\)$')
|
|
||||||
|
|
||||||
# Match a module block start, for c++ programs --help
|
|
||||||
# "google/base/commandlineflags":
|
|
||||||
module_c_re = re.compile(r'\s+Flags from (\S.+):$')
|
|
||||||
# match the start of a flag listing
|
|
||||||
# " -v,--verbosity: Logging verbosity"
|
|
||||||
flag_c_re = re.compile(r'\s+(-\S+)\s+(.*)$')
|
|
||||||
|
|
||||||
# Match a module block start, for java programs --help
|
|
||||||
# "com.google.common.flags"
|
|
||||||
module_java_re = re.compile(r'\s+Flags for (\S.+):$')
|
|
||||||
# match the start of a flag listing
|
|
||||||
# " -v,--verbosity: Logging verbosity"
|
|
||||||
flag_java_re = re.compile(r'\s+(-\S+)\s+(.*)$')
|
|
||||||
|
|
||||||
def __init__(self, executable):
|
|
||||||
"""Create object with executable.
|
|
||||||
Args:
|
|
||||||
executable Program to execute (string)
|
|
||||||
"""
|
|
||||||
self.long_name = executable
|
|
||||||
self.name = os.path.basename(executable) # name
|
|
||||||
# Get name without extension (PAR files)
|
|
||||||
(self.short_name, self.ext) = os.path.splitext(self.name)
|
|
||||||
self.executable = GetRealPath(executable) # name of the program
|
|
||||||
self.output = [] # output from the program. List of lines.
|
|
||||||
self.desc = [] # top level description. List of lines
|
|
||||||
self.modules = {} # { section_name(string), [ flags ] }
|
|
||||||
self.module_list = [] # list of module names in their original order
|
|
||||||
self.date = time.localtime(time.time()) # default date info
|
|
||||||
|
|
||||||
def Run(self):
|
|
||||||
"""Run it and collect output.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
1 (true) If everything went well.
|
|
||||||
0 (false) If there were problems.
|
|
||||||
"""
|
|
||||||
if not self.executable:
|
|
||||||
logging.error('Could not locate "%s"' % self.long_name)
|
|
||||||
return 0
|
|
||||||
|
|
||||||
finfo = os.stat(self.executable)
|
|
||||||
self.date = time.localtime(finfo[stat.ST_MTIME])
|
|
||||||
|
|
||||||
logging.info('Running: %s %s </dev/null 2>&1'
|
|
||||||
% (self.executable, FLAGS.help_flag))
|
|
||||||
# --help output is often routed to stderr, so we combine with stdout.
|
|
||||||
# Re-direct stdin to /dev/null to encourage programs that
|
|
||||||
# don't understand --help to exit.
|
|
||||||
(child_stdin, child_stdout_and_stderr) = os.popen4(
|
|
||||||
[self.executable, FLAGS.help_flag])
|
|
||||||
child_stdin.close() # '</dev/null'
|
|
||||||
self.output = child_stdout_and_stderr.readlines()
|
|
||||||
child_stdout_and_stderr.close()
|
|
||||||
if len(self.output) < _MIN_VALID_USAGE_MSG:
|
|
||||||
logging.error('Error: "%s %s" returned only %d lines: %s'
|
|
||||||
% (self.name, FLAGS.help_flag,
|
|
||||||
len(self.output), self.output))
|
|
||||||
return 0
|
|
||||||
return 1
|
|
||||||
|
|
||||||
def Parse(self):
|
|
||||||
"""Parse program output."""
|
|
||||||
(start_line, lang) = self.ParseDesc()
|
|
||||||
if start_line < 0:
|
|
||||||
return
|
|
||||||
if 'python' == lang:
|
|
||||||
self.ParsePythonFlags(start_line)
|
|
||||||
elif 'c' == lang:
|
|
||||||
self.ParseCFlags(start_line)
|
|
||||||
elif 'java' == lang:
|
|
||||||
self.ParseJavaFlags(start_line)
|
|
||||||
|
|
||||||
def ParseDesc(self, start_line=0):
|
|
||||||
"""Parse the initial description.
|
|
||||||
|
|
||||||
This could be Python or C++.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
(start_line, lang_type)
|
|
||||||
start_line Line to start parsing flags on (int)
|
|
||||||
lang_type Either 'python' or 'c'
|
|
||||||
(-1, '') if the flags start could not be found
|
|
||||||
"""
|
|
||||||
exec_mod_start = self.executable + ':'
|
|
||||||
|
|
||||||
after_blank = 0
|
|
||||||
start_line = 0 # ignore the passed-in arg for now (?)
|
|
||||||
for start_line in range(start_line, len(self.output)): # collect top description
|
|
||||||
line = self.output[start_line].rstrip()
|
|
||||||
# Python flags start with 'flags:\n'
|
|
||||||
if ('flags:' == line
|
|
||||||
and len(self.output) > start_line+1
|
|
||||||
and '' == self.output[start_line+1].rstrip()):
|
|
||||||
start_line += 2
|
|
||||||
logging.debug('Flags start (python): %s' % line)
|
|
||||||
return (start_line, 'python')
|
|
||||||
# SWIG flags just have the module name followed by colon.
|
|
||||||
if exec_mod_start == line:
|
|
||||||
logging.debug('Flags start (swig): %s' % line)
|
|
||||||
return (start_line, 'python')
|
|
||||||
# C++ flags begin after a blank line and with a constant string
|
|
||||||
if after_blank and line.startswith(' Flags from '):
|
|
||||||
logging.debug('Flags start (c): %s' % line)
|
|
||||||
return (start_line, 'c')
|
|
||||||
# java flags begin with a constant string
|
|
||||||
if line == 'where flags are':
|
|
||||||
logging.debug('Flags start (java): %s' % line)
|
|
||||||
start_line += 2 # skip "Standard flags:"
|
|
||||||
return (start_line, 'java')
|
|
||||||
|
|
||||||
logging.debug('Desc: %s' % line)
|
|
||||||
self.desc.append(line)
|
|
||||||
after_blank = (line == '')
|
|
||||||
else:
|
|
||||||
logging.warn('Never found the start of the flags section for "%s"!'
|
|
||||||
% self.long_name)
|
|
||||||
return (-1, '')
|
|
||||||
|
|
||||||
def ParsePythonFlags(self, start_line=0):
|
|
||||||
"""Parse python/swig style flags."""
|
|
||||||
modname = None # name of current module
|
|
||||||
modlist = []
|
|
||||||
flag = None
|
|
||||||
for line_num in range(start_line, len(self.output)): # collect flags
|
|
||||||
line = self.output[line_num].rstrip()
|
|
||||||
if not line: # blank
|
|
||||||
continue
|
|
||||||
|
|
||||||
mobj = self.module_py_re.match(line)
|
|
||||||
if mobj: # start of a new module
|
|
||||||
modname = mobj.group(1)
|
|
||||||
logging.debug('Module: %s' % line)
|
|
||||||
if flag:
|
|
||||||
modlist.append(flag)
|
|
||||||
self.module_list.append(modname)
|
|
||||||
self.modules.setdefault(modname, [])
|
|
||||||
modlist = self.modules[modname]
|
|
||||||
flag = None
|
|
||||||
continue
|
|
||||||
|
|
||||||
mobj = self.flag_py_re.match(line)
|
|
||||||
if mobj: # start of a new flag
|
|
||||||
if flag:
|
|
||||||
modlist.append(flag)
|
|
||||||
logging.debug('Flag: %s' % line)
|
|
||||||
flag = Flag(mobj.group(1), mobj.group(2))
|
|
||||||
continue
|
|
||||||
|
|
||||||
if not flag: # continuation of a flag
|
|
||||||
logging.error('Flag info, but no current flag "%s"' % line)
|
|
||||||
mobj = self.flag_default_py_re.match(line)
|
|
||||||
if mobj: # (default: '...')
|
|
||||||
flag.default = mobj.group(1)
|
|
||||||
logging.debug('Fdef: %s' % line)
|
|
||||||
continue
|
|
||||||
mobj = self.flag_tips_py_re.match(line)
|
|
||||||
if mobj: # (tips)
|
|
||||||
flag.tips = mobj.group(1)
|
|
||||||
logging.debug('Ftip: %s' % line)
|
|
||||||
continue
|
|
||||||
if flag and flag.help:
|
|
||||||
flag.help += line # multiflags tack on an extra line
|
|
||||||
else:
|
|
||||||
logging.info('Extra: %s' % line)
|
|
||||||
if flag:
|
|
||||||
modlist.append(flag)
|
|
||||||
|
|
||||||
def ParseCFlags(self, start_line=0):
|
|
||||||
"""Parse C style flags."""
|
|
||||||
modname = None # name of current module
|
|
||||||
modlist = []
|
|
||||||
flag = None
|
|
||||||
for line_num in range(start_line, len(self.output)): # collect flags
|
|
||||||
line = self.output[line_num].rstrip()
|
|
||||||
if not line: # blank lines terminate flags
|
|
||||||
if flag: # save last flag
|
|
||||||
modlist.append(flag)
|
|
||||||
flag = None
|
|
||||||
continue
|
|
||||||
|
|
||||||
mobj = self.module_c_re.match(line)
|
|
||||||
if mobj: # start of a new module
|
|
||||||
modname = mobj.group(1)
|
|
||||||
logging.debug('Module: %s' % line)
|
|
||||||
if flag:
|
|
||||||
modlist.append(flag)
|
|
||||||
self.module_list.append(modname)
|
|
||||||
self.modules.setdefault(modname, [])
|
|
||||||
modlist = self.modules[modname]
|
|
||||||
flag = None
|
|
||||||
continue
|
|
||||||
|
|
||||||
mobj = self.flag_c_re.match(line)
|
|
||||||
if mobj: # start of a new flag
|
|
||||||
if flag: # save last flag
|
|
||||||
modlist.append(flag)
|
|
||||||
logging.debug('Flag: %s' % line)
|
|
||||||
flag = Flag(mobj.group(1), mobj.group(2))
|
|
||||||
continue
|
|
||||||
|
|
||||||
# append to flag help. type and default are part of the main text
|
|
||||||
if flag:
|
|
||||||
flag.help += ' ' + line.strip()
|
|
||||||
else:
|
|
||||||
logging.info('Extra: %s' % line)
|
|
||||||
if flag:
|
|
||||||
modlist.append(flag)
|
|
||||||
|
|
||||||
def ParseJavaFlags(self, start_line=0):
|
|
||||||
"""Parse Java style flags (com.google.common.flags)."""
|
|
||||||
# The java flags prints starts with a "Standard flags" "module"
|
|
||||||
# that doesn't follow the standard module syntax.
|
|
||||||
modname = 'Standard flags' # name of current module
|
|
||||||
self.module_list.append(modname)
|
|
||||||
self.modules.setdefault(modname, [])
|
|
||||||
modlist = self.modules[modname]
|
|
||||||
flag = None
|
|
||||||
|
|
||||||
for line_num in range(start_line, len(self.output)): # collect flags
|
|
||||||
line = self.output[line_num].rstrip()
|
|
||||||
logging.vlog(2, 'Line: "%s"' % line)
|
|
||||||
if not line: # blank lines terminate module
|
|
||||||
if flag: # save last flag
|
|
||||||
modlist.append(flag)
|
|
||||||
flag = None
|
|
||||||
continue
|
|
||||||
|
|
||||||
mobj = self.module_java_re.match(line)
|
|
||||||
if mobj: # start of a new module
|
|
||||||
modname = mobj.group(1)
|
|
||||||
logging.debug('Module: %s' % line)
|
|
||||||
if flag:
|
|
||||||
modlist.append(flag)
|
|
||||||
self.module_list.append(modname)
|
|
||||||
self.modules.setdefault(modname, [])
|
|
||||||
modlist = self.modules[modname]
|
|
||||||
flag = None
|
|
||||||
continue
|
|
||||||
|
|
||||||
mobj = self.flag_java_re.match(line)
|
|
||||||
if mobj: # start of a new flag
|
|
||||||
if flag: # save last flag
|
|
||||||
modlist.append(flag)
|
|
||||||
logging.debug('Flag: %s' % line)
|
|
||||||
flag = Flag(mobj.group(1), mobj.group(2))
|
|
||||||
continue
|
|
||||||
|
|
||||||
# append to flag help. type and default are part of the main text
|
|
||||||
if flag:
|
|
||||||
flag.help += ' ' + line.strip()
|
|
||||||
else:
|
|
||||||
logging.info('Extra: %s' % line)
|
|
||||||
if flag:
|
|
||||||
modlist.append(flag)
|
|
||||||
|
|
||||||
def Filter(self):
|
|
||||||
"""Filter parsed data to create derived fields."""
|
|
||||||
if not self.desc:
|
|
||||||
self.short_desc = ''
|
|
||||||
return
|
|
||||||
|
|
||||||
for i in range(len(self.desc)): # replace full path with name
|
|
||||||
if self.desc[i].find(self.executable) >= 0:
|
|
||||||
self.desc[i] = self.desc[i].replace(self.executable, self.name)
|
|
||||||
|
|
||||||
self.short_desc = self.desc[0]
|
|
||||||
word_list = self.short_desc.split(' ')
|
|
||||||
all_names = [ self.name, self.short_name, ]
|
|
||||||
# Since the short_desc is always listed right after the name,
|
|
||||||
# trim it from the short_desc
|
|
||||||
while word_list and (word_list[0] in all_names
|
|
||||||
or word_list[0].lower() in all_names):
|
|
||||||
del word_list[0]
|
|
||||||
self.short_desc = '' # signal need to reconstruct
|
|
||||||
if not self.short_desc and word_list:
|
|
||||||
self.short_desc = ' '.join(word_list)
|
|
||||||
|
|
||||||
|
|
||||||
class GenerateDoc(object):
|
|
||||||
"""Base class to output flags information."""
|
|
||||||
|
|
||||||
def __init__(self, proginfo, directory='.'):
|
|
||||||
"""Create base object.
|
|
||||||
Args:
|
|
||||||
proginfo A ProgramInfo object
|
|
||||||
directory Directory to write output into
|
|
||||||
"""
|
|
||||||
self.info = proginfo
|
|
||||||
self.dirname = directory
|
|
||||||
|
|
||||||
def Output(self):
|
|
||||||
"""Output all sections of the page."""
|
|
||||||
self.Open()
|
|
||||||
self.Header()
|
|
||||||
self.Body()
|
|
||||||
self.Footer()
|
|
||||||
|
|
||||||
def Open(self): raise NotImplementedError # define in subclass
|
|
||||||
def Header(self): raise NotImplementedError # define in subclass
|
|
||||||
def Body(self): raise NotImplementedError # define in subclass
|
|
||||||
def Footer(self): raise NotImplementedError # define in subclass
|
|
||||||
|
|
||||||
|
|
||||||
class GenerateMan(GenerateDoc):
|
|
||||||
"""Output a man page."""
|
|
||||||
|
|
||||||
def __init__(self, proginfo, directory='.'):
|
|
||||||
"""Create base object.
|
|
||||||
Args:
|
|
||||||
proginfo A ProgramInfo object
|
|
||||||
directory Directory to write output into
|
|
||||||
"""
|
|
||||||
GenerateDoc.__init__(self, proginfo, directory)
|
|
||||||
|
|
||||||
def Open(self):
|
|
||||||
if self.dirname == '-':
|
|
||||||
logging.info('Writing to stdout')
|
|
||||||
self.fp = sys.stdout
|
|
||||||
else:
|
|
||||||
self.file_path = '%s.1' % os.path.join(self.dirname, self.info.name)
|
|
||||||
logging.info('Writing: %s' % self.file_path)
|
|
||||||
self.fp = open(self.file_path, 'w')
|
|
||||||
|
|
||||||
def Header(self):
|
|
||||||
self.fp.write(
|
|
||||||
'.\\" DO NOT MODIFY THIS FILE! It was generated by gflags2man %s\n'
|
|
||||||
% _VERSION)
|
|
||||||
self.fp.write(
|
|
||||||
'.TH %s "1" "%s" "%s" "User Commands"\n'
|
|
||||||
% (self.info.name, time.strftime('%x', self.info.date), self.info.name))
|
|
||||||
self.fp.write(
|
|
||||||
'.SH NAME\n%s \\- %s\n' % (self.info.name, self.info.short_desc))
|
|
||||||
self.fp.write(
|
|
||||||
'.SH SYNOPSIS\n.B %s\n[\\fIFLAGS\\fR]...\n' % self.info.name)
|
|
||||||
|
|
||||||
def Body(self):
|
|
||||||
self.fp.write(
|
|
||||||
'.SH DESCRIPTION\n.\\" Add any additional description here\n.PP\n')
|
|
||||||
for ln in self.info.desc:
|
|
||||||
self.fp.write('%s\n' % ln)
|
|
||||||
self.fp.write(
|
|
||||||
'.SH OPTIONS\n')
|
|
||||||
# This shows flags in the original order
|
|
||||||
for modname in self.info.module_list:
|
|
||||||
if modname.find(self.info.executable) >= 0:
|
|
||||||
mod = modname.replace(self.info.executable, self.info.name)
|
|
||||||
else:
|
|
||||||
mod = modname
|
|
||||||
self.fp.write('\n.P\n.I %s\n' % mod)
|
|
||||||
for flag in self.info.modules[modname]:
|
|
||||||
help_string = flag.help
|
|
||||||
if flag.default or flag.tips:
|
|
||||||
help_string += '\n.br\n'
|
|
||||||
if flag.default:
|
|
||||||
help_string += ' (default: \'%s\')' % flag.default
|
|
||||||
if flag.tips:
|
|
||||||
help_string += ' (%s)' % flag.tips
|
|
||||||
self.fp.write(
|
|
||||||
'.TP\n%s\n%s\n' % (flag.desc, help_string))
|
|
||||||
|
|
||||||
def Footer(self):
|
|
||||||
self.fp.write(
|
|
||||||
'.SH COPYRIGHT\nCopyright \(co %s Google.\n'
|
|
||||||
% time.strftime('%Y', self.info.date))
|
|
||||||
self.fp.write('Gflags2man created this page from "%s %s" output.\n'
|
|
||||||
% (self.info.name, FLAGS.help_flag))
|
|
||||||
self.fp.write('\nGflags2man was written by Dan Christian. '
|
|
||||||
' Note that the date on this'
|
|
||||||
' page is the modification date of %s.\n' % self.info.name)
|
|
||||||
|
|
||||||
|
|
||||||
def main(argv):
|
|
||||||
argv = FLAGS(argv) # handles help as well
|
|
||||||
if len(argv) <= 1:
|
|
||||||
app.usage(shorthelp=1)
|
|
||||||
return 1
|
|
||||||
|
|
||||||
for arg in argv[1:]:
|
|
||||||
prog = ProgramInfo(arg)
|
|
||||||
if not prog.Run():
|
|
||||||
continue
|
|
||||||
prog.Parse()
|
|
||||||
prog.Filter()
|
|
||||||
doc = GenerateMan(prog, FLAGS.dest_dir)
|
|
||||||
doc.Output()
|
|
||||||
return 0
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
app.run()
|
|
@ -1,187 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# Copyright (c) 2010, Google Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above
|
|
||||||
# copyright notice, this list of conditions and the following disclaimer
|
|
||||||
# in the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
# * Neither the name of Google Inc. nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
"""Module to enforce different constraints on flags.
|
|
||||||
|
|
||||||
A validator represents an invariant, enforced over a one or more flags.
|
|
||||||
See 'FLAGS VALIDATORS' in gflags.py's docstring for a usage manual.
|
|
||||||
"""
|
|
||||||
|
|
||||||
__author__ = 'olexiy@google.com (Olexiy Oryeshko)'
|
|
||||||
|
|
||||||
|
|
||||||
class Error(Exception):
|
|
||||||
"""Thrown If validator constraint is not satisfied."""
|
|
||||||
|
|
||||||
|
|
||||||
class Validator(object):
|
|
||||||
"""Base class for flags validators.
|
|
||||||
|
|
||||||
Users should NOT overload these classes, and use gflags.Register...
|
|
||||||
methods instead.
|
|
||||||
"""
|
|
||||||
|
|
||||||
# Used to assign each validator an unique insertion_index
|
|
||||||
validators_count = 0
|
|
||||||
|
|
||||||
def __init__(self, checker, message):
|
|
||||||
"""Constructor to create all validators.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
checker: function to verify the constraint.
|
|
||||||
Input of this method varies, see SimpleValidator and
|
|
||||||
DictionaryValidator for a detailed description.
|
|
||||||
message: string, error message to be shown to the user
|
|
||||||
"""
|
|
||||||
self.checker = checker
|
|
||||||
self.message = message
|
|
||||||
Validator.validators_count += 1
|
|
||||||
# Used to assert validators in the order they were registered (CL/18694236)
|
|
||||||
self.insertion_index = Validator.validators_count
|
|
||||||
|
|
||||||
def Verify(self, flag_values):
|
|
||||||
"""Verify that constraint is satisfied.
|
|
||||||
|
|
||||||
flags library calls this method to verify Validator's constraint.
|
|
||||||
Args:
|
|
||||||
flag_values: gflags.FlagValues, containing all flags
|
|
||||||
Raises:
|
|
||||||
Error: if constraint is not satisfied.
|
|
||||||
"""
|
|
||||||
param = self._GetInputToCheckerFunction(flag_values)
|
|
||||||
if not self.checker(param):
|
|
||||||
raise Error(self.message)
|
|
||||||
|
|
||||||
def GetFlagsNames(self):
|
|
||||||
"""Return the names of the flags checked by this validator.
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
[string], names of the flags
|
|
||||||
"""
|
|
||||||
raise NotImplementedError('This method should be overloaded')
|
|
||||||
|
|
||||||
def PrintFlagsWithValues(self, flag_values):
|
|
||||||
raise NotImplementedError('This method should be overloaded')
|
|
||||||
|
|
||||||
def _GetInputToCheckerFunction(self, flag_values):
|
|
||||||
"""Given flag values, construct the input to be given to checker.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
flag_values: gflags.FlagValues, containing all flags.
|
|
||||||
Returns:
|
|
||||||
Return type depends on the specific validator.
|
|
||||||
"""
|
|
||||||
raise NotImplementedError('This method should be overloaded')
|
|
||||||
|
|
||||||
|
|
||||||
class SimpleValidator(Validator):
|
|
||||||
"""Validator behind RegisterValidator() method.
|
|
||||||
|
|
||||||
Validates that a single flag passes its checker function. The checker function
|
|
||||||
takes the flag value and returns True (if value looks fine) or, if flag value
|
|
||||||
is not valid, either returns False or raises an Exception."""
|
|
||||||
def __init__(self, flag_name, checker, message):
|
|
||||||
"""Constructor.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
flag_name: string, name of the flag.
|
|
||||||
checker: function to verify the validator.
|
|
||||||
input - value of the corresponding flag (string, boolean, etc).
|
|
||||||
output - Boolean. Must return True if validator constraint is satisfied.
|
|
||||||
If constraint is not satisfied, it should either return False or
|
|
||||||
raise Error.
|
|
||||||
message: string, error message to be shown to the user if validator's
|
|
||||||
condition is not satisfied
|
|
||||||
"""
|
|
||||||
super(SimpleValidator, self).__init__(checker, message)
|
|
||||||
self.flag_name = flag_name
|
|
||||||
|
|
||||||
def GetFlagsNames(self):
|
|
||||||
return [self.flag_name]
|
|
||||||
|
|
||||||
def PrintFlagsWithValues(self, flag_values):
|
|
||||||
return 'flag --%s=%s' % (self.flag_name, flag_values[self.flag_name].value)
|
|
||||||
|
|
||||||
def _GetInputToCheckerFunction(self, flag_values):
|
|
||||||
"""Given flag values, construct the input to be given to checker.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
flag_values: gflags.FlagValues
|
|
||||||
Returns:
|
|
||||||
value of the corresponding flag.
|
|
||||||
"""
|
|
||||||
return flag_values[self.flag_name].value
|
|
||||||
|
|
||||||
|
|
||||||
class DictionaryValidator(Validator):
|
|
||||||
"""Validator behind RegisterDictionaryValidator method.
|
|
||||||
|
|
||||||
Validates that flag values pass their common checker function. The checker
|
|
||||||
function takes flag values and returns True (if values look fine) or,
|
|
||||||
if values are not valid, either returns False or raises an Exception.
|
|
||||||
"""
|
|
||||||
def __init__(self, flag_names, checker, message):
|
|
||||||
"""Constructor.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
flag_names: [string], containing names of the flags used by checker.
|
|
||||||
checker: function to verify the validator.
|
|
||||||
input - dictionary, with keys() being flag_names, and value for each
|
|
||||||
key being the value of the corresponding flag (string, boolean, etc).
|
|
||||||
output - Boolean. Must return True if validator constraint is satisfied.
|
|
||||||
If constraint is not satisfied, it should either return False or
|
|
||||||
raise Error.
|
|
||||||
message: string, error message to be shown to the user if validator's
|
|
||||||
condition is not satisfied
|
|
||||||
"""
|
|
||||||
super(DictionaryValidator, self).__init__(checker, message)
|
|
||||||
self.flag_names = flag_names
|
|
||||||
|
|
||||||
def _GetInputToCheckerFunction(self, flag_values):
|
|
||||||
"""Given flag values, construct the input to be given to checker.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
flag_values: gflags.FlagValues
|
|
||||||
Returns:
|
|
||||||
dictionary, with keys() being self.lag_names, and value for each key
|
|
||||||
being the value of the corresponding flag (string, boolean, etc).
|
|
||||||
"""
|
|
||||||
return dict([key, flag_values[key].value] for key in self.flag_names)
|
|
||||||
|
|
||||||
def PrintFlagsWithValues(self, flag_values):
|
|
||||||
prefix = 'flags '
|
|
||||||
flags_with_values = []
|
|
||||||
for key in self.flag_names:
|
|
||||||
flags_with_values.append('%s=%s' % (key, flag_values[key].value))
|
|
||||||
return prefix + ', '.join(flags_with_values)
|
|
||||||
|
|
||||||
def GetFlagsNames(self):
|
|
||||||
return self.flag_names
|
|
@ -1,4 +0,0 @@
|
|||||||
[egg_info]
|
|
||||||
tag_build =
|
|
||||||
tag_date = 0
|
|
||||||
tag_svn_revision = 0
|
|
@ -1,44 +0,0 @@
|
|||||||
#!/usr/bin/env python
|
|
||||||
|
|
||||||
# Copyright (c) 2007, Google Inc.
|
|
||||||
# All rights reserved.
|
|
||||||
#
|
|
||||||
# Redistribution and use in source and binary forms, with or without
|
|
||||||
# modification, are permitted provided that the following conditions are
|
|
||||||
# met:
|
|
||||||
#
|
|
||||||
# * Redistributions of source code must retain the above copyright
|
|
||||||
# notice, this list of conditions and the following disclaimer.
|
|
||||||
# * Redistributions in binary form must reproduce the above
|
|
||||||
# copyright notice, this list of conditions and the following disclaimer
|
|
||||||
# in the documentation and/or other materials provided with the
|
|
||||||
# distribution.
|
|
||||||
# * Neither the name of Google Inc. nor the names of its
|
|
||||||
# contributors may be used to endorse or promote products derived from
|
|
||||||
# this software without specific prior written permission.
|
|
||||||
#
|
|
||||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
|
||||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
|
||||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
|
||||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
||||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
|
||||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
||||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
|
||||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
from setuptools import setup
|
|
||||||
|
|
||||||
setup(name='python-gflags',
|
|
||||||
version='2.0',
|
|
||||||
description='Google Commandline Flags Module',
|
|
||||||
license='BSD',
|
|
||||||
author='Google Inc. and others',
|
|
||||||
author_email='google-gflags@googlegroups.com',
|
|
||||||
url='http://code.google.com/p/python-gflags',
|
|
||||||
py_modules=["gflags", "gflags_validators"],
|
|
||||||
data_files=[("bin", ["gflags2man.py"])],
|
|
||||||
include_package_data=True,
|
|
||||||
)
|
|
Loading…
x
Reference in New Issue
Block a user