nab 0.0.1
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.
- data/bin/nab +32 -0
- data/changelog.md +6 -0
- data/lib/nab/adapter_manager.rb +20 -0
- data/lib/nab/adapters/s3.rb +37 -0
- data/lib/nab/client.rb +18 -0
- data/lib/nab/logger.rb +52 -0
- data/lib/nab/version.rb +5 -0
- data/lib/nab.rb +15 -0
- data/nab.gemspec +27 -0
- data/readme.md +19 -0
- metadata +73 -0
data/bin/nab
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# encoding: UTF-8
|
3
|
+
|
4
|
+
$:.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
|
5
|
+
require 'nab'
|
6
|
+
|
7
|
+
DEBUG = Logger::DEBUG
|
8
|
+
WARN = Logger::WARN
|
9
|
+
FATAL = Logger::FATAL
|
10
|
+
INFO = Logger::INFO
|
11
|
+
|
12
|
+
# Default option values
|
13
|
+
options = OpenStruct.new
|
14
|
+
options.log_level = INFO
|
15
|
+
|
16
|
+
OptionParser.new do |o|
|
17
|
+
o.on('-l', '--log-level [LEVEL]', String, 'specify the log level (default is INFO)') do |l|
|
18
|
+
options.log_level = Kernel.const_get l.upcase
|
19
|
+
end
|
20
|
+
|
21
|
+
o.on('-h') { Nab::Log.info o; exit }
|
22
|
+
|
23
|
+
begin
|
24
|
+
o.parse!
|
25
|
+
rescue OptionParser::InvalidOption, OptionParser::MissingArgument
|
26
|
+
Nab::Log.fatal $!.to_s
|
27
|
+
Nab::Log.fatal o
|
28
|
+
exit 255
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
Nab::Client.new.run(options)
|
data/changelog.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Nab
|
4
|
+
class AdapterManager
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@adapters = Hash.new
|
8
|
+
end
|
9
|
+
|
10
|
+
def get(type)
|
11
|
+
if @adapters.key? type
|
12
|
+
@adapters[type]
|
13
|
+
else
|
14
|
+
Log.debug "Loading adapter for #{type}"
|
15
|
+
klass = Nab.const_get "#{type}Adapter"
|
16
|
+
@adapters[type] = klass.new
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Nab
|
4
|
+
class S3Adapter
|
5
|
+
attr_accessor :base_path
|
6
|
+
|
7
|
+
def initialize(base_path = ".")
|
8
|
+
AWS.config
|
9
|
+
@base_path = "."
|
10
|
+
end
|
11
|
+
|
12
|
+
def get(uri)
|
13
|
+
bucket_name = uri.host
|
14
|
+
asset_name = uri.path.gsub(/^\//, "") # remove leading slashes
|
15
|
+
name = File.basename asset_name
|
16
|
+
remote_path = File.dirname asset_name
|
17
|
+
local_path = File.join @base_path,remote_path
|
18
|
+
|
19
|
+
Log.debug "Bucket: #{bucket_name}"
|
20
|
+
Log.debug "Asset name: #{asset_name}"
|
21
|
+
Log.debug "Local path: #{local_path}"
|
22
|
+
|
23
|
+
FileUtils.mkdir_p local_path
|
24
|
+
|
25
|
+
s3 = AWS::S3.new
|
26
|
+
bucket = s3.buckets[bucket_name]
|
27
|
+
asset = bucket.objects[asset_name]
|
28
|
+
|
29
|
+
Log.info "Downloading #{File.join(bucket_name,asset_name)} to #{File.join(local_path,name)}"
|
30
|
+
File.open(File.join(local_path,name), 'wb') do |file|
|
31
|
+
asset.read do |chunk|
|
32
|
+
file.write chunk
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/lib/nab/client.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Nab
|
4
|
+
class Client
|
5
|
+
def run(options)
|
6
|
+
|
7
|
+
Log.level options.log_level
|
8
|
+
|
9
|
+
my_manager = AdapterManager.new
|
10
|
+
ARGV.each do |a|
|
11
|
+
uri = URI(a)
|
12
|
+
adapter = my_manager.get(uri.scheme.capitalize)
|
13
|
+
adapter.get(uri)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
data/lib/nab/logger.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# encoding: UTF-8
|
2
|
+
|
3
|
+
module Nab
|
4
|
+
|
5
|
+
module Log
|
6
|
+
|
7
|
+
def self.write(level, message)
|
8
|
+
@@log ||= SimpleLogger.instance
|
9
|
+
@@log.send(level.to_sym) { message }
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.info(message)
|
13
|
+
write('info', message)
|
14
|
+
end
|
15
|
+
|
16
|
+
def self.debug(message)
|
17
|
+
write('debug', message)
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.fatal(message)
|
21
|
+
write('fatal', message)
|
22
|
+
end
|
23
|
+
|
24
|
+
def self.warn(message)
|
25
|
+
write('warn', message)
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.level(level)
|
29
|
+
@@log ||= SimpleLogger.instance
|
30
|
+
@@log.level = level
|
31
|
+
end
|
32
|
+
|
33
|
+
class SimpleLogger < Logger
|
34
|
+
include Singleton
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@dev = Logger::LogDevice.new(STDOUT)
|
38
|
+
super @dev
|
39
|
+
@progname = 'Nab'
|
40
|
+
@formatter = proc do |sev, datetime, name, msg|
|
41
|
+
"[#{name}] [#{datetime}] [#{sev}]: #{msg}\n"
|
42
|
+
end
|
43
|
+
@datetime_format
|
44
|
+
end
|
45
|
+
|
46
|
+
def close
|
47
|
+
@dev.close
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/lib/nab/version.rb
ADDED
data/lib/nab.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
## encoding: UTF-8
|
2
|
+
|
3
|
+
require 'aws-sdk'
|
4
|
+
require 'optparse'
|
5
|
+
require 'singleton'
|
6
|
+
require 'ostruct'
|
7
|
+
require 'uri'
|
8
|
+
require 'fileutils'
|
9
|
+
|
10
|
+
require_relative 'nab/adapter_manager'
|
11
|
+
require_relative 'nab/client.rb'
|
12
|
+
require_relative 'nab/logger.rb'
|
13
|
+
require_relative 'nab/version.rb'
|
14
|
+
require_relative 'nab/adapters/s3.rb'
|
15
|
+
require_relative 'nab/adapters/http.rb'
|
data/nab.gemspec
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
|
3
|
+
lib = File.expand_path('../lib/',__FILE__)
|
4
|
+
$:.unshift lib unless $:.include?(lib)
|
5
|
+
require 'nab/version'
|
6
|
+
|
7
|
+
Gem::Specification.new do |spec|
|
8
|
+
spec.name = 'nab'
|
9
|
+
spec.version = Nab::VERSION
|
10
|
+
spec.licenses = ['Apache2']
|
11
|
+
spec.authors = ['Brian Bianco']
|
12
|
+
spec.email = ['brian.bianco@gmail.com']
|
13
|
+
spec.homepage = 'http://www.github.com/brianbianco/nab'
|
14
|
+
spec.summary = %q{}
|
15
|
+
spec.description = %q{}
|
16
|
+
|
17
|
+
spec.required_ruby_version = '>= 1.9.2'
|
18
|
+
spec.required_rubygems_version = '>= 1.3.6'
|
19
|
+
|
20
|
+
spec.files = `git ls-files`.split($/)
|
21
|
+
spec.test_files = spec.files.grep(%r{^spec/})
|
22
|
+
|
23
|
+
spec.executables = %w(nab)
|
24
|
+
spec.require_paths = ["lib"]
|
25
|
+
|
26
|
+
spec.add_dependency "aws-sdk", ">= 1.11.1"
|
27
|
+
end
|
data/readme.md
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
Nab
|
2
|
+
=======
|
3
|
+
|
4
|
+
A simple utility to pull down assets from assorted URIs.
|
5
|
+
|
6
|
+
Installation
|
7
|
+
============
|
8
|
+
|
9
|
+
`gem install nab`
|
10
|
+
|
11
|
+
Usage
|
12
|
+
=====
|
13
|
+
|
14
|
+
nab s3://bucket/path/file1.txt s3://bucket/path/file2.txt
|
15
|
+
|
16
|
+
Available adapters
|
17
|
+
==================
|
18
|
+
|
19
|
+
* s3
|
metadata
ADDED
@@ -0,0 +1,73 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nab
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Brian Bianco
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-09-16 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: aws-sdk
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.11.1
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.11.1
|
30
|
+
description: ''
|
31
|
+
email:
|
32
|
+
- brian.bianco@gmail.com
|
33
|
+
executables:
|
34
|
+
- nab
|
35
|
+
extensions: []
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- bin/nab
|
39
|
+
- changelog.md
|
40
|
+
- lib/nab.rb
|
41
|
+
- lib/nab/adapter_manager.rb
|
42
|
+
- lib/nab/adapters/s3.rb
|
43
|
+
- lib/nab/client.rb
|
44
|
+
- lib/nab/logger.rb
|
45
|
+
- lib/nab/version.rb
|
46
|
+
- nab.gemspec
|
47
|
+
- readme.md
|
48
|
+
homepage: http://www.github.com/brianbianco/nab
|
49
|
+
licenses:
|
50
|
+
- Apache2
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.9.2
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: 1.3.6
|
67
|
+
requirements: []
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.8.23
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: ''
|
73
|
+
test_files: []
|