mirror of https://github.com/lukechilds/node.git
Browse Source
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>
v5.x
Ben Noordhuis
9 years ago
21 changed files with 0 additions and 4154 deletions
@ -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
@ -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…
Reference in new issue