Skip to main content

Compare directories, efficiently sync changes to AWS, and invalidate CDNs.

Project description

https://img.shields.io/pypi/status/wood.svg https://img.shields.io/pypi/v/wood.svg https://img.shields.io/pypi/pyversions/wood.svg https://travis-ci.org/gebn/wood.svg?branch=master https://coveralls.io/repos/github/gebn/wood/badge.svg?branch=master

Wood is a toolbox for representing directory trees, calculating comparisons between them, and effecting those changes in S3, CloudFront and Cloudflare. It started as a set of deploy scripts for my personal website, but grew into something that I was too chuffed with to keep hidden away in the bowls of another website repository. It’s not as refined as, say, requests, but should be useful to anyone looking to efficiently deploy a website to AWS, and/or using Cloudflare as a CDN.

Notably, unlike the AWS CLI tools or boto3, wood does not rely on file timestamps, instead using MD5 checksums to make the minimum number of changes possible in S3. It also has an algorithm for aggregating invalidation paths to make the CloudFront free tier go as far as possible. Syncers and invalidators are implemented in a generic way, allowing easy extension to additional services as needed.

Features

  • Tree representation

  • Tree comparison

    • Action that comparison in S3

    • Invalidate paths as necessary in CloudFront and Cloudflare

Demo

import wood

# low-level comparison of two local directories
comparison = wood.compare('~/dir', '~/.snapshot/hourly.1/dir')
comparison.new()  # files added since the snapshot
comparison.modified()  # files modified since the snapshot
comparison.deleted()  # files deleted since the snapshot


import pathlib
import boto3

local_base = pathlib.Path('/path/to/web/root')
bucket = boto3.resource('s3').Bucket('example.com')

# create representations of the local and remote trees
to_deploy = wood.root(local_base)
deployed = wood.s3.objects_to_root(bucket.objects.all())

# compare the two as if they were local directories
comparison = wood.compare(to_deploy, deployed)

# write all changes (additions, modifications, deletions) to the S3 bucket
syncer = wood.s3.S3Syncer(local_base, bucket)
syncer.sync(comparison)

# invalidate the minimum amount in CloudFront to ensure the changes are visible
cloudfront = boto3.client('cloudfront')
invalidator = wood.cloudfront.CloudFrontInvalidator(cloudfront,
                                                    '{distribution}',
                                                    '{reference}')
invalidator.invalidate(comparison)  # uses prefix grouping where possible

# do the same for Cloudflare in the case of a second CDN
cloudflare = wood.cloudflare.CloudflareInvalidator(
    sess, email, key, zone, 'https://example.com/')
cloudflare.invalidate(comparison)

Why “wood”?

Because it started as a tree comparison tool, and grew out from there. It’s also a little rough around the edges.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wood-1.0.0rc1.tar.gz (14.4 kB view details)

Uploaded Source

Built Distribution

wood-1.0.0rc1-py2.py3-none-any.whl (18.6 kB view details)

Uploaded Python 2 Python 3

File details

Details for the file wood-1.0.0rc1.tar.gz.

File metadata

  • Download URL: wood-1.0.0rc1.tar.gz
  • Upload date:
  • Size: 14.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No

File hashes

Hashes for wood-1.0.0rc1.tar.gz
Algorithm Hash digest
SHA256 29f599c212e94bcf0f99dffa68834412cc4f5b818dcfc51272b71c7ffe33e4b1
MD5 8f480c8e99df475e34cf4bccb250ed54
BLAKE2b-256 6902594c715ad636ff7b6bb695aa0f77bebb0bbfc18b8e6aef8143246127acfc

See more details on using hashes here.

File details

Details for the file wood-1.0.0rc1-py2.py3-none-any.whl.

File metadata

File hashes

Hashes for wood-1.0.0rc1-py2.py3-none-any.whl
Algorithm Hash digest
SHA256 ed7f6449b9b43c4bad9b2dbab14d5a8e7680411ee453f989b3d3ace00994dfda
MD5 e06f0d93f03986ad8e9cd65e2f2d9a84
BLAKE2b-256 379ea097102e4de730f910bde4d95d6d044f70f9bb5fd1d31fdc98fe0fa599b9

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page