manifest-dl 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6ba4017f3570e96546119341a0092abe82f0429a
4
+ data.tar.gz: f802f115ac50c6c9485301fc0a2946ec85bda7d3
5
+ SHA512:
6
+ metadata.gz: 16370c0a559a79ca2b89ec5f28b8e4a59789605bacdb39b136355f320764835f5032ee1b2fb26f877f8d17b3cbeaa79e0312518be72a1d3f51995a087095a664
7
+ data.tar.gz: 926034ddfc85008573540f4a8db3b6f0330be00e9dc8602e73c88f4a689757964431163d25ac1f8952247889f637aa7868746e225d47e43dd5d4cb82dee6e93c
@@ -0,0 +1 @@
1
+ --markup markdown
@@ -0,0 +1,83 @@
1
+ []: {{{1
2
+
3
+ File : README.md
4
+ Maintainer : Felix C. Stegerman <flx@obfusk.net>
5
+ Date : 2014-10-16
6
+
7
+ Copyright : Copyright (C) 2014 Felix C. Stegerman
8
+ Version : v0.1.0
9
+
10
+ []: }}}1
11
+
12
+ <!--
13
+ [![Gem Version](https://badge.fury.io/rb/manifest-dl.png)](https://rubygems.org/gems/manifest-dl)
14
+ -->
15
+
16
+ ## Description
17
+ []: {{{1
18
+
19
+ manifest-dl - download extra files for your app
20
+
21
+ Sometimes you have a (web) app that needs some extra files (e.g.
22
+ terms and conditions) that you don't want to have to upload
23
+ manually, but prefer (e.g. because they're not very small) not to
24
+ have in your version control system.
25
+
26
+ manifest-dl allows you to specify the paths, urls and checksums in a
27
+ manifest and automatically downloads those extra files for you (and
28
+ updates them when they -- i.e. their checksums -- change).
29
+
30
+ NB: uses `curl` to download files; you'll need to have it installed.
31
+
32
+ []: }}}1
33
+
34
+ ## Examples
35
+ []: {{{1
36
+
37
+ `Gemfile`:
38
+ ```
39
+ gem 'manifest-dl', require: 'manifest-dl/rails'
40
+ ```
41
+
42
+ `config/manifest-dl.yaml`:
43
+ ```yaml
44
+ - path: public/uploads/t-and-c.pdf
45
+ - url: https://example.com/path/to/tandc.pdf
46
+ - sha512sum: 9c573b5ed223f076b4f0c9483608c2d341eb8...
47
+ ```
48
+
49
+ `.gitignore`
50
+ ```
51
+ /.manifest-dl-cache
52
+ ```
53
+
54
+ ```bash
55
+ rake manifest:dl
56
+ ```
57
+
58
+ []: }}}1
59
+
60
+ ## Specs & Docs
61
+
62
+ ```bash
63
+ rake spec # TODO
64
+ rake docs
65
+ ```
66
+
67
+ ## TODO
68
+
69
+ * gpg support?
70
+ * what to do with errors?
71
+ * specs/docs?
72
+ * ...
73
+
74
+ ## License
75
+
76
+ LGPLv3+ [1].
77
+
78
+ ## References
79
+
80
+ [1] GNU Lesser General Public License, version 3
81
+ --- http://www.gnu.org/licenses/lgpl-3.0.html
82
+
83
+ []: ! ( vim: set tw=70 sw=2 sts=2 et fdm=marker : )
@@ -0,0 +1,59 @@
1
+ desc 'Run specs'
2
+ task :spec do
3
+ sh 'rspec -c'
4
+ end
5
+
6
+ desc 'Run specs verbosely'
7
+ task 'spec:verbose' do
8
+ sh 'rspec -cfd'
9
+ end
10
+
11
+ desc 'Run specs verbosely, view w/ less'
12
+ task 'spec:less' do
13
+ sh 'rspec -cfd --tty | less -R'
14
+ end
15
+
16
+ desc 'Check for warnings'
17
+ task :warn do
18
+ reqs = %w{ config }.map { |x| "-r manifest-dl/#{x}" } * ' '
19
+ sh "ruby -w -I lib #{reqs} -e ''"
20
+ end
21
+
22
+ desc 'Check for warnings in specs'
23
+ task 'warn:spec' do
24
+ reqs = Dir['spec/**/*.rb'].sort.map { |x| "-r ./#{x}" } * ' '
25
+ sh "ruby -w -I lib -r rspec #{reqs} -e ''"
26
+ end
27
+
28
+ desc 'Check for warnings in specs (but not void context)'
29
+ task 'warn:spec:novoid' do
30
+ sh 'rake warn:spec 2>&1 | grep -v "void context"'
31
+ end
32
+
33
+ desc 'Generate docs'
34
+ task :docs do
35
+ sh 'yardoc | cat'
36
+ end
37
+
38
+ desc 'List undocumented objects'
39
+ task 'docs:undoc' do
40
+ sh 'yard stats --list-undoc'
41
+ end
42
+
43
+ desc 'Cleanup'
44
+ task :clean do
45
+ sh 'rm -rf .yardoc/ doc/ *.gem'
46
+ end
47
+
48
+ desc 'Build SNAPSHOT gem'
49
+ task :snapshot do
50
+ v = Time.new.strftime '%Y%m%d%H%M%S'
51
+ f = 'lib/manifest-dl/version.rb'
52
+ sh "sed -ri~ 's!(SNAPSHOT)!\\1.#{v}!' #{f}"
53
+ sh 'gem build manifest-dl.gemspec'
54
+ end
55
+
56
+ desc 'Undo SNAPSHOT gem'
57
+ task 'snapshot:undo' do
58
+ sh 'git checkout -- lib/manifest-dl/version.rb'
59
+ end
@@ -0,0 +1,111 @@
1
+ # -- ; {{{1
2
+ #
3
+ # File : manifest-dl.rb
4
+ # Maintainer : Felix C. Stegerman <flx@obfusk.net>
5
+ # Date : 2014-10-16
6
+ #
7
+ # Copyright : Copyright (C) 2014 Felix C. Stegerman
8
+ # Licence : LGPLv3+
9
+ #
10
+ # -- ; }}}1
11
+
12
+ require 'digest/sha1'
13
+ require 'fileutils'
14
+ require 'pathname'
15
+ require 'tmpdir'
16
+ require 'yaml'
17
+
18
+ # namespace
19
+ module ManifestDL
20
+
21
+ class InvalidItemError < StandardError; end
22
+ class SystemError < StandardError; end
23
+ class VerificationError < StandardError; end
24
+
25
+ DEFAULT_CONFIG = File.expand_path './config/manifest-dl.yaml'
26
+ DEFAULT_CACHE = File.expand_path './.manifest-dl-cache'
27
+
28
+ # --
29
+
30
+ # download files in manifest
31
+ def self.run!(quiet = false, config_file = DEFAULT_CONFIG)
32
+ YAML.load(File.read(DEFAULT_CONFIG)).map do |item|
33
+ _check! item; _dl?(item) ? _dl!(item, quiet) : nil;
34
+ end .compact
35
+ end
36
+
37
+ # --
38
+
39
+ # check item
40
+ def self._check!(item)
41
+ raise InvalidItemError,
42
+ "unexpected/missing keys for item #{item.inspect}" \
43
+ unless item.keys.sort == %w{ path sha512sum url }
44
+ raise InvalidItemError,
45
+ "non-string keys for item #{item.inspect}" \
46
+ unless item.keys.all? { |x| String === x }
47
+ end
48
+
49
+ # download, verify, mv file
50
+ def self._dl!(item, quiet = false)
51
+ $stderr.puts "==> #{item['path']}" unless quiet
52
+ Dir.mktmpdir do |dir|
53
+ tempfile = Pathname.new(dir).join('dl').to_s
54
+ _curl! item['url'], tempfile, quiet
55
+ _verify! tempfile, item['sha512sum']
56
+ FileUtils.mkdir_p File.dirname(item['path'])
57
+ FileUtils.mv tempfile, item['path'], force: true
58
+ _cache! item['path'], item['sha512sum']
59
+ end
60
+ item['path']
61
+ end
62
+
63
+ # should file be downloaded?
64
+ # (i.e. does not exist or sum has changed)
65
+ def self._dl?(item)
66
+ return true unless File.exist? item['path']
67
+ _cached_sha512sum(item['path']) != item['sha512sum']
68
+ end
69
+
70
+ # --
71
+
72
+ # download file w/ curl
73
+ def self._curl!(url, file, quiet = false)
74
+ args = %w{ curl -L } + (quiet ? %w{ -s } : []) + ['-o', file, '--', url]
75
+ # no shell b/c multiple args!
76
+ system(*args) or raise SystemError 'curl returned non-zero'
77
+ nil
78
+ end
79
+
80
+ # verify file
81
+ def self._verify!(file, sum)
82
+ # no shell b/c multiple args!
83
+ sum2 = IO.popen(%w{ shasum -a 512 } + [file]) { |f| f.gets.split.first }
84
+ raise SystemError 'shasum returned non-zero' unless $?.success?
85
+ raise VerificationError, file unless sum == sum2
86
+ nil
87
+ end
88
+
89
+ # get item's cached sha512sum;
90
+ # returns nil if cache file does not exist
91
+ def self._cached_sha512sum(path)
92
+ file = _cachefile path
93
+ File.exist?(file) ? File.read(file) : nil
94
+ end
95
+
96
+ # cache item's sha512sum (based on sha1sum of path)
97
+ def self._cache!(path, sum)
98
+ FileUtils.mkdir_p DEFAULT_CACHE
99
+ File.write _cachefile(path), sum
100
+ nil
101
+ end
102
+
103
+ # cache file path
104
+ def self._cachefile(path)
105
+ sha1 = Digest::SHA1.hexdigest path
106
+ Pathname.new(DEFAULT_CACHE).join(sha1).to_s
107
+ end
108
+
109
+ end
110
+
111
+ # vim: set tw=70 sw=2 sts=2 et fdm=marker :
@@ -0,0 +1,26 @@
1
+ # -- ; {{{1
2
+ #
3
+ # File : manifest-dl/rails.rb
4
+ # Maintainer : Felix C. Stegerman <flx@obfusk.net>
5
+ # Date : 2014-10-16
6
+ #
7
+ # Copyright : Copyright (C) 2014 Felix C. Stegerman
8
+ # Licence : LGPLv3+
9
+ #
10
+ # -- ; }}}1
11
+
12
+ require 'rails'
13
+
14
+ require 'manifest-dl'
15
+
16
+ # namespace
17
+ module LocalConfig
18
+
19
+ # railtie that adds the rake tasks
20
+ class Railtie < Rails::Railtie
21
+ rake_tasks { ManifestDL::Rake.define_tasks }
22
+ end
23
+
24
+ end
25
+
26
+ # vim: set tw=70 sw=2 sts=2 et fdm=marker :
@@ -0,0 +1,35 @@
1
+ # -- ; {{{1
2
+ #
3
+ # File : manifest-dl/rake.rb
4
+ # Maintainer : Felix C. Stegerman <flx@obfusk.net>
5
+ # Date : 2014-10-16
6
+ #
7
+ # Copyright : Copyright (C) 2014 Felix C. Stegerman
8
+ # Licence : LGPLv3+
9
+ #
10
+ # -- ; }}}1
11
+
12
+ require 'rake/dsl_definition'
13
+
14
+ require 'manifest-dl'
15
+
16
+ # namespace
17
+ module LocalConfig
18
+
19
+ # rake tasks
20
+ module Rake
21
+ extend ::Rake::DSL
22
+
23
+ # define rake task manifest:dl
24
+ def self.define_tasks
25
+ desc 'download extra files w/ manifest-dl'
26
+ task 'manifest:dl' do
27
+ ManifestDL.run!
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ end
34
+
35
+ # vim: set tw=70 sw=2 sts=2 et fdm=marker :
@@ -0,0 +1,4 @@
1
+ module ManifestDL
2
+ VERSION = '0.1.0'
3
+ DATE = '2014-10-16'
4
+ end
@@ -0,0 +1,31 @@
1
+ require File.expand_path('../lib/manifest-dl/version', __FILE__)
2
+
3
+ Gem::Specification.new do |s|
4
+ s.name = 'manifest-dl'
5
+ s.homepage = 'https://github.com/obfusk/manifest-dl'
6
+ s.summary = 'download extra files for your app'
7
+
8
+ s.description = <<-END.gsub(/^ {4}/, '')
9
+ download extra files for your app
10
+
11
+ ...
12
+ END
13
+
14
+ s.version = ManifestDL::VERSION
15
+ s.date = ManifestDL::DATE
16
+
17
+ s.authors = [ 'Felix C. Stegerman' ]
18
+ s.email = %w{ flx@obfusk.net }
19
+
20
+ s.licenses = %w{ LGPLv3+ }
21
+
22
+ s.files = %w{ .yardopts README.md Rakefile } \
23
+ + %w{ manifest-dl.gemspec } \
24
+ + Dir['{lib,spec}/**/*.rb']
25
+
26
+ s.add_runtime_dependency 'rake'
27
+
28
+ # s.add_development_dependency 'rspec'
29
+
30
+ s.required_ruby_version = '>= 1.9.1'
31
+ end
metadata ADDED
@@ -0,0 +1,70 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: manifest-dl
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Felix C. Stegerman
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-10-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rake
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ description: |
28
+ download extra files for your app
29
+
30
+ ...
31
+ email:
32
+ - flx@obfusk.net
33
+ executables: []
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - ".yardopts"
38
+ - README.md
39
+ - Rakefile
40
+ - lib/manifest-dl.rb
41
+ - lib/manifest-dl/rails.rb
42
+ - lib/manifest-dl/rake.rb
43
+ - lib/manifest-dl/version.rb
44
+ - manifest-dl.gemspec
45
+ homepage: https://github.com/obfusk/manifest-dl
46
+ licenses:
47
+ - LGPLv3+
48
+ metadata: {}
49
+ post_install_message:
50
+ rdoc_options: []
51
+ require_paths:
52
+ - lib
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ">="
56
+ - !ruby/object:Gem::Version
57
+ version: 1.9.1
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
59
+ requirements:
60
+ - - ">="
61
+ - !ruby/object:Gem::Version
62
+ version: '0'
63
+ requirements: []
64
+ rubyforge_project:
65
+ rubygems_version: 2.2.2
66
+ signing_key:
67
+ specification_version: 4
68
+ summary: download extra files for your app
69
+ test_files: []
70
+ has_rdoc: