annotate decoupage/cli.py @ 107:450aff4c97e3

py35 compat
author Jeff Hammel <k0scist@gmail.com>
date Fri, 31 Mar 2017 17:06:59 -0700
parents c382bdd01751
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
1 #!/usr/bin/env python
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
2
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
3 """
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
4 serve directory with decoupage, e.g.
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
5
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
6 ``decoupage --port 8080 /home/jhammel/tmp``
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
7
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
8 If the directory is not specified, the current working directory is used
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
9 """
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
10
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
11 import optparse
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
12 import os
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
13 import socket
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
14 import sys
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
15
88
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
16 from .formatters import Datestamp, Sort, Up, DirectoryIndicator
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
17 from .web import Decoupage
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
18 from wsgiref import simple_server
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
19
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
20 here = os.path.dirname(os.path.realpath(__file__))
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
21
107
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
22
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
23 class DecoupageServer(Decoupage):
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
24 """serve locally with decoupage"""
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
25 # TODO: deprecate; move Decoupage to a few classes
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
26 # with more flexible formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
27 def __init__(self, *args, **kwargs):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
28 Decoupage.__init__(self, **kwargs)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
29 # default formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
30 # TODO: make configurable
88
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
31 self._formatters = [Sort(),
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
32 DirectoryIndicator('/'),
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
33 Up('..'),
c382bdd01751 directory indicator
Jeff Hammel <k0scist@gmail.com>
parents: 86
diff changeset
34 Datestamp('modified: %m %d, %Y')]
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
35 def get_formatters(self, path):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
36 return self._formatters
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
37
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
38
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
39 def main(args=sys.argv[1:]):
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
40
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
41 # parse command line options
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
42 usage = '%prog [options]'
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
43 parser = optparse.OptionParser(usage=usage, description=__doc__)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
44 parser.add_option('-p', '--port', dest='port',
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
45 type='int', default=1977,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
46 help="port to serve on [DEFAULT: %default]")
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
47 parser.add_option('-a', '--address', dest='address',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
48 default='0.0.0.0',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
49 help="address to serve on [DEFAULT: %default]")
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
50 parser.add_option('--no-reload', dest='auto_reload',
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
51 action='store_false', default=True,
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
52 help="do not dynamically refresh indices")
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
53 parser.add_option('--no-print-ip', dest='print_ip',
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
54 action='store_false', default=True,
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
55 help="do not print resolvable IP address")
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
56 options, args = parser.parse_args(args)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
57 if not args:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
58 directory = os.getcwd()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
59 elif len(args) == 1:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
60 directory = args[0]
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
61 if len(args) > 1:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
62 # TODO:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
63 # allow multiple directories with mount points
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
64 # e.g. `decoupage [options] directory [directory2=/foo] [...]`
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
65 # This may be done by creating a temporary directory with appropriate
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
66 # symbolic links (on OSes that allow them)
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
67
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
68 parser.print_help()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
69 parser.exit(1)
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
70 if not os.path.isdir(directory):
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
71 raise OSError("'%s' is not a directory" % directory)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
72
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
73 # create WSGI app
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
74 # TODO:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
75 # - allow CLI specification of formatters
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
76 # - template specification
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
77 app = DecoupageServer(directory=directory,
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
78 auto_reload=options.auto_reload)
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
79
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
80
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
81 # create server
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
82 # TODO: allow choice amongst server classes
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
83 printable_address = '127.0.0.1' if options.address == '0.0.0.0' else options.address
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
84 server = simple_server.make_server(options.address, options.port, app)
107
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
85 print("""serving directory {directory} ( file://{directory} ) at
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
86 http://{hostname}:{port}/'""".format(directory=directory,
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
87 hostname=printable_address,
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
88 port=options.port))
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
89
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
90 if options.print_ip:
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
91 # from http://stackoverflow.com/questions/166506/finding-local-ip-addresses-using-pythons-stdlib
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
92 hostname = "google.com"
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
93 s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
94 s.connect((hostname,80))
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
95 hostname = s.getsockname()[0]
107
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
96 print ("http://{hostname}:{port}/".format(hostname=hostname, port=options.port))
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
97 s.close()
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
98
85
3262010f7f79 add command line serving
Jeff Hammel <jhammel@mozilla.com>
parents: 84
diff changeset
99 # serve directory contents via decoupage
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
100 try:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
101 server.serve_forever()
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
102 except KeyboardInterrupt:
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
103 pass
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
104
107
450aff4c97e3 py35 compat
Jeff Hammel <k0scist@gmail.com>
parents: 88
diff changeset
105
84
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
106 if __name__ == '__main__':
95820b36d7e3 cli client
Jeff Hammel <jhammel@mozilla.com>
parents:
diff changeset
107 main()