fabfile.py 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. #!/usr/bin/env python
  2. import os
  3. import glob
  4. import subprocess
  5. try:
  6. from xmlrpc.client import ServerProxy
  7. except ImportError:
  8. from xmlrpclib import ServerProxy
  9. import boto
  10. import boto.s3.bucket
  11. import boto.s3.key
  12. from fabric.api import task, local
  13. ##################################################
  14. SHORT_PROJECT_NAME = 'python'
  15. FULL_PROJECT_NAME = 'byte_of_{}'.format(SHORT_PROJECT_NAME)
  16. # The keys are the file names of the Pandoc source files.
  17. # e.g. '01-frontpage.md'
  18. # The values are the slugs of the WordPress pages
  19. # e.g. http://www.swaroopch.com/notes/Python_en-Table_of_Contents
  20. MARKDOWN_FILES = {
  21. '01-frontpage.md' : 'Python',
  22. '02-table-of-contents.md' : 'Python_en-Table_of_Contents',
  23. }
  24. ## NOTES
  25. ## 1. This assumes that you have already created the S3 bucket whose name is stored in
  26. ## AWS_S3_BUCKET_NAME environment variable.
  27. ## 2. Under that S3 bucket, you have created a folder whose name is stored above as
  28. ## SHORT_PROJECT_NAME.
  29. ## 3. Under that S3 bucket, you have created a folder whose name is stored as
  30. ## SHORT_PROJECT_NAME/assets.
  31. ##################################################
  32. if os.environ.get('AWS_ACCESS_KEY_ID') is not None \
  33. and len(os.environ['AWS_ACCESS_KEY_ID']) > 0 \
  34. and os.environ.get('AWS_SECRET_ACCESS_KEY') is not None \
  35. and len(os.environ['AWS_SECRET_ACCESS_KEY']) > 0 \
  36. and os.environ.get('AWS_S3_BUCKET_NAME') is not None \
  37. and len(os.environ['AWS_S3_BUCKET_NAME']) > 0:
  38. AWS_ENABLED = True
  39. else:
  40. AWS_ENABLED = False
  41. print("NOTE: S3 uploading is disabled because of missing AWS key environment variables.")
  42. # In my case, they are the same - 'files.swaroopch.com'
  43. # http://docs.amazonwebservices.com/AmazonS3/latest/dev/VirtualHosting.html#VirtualHostingCustomURLs
  44. S3_PUBLIC_URL = os.environ['AWS_S3_BUCKET_NAME']
  45. # else
  46. #S3_PUBLIC_URL = 's3.amazonaws.com/{}'.format(os.environ['AWS_S3_BUCKET_NAME'])
  47. def markdown_to_html(source_text):
  48. args = ['pandoc',
  49. '-f', 'markdown',
  50. '-t', 'html',
  51. '-S']
  52. p = subprocess.Popen(args, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
  53. output = p.communicate(source_text)[0]
  54. # TODO Replace image URLs with uploaded AWS S3 assets public URLs
  55. return output
  56. def __upload_to_s3(filename, key):
  57. conn = boto.connect_s3()
  58. b = boto.s3.bucket.Bucket(conn, os.environ['AWS_S3_BUCKET_NAME'])
  59. k = boto.s3.key.Key(b)
  60. k.key = key
  61. k.set_contents_from_filename(filename)
  62. k.set_acl('public-read')
  63. print("Uploaded to S3 : http://{}/{}".format(S3_PUBLIC_URL, key))
  64. def upload_output_to_s3(filename):
  65. key = "{}/{}".format(SHORT_PROJECT_NAME, filename)
  66. __upload_to_s3(filename, key)
  67. def upload_asset_to_s3(filename):
  68. key = "{}/assets/{}".format(SHORT_PROJECT_NAME, filename)
  69. __upload_to_s3(filename, key)
  70. @task
  71. def wp():
  72. for m in MARKDOWN_FILES.keys():
  73. converted_text = markdown_to_html(open(m).read())
  74. print converted_text[:50]
  75. # TODO Upload to WordPress
  76. # https://github.com/rgrp/pywordpress/blob/master/pywordpress.py
  77. # file:///Users/swaroop/code/docs/python/library/xmlrpclib.html
  78. @task
  79. def epub():
  80. args = ['pandoc',
  81. '-f', 'markdown',
  82. '-t', 'epub',
  83. '-o', '{}.epub'.format(FULL_PROJECT_NAME),
  84. '-S'] + MARKDOWN_FILES.keys()
  85. local(' '.join(args))
  86. if AWS_ENABLED:
  87. upload_output_to_s3('{}.epub'.format(FULL_PROJECT_NAME))
  88. @task
  89. def pdf():
  90. args = ['pandoc',
  91. '-f', 'markdown',
  92. ##'-t', 'pdf', # Intentionally commented out due to https://github.com/jgm/pandoc/issues/571
  93. '-o', '{}.pdf'.format(FULL_PROJECT_NAME),
  94. '-S'] + MARKDOWN_FILES.keys()
  95. local(' '.join(args))
  96. if AWS_ENABLED:
  97. upload_output_to_s3('{}.pdf'.format(FULL_PROJECT_NAME))
  98. POSSIBLE_OUTPUTS = (
  99. '{}.epub'.format(FULL_PROJECT_NAME),
  100. '{}.pdf'.format(FULL_PROJECT_NAME),
  101. )
  102. @task
  103. def clean():
  104. for filename in POSSIBLE_OUTPUTS:
  105. if os.path.exists(filename):
  106. os.remove(filename)
  107. print("Removed {}".format(filename))