depends-client 0.2.0.beta3 → 0.2.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.
data/README.md CHANGED
@@ -15,37 +15,56 @@ Depends is quite simple.
15
15
  ```bash
16
16
  gem install depends-client
17
17
  ```
18
- 2. Setup ~/.depends/config.rb
19
18
 
20
- ```ruby
21
- depend config --key <your key here>
22
- ```
23
-
24
- 3. Define a Depends file at the root of your source repository. The format is as follows:
25
- As of this release <code>source</code> is not longer necessary. The default location is always used.
19
+ 2. Define a Depends file at the root of your source repository. The format is as follows:
26
20
 
27
21
  ```ruby
28
- depend 'Qt', version: '4', destination: 'External/Qt'
29
- depend 'SevenZipSharp', version: '4', destination: 'External/SevenZipSharp'
30
- depend 'Sqlite', version: '4', destination: 'External/Sqlite'
31
- depend 'Xerces', version: '4', destination: 'External/Xerces'
32
- depend 'Xsd', version: '4', destination: 'External/Xsd'
22
+
23
+ source :depends
24
+
25
+ depend 'Qt', :version => '4', :destination => 'External/Qt'
26
+ depend 'SevenZipSharp', :version => '4', :destination => 'External/SevenZipSharp'
27
+ depend 'Sqlite', :version => '4', :destination => 'External/Sqlite'
28
+ depend 'Xerces', :version => '4', :destination => 'External/Xerces'
29
+ depend 'Xsd', :version => '4', :destination => 'External/Xsd'
33
30
 
34
31
  ```
35
32
 
33
+ _source_ defines that location of the depends server. Currently :local, :depends, or a string to some other depends
34
+ server, i.e. http://example.com.
35
+
36
36
  _depend_ defines what the dependency is, the version to install and the path to unpack it to
37
37
 
38
- 4. Execute Depends
38
+ 3. Execute Depends
39
39
  ```bash
40
40
  depend
41
41
  ```
42
42
 
43
- 5. Add your Depends file to source control
43
+ 4. Add your Depends file to source control
44
44
 
45
45
  _We also recomend that you add depends destinations to your gitignore and hgignore files._
46
46
 
47
- You're done! Packages are downloaded, extracted and installed per the instructions in your gem file.
47
+ Your done, packages are download, extracted and installed per the instructions in your gem file
48
+
49
+
50
+ Uploading A Dependency
51
+ ----------------------
52
+ This tutorial does not cover installing a depends server, but asuming that you have a depends server setup, adding a new
53
+ dependency is simple.
54
+
55
+ 1. Install Depends
56
+
57
+ ```bash
58
+ gem install depends
59
+ ````
60
+ 2. Setup a directory that models what you want to upload. I.e. Create /tmp/openssl and add some files to it.
61
+ 3. Package and upload
62
+
63
+ ```bash
64
+ depend upload -s /tmp/openssl -d 'depends' -n "OpenSSL" -v '1.2.3b'
65
+ ```
48
66
 
67
+ That's it, your package is created and uploaded to the depends server.
49
68
 
50
69
  The Future
51
70
  ==========
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'depends'
4
+ time = Benchmark.realtime do
5
+ begin
6
+ a = Depends::CommandFactory.build.new
7
+ a.run
8
+ rescue Depends::Exceptions::SubCommandMissing => e
9
+ Depends::Log.debug ("Exception: #{e.inspect}")
10
+ Depends::Log.fatal ("SubCommand is not defined #{e.message}")
11
+ Process.exit 1
12
+ end
13
+ end
14
+
15
+ Depends::Log.debug ":total_runtime => #{time*1000} milliseconds"
16
+
17
+
@@ -4,9 +4,19 @@ require 'net/http'
4
4
  require 'json'
5
5
  require 'fileutils'
6
6
  require 'logger'
7
+ require 'mixlib/log'
8
+ require 'mixlib/config'
9
+ require 'mixlib/cli'
7
10
  require 'digest/sha1'
8
11
  require 'multi_json'
9
- require 'mixlib/config'
12
+
13
+ if RUBY_PLATFORM =~ /mingw32|mswin32/
14
+ unless Gem.available?('win32-dir')
15
+ `gem install win32-dir`
16
+ Gem.clear_paths
17
+ end
18
+ require 'win32/dir'
19
+ end
10
20
 
11
21
  require 'depends/exceptions'
12
22
  require 'depends/config'
@@ -14,9 +24,11 @@ require 'depends/util'
14
24
  require 'depends/rest_client'
15
25
  require 'depends/dsl/depend'
16
26
  require 'depends/definition'
17
- require 'terminal-table'
27
+ require 'depends/log/formatter'
28
+ require 'depends/log'
29
+ require 'depends/command_factory'
18
30
 
31
+ require 'depends/commands/base'
19
32
  require 'depends/commands/install'
20
33
  require 'depends/commands/list'
21
- require 'depends/commands/versions'
22
34
  require 'depends/commands/upload'
@@ -0,0 +1,31 @@
1
+ module Depends
2
+ module CommandFactory
3
+ class << self
4
+ def build
5
+ subcommand_class
6
+ end
7
+
8
+ private
9
+ def subcommand_class
10
+ command_words = ARGV.select {|arg| arg =~ /^(([[:alnum:]])[[:alnum:]\_\-]+)$/ }
11
+ if command_words.empty?
12
+ return Depends::Commands::Install
13
+ end
14
+ command_words.collect! {|word| word.titleize }
15
+ command_options = []
16
+ subcommand_class = nil
17
+
18
+ while ( !subcommand_class ) && ( !command_words.empty? )
19
+ constant_case_name = command_words.join('')
20
+ command_options << constant_case_name
21
+ command_constant = Depends::Commands.constants.select { |i| i.eql? constant_case_name.to_sym}
22
+ unless command_constant.empty?
23
+ return "Depends::Commands::#{constant_case_name}".constantize
24
+ end
25
+ command_words.pop
26
+ end
27
+ raise Depends::Exceptions::SubCommandMissing, "Possible SubCommands: #{command_options} "
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,87 @@
1
+ module Depends
2
+ module Commands
3
+ class Base
4
+
5
+ include Mixlib::CLI
6
+
7
+ def initialize
8
+ super
9
+
10
+ trap("TERM") do
11
+ Depends::Commands::Base.fatal!("SIGTERM received, stopping", 1)
12
+ end
13
+
14
+ trap("INT") do
15
+ Depends::Commands::Base.fatal!("SIGINT received, stopping", 2)
16
+ end
17
+
18
+ processor, platform, *rest = RUBY_PLATFORM.split("-")
19
+
20
+ unless RUBY_PLATFORM =~ /mingw32|mswin32/
21
+ trap("QUIT") do
22
+ Depends::Log.info("SIGQUIT received, call stack:\n " + caller.join("\n "))
23
+ end
24
+
25
+ trap("HUP") do
26
+ Depends::Log.info("SIGHUP received, reconfiguring")
27
+ reconfigure
28
+ end
29
+ end
30
+
31
+ end
32
+
33
+ def reconfigure
34
+ parse_options
35
+ configure_depends
36
+ configure_logging
37
+ end
38
+
39
+ def run
40
+ reconfigure
41
+ setup_application
42
+ run_application
43
+ end
44
+
45
+
46
+ private
47
+ def configure_depends
48
+
49
+ if File.exist?('~/.depends')
50
+ Depends::Log.info "Loading config file from '~/.depends'"
51
+ Depends::Config.from_file('~/.depends')
52
+ end
53
+
54
+ FileUtils.mkdir_p Depends::Config.cache
55
+ end
56
+
57
+ def configure_logging
58
+ Depends::Log.formatter = Depends::Log::Formatter.new
59
+ Depends::Log.level = config[:log_level] || Logger::INFO
60
+ end
61
+
62
+ # Called prior to starting the application, by the run method
63
+ def setup_application
64
+ raise Depends::Exceptions::Application, "#{self.to_s}: you must override setup_application"
65
+ end
66
+
67
+ # Actually run the application
68
+ def run_application
69
+ raise Depends::Exceptions::Application, "#{self.to_s}: you must override run_application"
70
+ end
71
+
72
+ class << self
73
+
74
+ # Log a fatal error message to both STDERR and the Logger, exit the application
75
+ def fatal!(msg, err = -1)
76
+ Depends::Log.fatal(msg)
77
+ Process.exit err
78
+ end
79
+
80
+ def exit!(msg, err = -1)
81
+ Depends::Log.debug(msg)
82
+ Process.exit err
83
+ end
84
+ end
85
+ end
86
+ end
87
+ end
@@ -1,20 +1,21 @@
1
+ require 'benchmark'
1
2
  module Depends
2
3
  module Commands
3
- class Install
4
+ class Install < Depends::Commands::Base
4
5
 
5
- def run
6
+ banner "Install dependencies"
6
7
 
7
- if RUBY_PLATFORM =~ /mingw32|mswin32/
8
- begin
9
- require 'win32/dir'
10
- rescue LoadError
11
- color("Failed to require win32/dir, please make sure the gem is installed or in your bundle",:red)
12
- exit(1)
13
- end
14
- end
8
+ option :log_level,
9
+ :short => "-l LEVEL",
10
+ :long => "--log_level LEVEL",
11
+ :description => "Set the log level (debug, info, warn, error, fatal)",
12
+ :proc => Proc.new { |l| l.downcase.to_sym }
15
13
 
16
- Depends::Config.load
17
- say 'Installing Dependencies...'
14
+ def setup_application
15
+ Log.info "Installing dependencies..."
16
+ end
17
+
18
+ def run_application
18
19
  check_for_file
19
20
  load_depends_file
20
21
  download_extract
@@ -25,7 +26,7 @@ module Depends
25
26
  private
26
27
  def check_for_file
27
28
  unless Dir.entries(Dir.pwd).include?('Depends')
28
- color "Missing Depends file", :red
29
+ Depends::Log.error "Missing Depends file"
29
30
  exit 1
30
31
  end
31
32
  end
@@ -39,7 +40,7 @@ module Depends
39
40
  file = nil
40
41
  end
41
42
 
42
- say "Updating #{file} with external dependencies..." if file
43
+ Depends::Log.info "Updating #{file} with external dependencies..." if file
43
44
  unless file.nil?
44
45
  FileUtils.touch(file) unless File.exist? file
45
46
  ignore_file = File.read(file)
@@ -49,12 +50,13 @@ module Depends
49
50
  ignore.delete(line.chomp)
50
51
  end
51
52
  end
52
- File.open(file, 'a') do |f|
53
+ File.open(file, 'a') { |f|
53
54
  ignore.each do |i|
55
+ Depends::Log.debug "Adding #{i} to #{file}"
54
56
  f.puts ""
55
57
  f.puts i
56
58
  end
57
- end
59
+ }
58
60
  end
59
61
  end
60
62
 
@@ -64,31 +66,31 @@ module Depends
64
66
 
65
67
 
66
68
  def load_depends_file
67
- say "Loading Dependencies..."
69
+ Depends::Log.info "Loading Dependencies..."
68
70
  @def = Depends::DSL::Depend.evaluate('Depends')
69
71
  unless @def.unmet_dependencies.empty?
70
- color "You have unmet dependencies in your sources, #{@def.unmet_dependencies.inspect}", :red
72
+ Depends::Log.fatal "You have unmet dependencies in your sources, #{@def.unmet_dependencies.inspect}"
71
73
  Process.exit 1
72
74
  end
73
75
  end
74
76
 
75
77
 
76
78
  def download_extract
77
- say "Downloading and extracting missing dependencies..."
79
+ Depends::Log.info "Downloading and extracting missing dependencies..."
78
80
  @def.dependencies.each do |dep|
79
- file_name = "#{Util.depend_name_with_version(dep)}.zip"
81
+ file_name = "#{dep[:name]}-#{dep['number']}.zip"
80
82
  cache_file = File.join(Depends::Config.cache,file_name)
81
83
  cache_directory = File.join(Depends::Config.cache,File.basename(file_name,'.zip'))
82
84
 
83
85
  unless File.exist?(cache_file) # and Digest::SHA1.file(cache_file).to_s.eql? dep["sha1"]
84
- say "Downloading #{dep[:name]}..."
86
+ Depends::Log.info "Downloading #{dep[:name]}..."
85
87
  just_downloaded = true
86
88
  dep[:source].download_depend_version(dep[:name],dep["number"])
87
89
  end
88
90
 
89
91
  if just_downloaded or not File.exist? cache_directory
90
- say "Extracting #{cache_file}"
91
- Util.un_zip(cache_file,cache_directory)
92
+ Depends::Log.info "Extracting #{cache_file}"
93
+ Util.un_zip(cache_file,cache_directory) unless config[:dry_run]
92
94
  end
93
95
 
94
96
  end
@@ -96,10 +98,10 @@ module Depends
96
98
 
97
99
  def link
98
100
  @def.dependencies.each do |dep|
99
- source = File.join(Depends::Config.cache,File.basename(Util.depend_name_with_version(dep),'.zip'))
101
+ source = File.join(Depends::Config.cache,File.basename("#{dep[:name]}-#{dep['number']}",'.zip'))
100
102
  base_dir = File.dirname(dep[:destination])
101
103
  FileUtils.mkdir_p(base_dir) unless File.exist? base_dir
102
- say "Linking #{source} to #{dep[:destination]}"
104
+ Depends::Log.info "Linking #{source} to #{dep[:destination]}"
103
105
 
104
106
  if RUBY_PLATFORM =~ /mingw32|mswin32/
105
107
  Dir.delete dep[:destination] if File.exist? dep[:destination]
@@ -1,19 +1,72 @@
1
-
1
+ require 'benchmark'
2
2
  module Depends
3
3
  module Commands
4
- class List
4
+ class List < Depends::Commands::Base
5
+
6
+ banner "List dependencies"
7
+
8
+ option :log_level,
9
+ :short => "-l LEVEL",
10
+ :long => "--log_level LEVEL",
11
+ :description => "Set the log level (debug, info, warn, error, fatal)",
12
+ :proc => Proc.new { |l| l.downcase.to_sym }
13
+ option :versions,
14
+ :short => "-d depend",
15
+ :long => "--depend d",
16
+ :description => "List the versions for a depend"
5
17
 
6
- def run
7
- Depends::Config.load
8
- client = Depends::RestClient.new()
9
- deps = client.list
10
- headers = ['Name','Description']
11
- rows = deps.collect{ |i| [i['name'] ,i['description']] }
12
- table = Terminal::Table.new :title => "Dependencies", :headings => headers, :rows => rows
13
- puts table
18
+ def setup_application
19
+ Log.info "Getting Depends from sources..."
20
+ end
21
+
22
+ def run_application
23
+ check_for_file
24
+ load_depends_file
25
+ if config[:versions]
26
+ results = []
27
+ @def.sources.each do |source|
28
+ source_index = results.count
29
+ results[source_index] = {:source => source.source_url, :versions => []}
30
+ begin
31
+ dep = source.get_depend(config[:versions])
14
32
 
33
+ dep['versions'].each do |version|
34
+ results[source_index][:versions] << version.keep_if { |key| ['number','notes','publisher','sha1'].include?(key) }
35
+ end
36
+ rescue Nestful::ResourceNotFound
37
+ puts " Depend not found on source"
38
+ end
39
+ puts results.to_yaml
40
+ end
41
+ else
42
+ results = []
43
+ @def.sources.each do |source|
44
+ source_index = results.count
45
+ results[source_index] = {:source => source.source_url, :depends => []}
46
+ source.list.each do |d|
47
+ results[source_index][:depends] << d.keep_if { |key| ['name','description'].include?(key) }
48
+ end
49
+ end
50
+ results.each do |r|
51
+ r[:depends].sort_by! { |h| h['name']}
52
+ end
53
+ puts results.to_yaml
54
+ end
15
55
  end
16
-
56
+
57
+ private
58
+ def check_for_file
59
+ unless Dir.entries(Dir.pwd).include?('Depends')
60
+ Depends::Log.error "Missing Depends file"
61
+ exit 1
62
+ end
63
+ end
64
+
65
+
66
+ def load_depends_file
67
+ @def = Depends::DSL::Depend.evaluate('Depends')
68
+ end
69
+
17
70
  end
18
71
  end
19
72
  end
@@ -1,51 +1,88 @@
1
1
  module Depends
2
2
  module Commands
3
- class Upload
3
+ class Upload < Depends::Commands::Base
4
4
 
5
+ class UploadConfig
6
+ extend(Mixlib::Config)
7
+ end
5
8
 
6
- def run(options)
7
- Depends::Config.load
8
- client = Depends::RestClient.new
9
- puts "CREATE: #{options.create}"
9
+ banner "Upload a dependency to a depends server"
10
10
 
11
- begin
12
- @dep = client.get_depend(options.dep)
13
- rescue Nestful::ResourceNotFound => e
14
- if options.create
15
- say("Creating dependency")
16
- @dep = client.create_depend(options.dep,options.description)
11
+ option :source,
12
+ :short => "-s source",
13
+ :long => "--source source",
14
+ :description => "Source directory for dependency",
15
+ :required => true
16
+ option :key,
17
+ :short => "-k key",
18
+ :long => "--key key",
19
+ :description => "The API Key to use for upload",
20
+ :required => true
17
21
 
18
- else
19
- color("Dependency does not exist and --create flag was not specified", :red)
20
- exit 1
21
- end
22
- end
22
+ option :description,
23
+ :short => "-e description",
24
+ :long => "--description description",
25
+ :required => false
23
26
 
24
- file = build_package(options)
25
- sha1 = Digest::SHA1.file(file).to_s
27
+ option :name,
28
+ :short => "-n name",
29
+ :long => "--name name",
30
+ :description => "Dependency Name",
31
+ :required => true
32
+
33
+ option :version,
34
+ :short => "-v version",
35
+ :long => "--version version",
36
+ :description => "Version to publish",
37
+ :required => true
38
+
39
+ option :destination,
40
+ :short => "-d destination",
41
+ :long => "--destination destination",
42
+ :description => "Destination to publish depend to",
43
+ :default => 'https://depends.io',
44
+ :proc => Proc.new { |o|
45
+ Depends::Util.depends_source o
46
+ }
26
47
 
27
- if @dep['versions'].select { |v| v.eql? options.num }.empty?
28
- puts "File #{file}"
29
- puts "SHA #{sha1}"
30
- puts "Number #{options.num}"
31
- begin
32
- client.create_version(@dep['name'], :file => file, :sha1 => sha1, :number => options.num)
33
- rescue Nestful::BadRequest => e
34
- color(e.response.body, :red)
48
+ option :log_level,
49
+ :short => "-l LEVEL",
50
+ :long => "--log_level LEVEL",
51
+ :description => "Set the log level (debug, info, warn, error, fatal)",
52
+ :proc => Proc.new { |l| l.downcase.to_sym }
53
+
54
+ def setup_application
55
+
56
+ end
57
+
58
+ def run_application
59
+ client = Depends::RestClient.new(config[:destination])
60
+ client.api_key = config[:key]
61
+
62
+ begin
63
+ Log.info "Getting Depend"
64
+ @dep = client.get_depend(config[:name])
65
+ rescue Nestful::ResourceNotFound => e
66
+ if config[:description].nil?
67
+ Log.fatal("Depends does not exist, you must specify a description")
68
+ exit(1)
35
69
  end
36
- else
37
- color("Dependency already exists!", :red)
70
+ Log.info "Creating Depends"
71
+ @dep = client.create_depend(config[:name],config[:description])
38
72
  end
73
+ file = build_package
74
+ sha1 = Digest::SHA1.file(file).to_s
75
+ client.create_version(config[:name], :file => file, :sha1 => sha1, :number => config[:version])
39
76
  end
40
77
 
41
78
  private
42
79
 
43
- def build_package(options)
80
+ def build_package
44
81
  upload_dir = File.join(Depends::Config.cache,'upload')
45
- FileUtils.mkdir_p upload_dir
46
- dest_file = File.join(upload_dir, "#{options.dep}-#{options.num}.zip")
47
- FileUtils.rm_f
48
- source_path = File.expand_path(options.source)
82
+ FileUtils.mkdir_p upload_dir unless File.exist? upload_dir
83
+ dest_file = File.join(upload_dir, "#{config[:name]}-#{config[:version]}.zip")
84
+ FileUtils.rm dest_file if File.exist? dest_file
85
+ source_path = File.expand_path(config[:source])
49
86
  Zip::ZipFile.open(dest_file, Zip::ZipFile::CREATE) { |zipfile|
50
87
  Dir["#{source_path}/**/*"].each do |file|
51
88
  relative_path = file.to_s.gsub(source_path, '')
@@ -2,16 +2,6 @@ module Depends
2
2
  class Config
3
3
  extend(Mixlib::Config)
4
4
 
5
- cache File.expand_path('~/.depends')
6
- api_key ''
7
- server 'https://depends.aws.af.cm'
8
-
9
- def self.load(file = '~/.depends/config.rb')
10
- config_file = File.expand_path(file)
11
- Depends::Config.from_file(config_file)
12
- rescue
13
- color("Failed to load config file, please run 'depend config'", :red)
14
- exit(1)
15
- end
16
- end
17
- end
5
+ cache File.expand_path('~/.depends_cache')
6
+ end
7
+ end
@@ -5,6 +5,7 @@ module Depends
5
5
  attr_reader :sources
6
6
  attr_reader :dependencies
7
7
  attr_reader :unmet_dependencies
8
+ attr_reader :default_source
8
9
 
9
10
  def initialize(sources,dependencies, options ={})
10
11
  @sources = sources
@@ -14,6 +15,7 @@ module Depends
14
15
  def map(deps)
15
16
  @dependencies = []
16
17
  @unmet_dependencies = []
18
+ Log.debug " :definition => #{@def.inspect}"
17
19
  deps.each do |dep|
18
20
  dependency_met = false
19
21
  sources.each do |source|
@@ -22,10 +24,11 @@ module Depends
22
24
  server_dep[:source] = source
23
25
  server_dep[:destination] = dep[:destination]
24
26
  server_dep[:name] = dep[:name]
27
+ Log.debug ":server_dep => #{server_dep}"
25
28
  @dependencies << server_dep
26
29
  dependency_met = true
27
30
  rescue Nestful::ResourceNotFound => e
28
-
31
+ Log.debug ":resource_not_found => #{e.inspect}"
29
32
  end
30
33
  end
31
34
 
@@ -13,7 +13,7 @@ module Depends
13
13
  end
14
14
 
15
15
  def initialize
16
- @sources = [Depends::RestClient.new]
16
+ @sources = []
17
17
  @dependencies = []
18
18
  end
19
19
 
@@ -33,22 +33,26 @@ module Depends
33
33
  end
34
34
 
35
35
  def source(source, options = {})
36
- color("source is a depreciated dsl option", :yellow)
36
+ depends_source Depends::Util.depends_source(source)
37
37
  end
38
38
 
39
- def key(*args)
40
- color("key is a depreciated dsl option", :yellow)
39
+ def default
40
+ @default ||= @sources.last
41
+ end
42
+
43
+ def key(api_key)
44
+ @sources.last.api_key = api_key
41
45
  end
42
46
 
43
47
  def to_definition
44
48
  @sources.uniq!
45
- raise DslError, "No source specified! Try source :bigdepends" unless @sources.length > 0
49
+ raise DslError, "No source specified! Try source :depends" unless @sources.length > 0
46
50
  Depends::Definition.new(@sources, @dependencies)
47
51
  end
48
52
 
49
53
  private
50
54
  def depends_source(source)
51
-
55
+ @sources << Depends::RestClient.new(source)
52
56
  end
53
57
 
54
58
  end
@@ -0,0 +1,6 @@
1
+ module Depends
2
+ class Log
3
+ extend Mixlib::Log
4
+ end
5
+ end
6
+
@@ -0,0 +1,41 @@
1
+ require 'logger'
2
+ require 'time'
3
+
4
+ module Depends
5
+ class Log
6
+ class Formatter < Logger::Formatter
7
+ @@show_time = false
8
+
9
+ COLOR_MAP = {'DEBUG' =>'0;37', 'INFO'=>'32', 'WARN'=>'33', 'ERROR'=>'31', 'FATAL'=>'31', 'UNKNOWN'=>'37'}
10
+
11
+ def self.show_time=(show=false)
12
+ @@show_time = show
13
+ end
14
+
15
+ def call(severity, time, progname, msg)
16
+ color = COLOR_MAP[severity]
17
+
18
+ if @@show_time
19
+ sprintf("\033[0;37m%s \033[0m[\033[#{color}m%s\033[0m]: \033[0m%s\n", time.rfc2822(), severity, msg2str(msg))
20
+ else
21
+ sprintf("\033[#{color}m%s\033[0;37m: \033[0m%s\n", severity, msg2str(msg))
22
+ end
23
+ end
24
+
25
+ # Converts some argument to a Logger.severity() call to a string. Regular strings pass through like
26
+ # normal, Exceptions get formatted as "message (class)\nbacktrace", and other random stuff gets
27
+ # put through "object.inspect"
28
+ def msg2str(msg)
29
+ case msg
30
+ when ::String
31
+ msg
32
+ when ::Exception
33
+ "#{ msg.message } (#{ msg.class })\n" <<
34
+ (msg.backtrace || []).join("\n")
35
+ else
36
+ msg.inspect
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
@@ -5,16 +5,18 @@ module Depends
5
5
  class RestClient
6
6
 
7
7
  attr_accessor :source_url
8
+ attr_accessor :api_key
8
9
  attr_reader :cache
9
10
 
10
- def initialize
11
- @source_url = Depends::Config.server
12
- cache_path = File.join(Depends::Config.cache,'rest',URI.parse(source_url.to_s).host )
11
+ def initialize(source)
12
+ @source_url = source
13
+ cache_path = File.join(Depends::Config.cache,'rest',URI.parse(source.to_s).host )
14
+ Depends::Log.debug ":cache_path => #{cache_path}"
13
15
  @cache = ActiveSupport::Cache::FileStore.new(cache_path, :expires_in => 1.day)
14
16
  end
15
17
 
16
18
  def headers
17
- {'key' => Depends::Config.api_key}
19
+ {'key' => api_key}
18
20
  end
19
21
 
20
22
  def create_version(name,options = {})
@@ -28,13 +30,22 @@ module Depends
28
30
 
29
31
  def get_depend(name)
30
32
  uri = "#{source_url}/depends/#{name}"
31
- depend = Nestful.get uri, :format => :json, :headers => headers
33
+ #depend = cache.read(uri)
34
+ #if depend.nil?
35
+ depend = Nestful.get uri, :format => :json, :headers => headers
36
+ #cache.write(uri,depend.to_json)
37
+ #else
38
+ # depend = ::MultiJson.load(depend)
39
+ #end
32
40
  depend
33
41
  end
34
42
 
35
43
  def download_depend_version(name,version)
36
44
  dest_file = File.join(Depends::Config.cache, "#{name}-#{version}.zip")
37
- uri = get_downlad_uri(name,version)
45
+ Log.info "#{source_url}/depends/#{name}/version/#{version}/download"
46
+
47
+ request = Nestful.get "#{source_url}/depends/#{name}/version/#{version}/download.url", :headers => headers
48
+ uri = URI.parse(request)
38
49
  http = Net::HTTP.new(uri.host, uri.port)
39
50
  http.use_ssl = true
40
51
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
@@ -51,13 +62,13 @@ module Depends
51
62
  size += chunk.size
52
63
  new_progress = (size * 100) / total
53
64
  unless new_progress == progress
54
- say "\rDownloading %s (%3d%%) " % [name, new_progress]
65
+ Log.info "\rDownloading %s (%3d%%) " % [name, new_progress]
55
66
  end
56
67
  progress = new_progress
57
68
  end
58
69
 
59
70
  temp_file.close
60
- FileUtils.rm_f dest_file
71
+ File.unlink dest_file if File.exists?(dest_file)
61
72
  FileUtils.mkdir_p File.dirname(dest_file)
62
73
  FileUtils.mv temp_file.path, dest_file, :force => true
63
74
  end
@@ -82,16 +93,18 @@ module Depends
82
93
 
83
94
 
84
95
  def get_dep_version(name,version)
96
+ Depends::Log.debug "[get] :ver => #{version}"
85
97
  uri = "#{source_url}/depends/#{name}/version/#{version}"
86
- depend = Nestful.get uri, :format => :json, :headers => headers
98
+ #depend = cache.read(uri)
99
+ #if depend.nil?
100
+ depend = Nestful.get uri, :format => :json, :headers => headers
101
+ #cache.write(uri,depend.to_json)
102
+ #else
103
+ # depend = ::MultiJson.load(depend)
104
+ #end
87
105
  depend
88
106
  end
89
107
 
90
- private
91
- def get_downlad_uri(name,version)
92
- request = Nestful.get "#{source_url}/depends/#{name}/version/#{version}/download.url", :headers => headers
93
- uri = URI.parse(request)
94
- end
95
108
 
96
109
  end
97
110
  end
File without changes
@@ -5,12 +5,14 @@ module Depends
5
5
 
6
6
  def self.un_zip(source,destination, options = {})
7
7
  options.reverse_merge!({:overwrite => true})
8
- say "Opening #{source}"
8
+ Log.debug "Opening #{source}"
9
9
  Zip::ZipFile.open(source) do |zip|
10
10
  zip.each do |entry|
11
+ Log.debug (":entry => #{entry.name}")
11
12
  path = ::File.join(destination, entry.name)
12
13
  FileUtils.mkdir_p(::File.dirname(path))
13
14
  if options[:overwrite] && ::File.exists?(path) && !::File.directory?(path)
15
+ Log.debug("Removing #{path}")
14
16
  FileUtils.rm(path)
15
17
  end
16
18
  zip.extract(entry, path)
@@ -25,14 +27,10 @@ module Depends
25
27
  when :local
26
28
  "http://localhost:8080"
27
29
  when :depends
28
- "http://depends.io"
30
+ "https://depends.cloudfoundry.com/"
29
31
  else
30
32
  source
31
33
  end
32
34
  end
33
-
34
- def self.depend_name_with_version(dep)
35
- "#{dep[:name]}-#{dep['number']}"
36
- end
37
35
  end
38
36
  end
metadata CHANGED
@@ -1,8 +1,8 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: depends-client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0.beta3
5
- prerelease: 6
4
+ version: 0.2.0
5
+ prerelease:
6
6
  platform: ruby
7
7
  authors:
8
8
  - Chris Roby
@@ -10,16 +10,16 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2013-01-09 00:00:00.000000000 Z
13
+ date: 2012-07-19 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
- name: nestful
16
+ name: mixlib-log
17
17
  requirement: !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ~>
21
21
  - !ruby/object:Gem::Version
22
- version: 0.0.8
22
+ version: 1.3.0
23
23
  type: :runtime
24
24
  prerelease: false
25
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -27,15 +27,15 @@ dependencies:
27
27
  requirements:
28
28
  - - ~>
29
29
  - !ruby/object:Gem::Version
30
- version: 0.0.8
30
+ version: 1.3.0
31
31
  - !ruby/object:Gem::Dependency
32
- name: rubyzip
32
+ name: nestful
33
33
  requirement: !ruby/object:Gem::Requirement
34
34
  none: false
35
35
  requirements:
36
36
  - - ~>
37
37
  - !ruby/object:Gem::Version
38
- version: 0.9.7
38
+ version: 0.0.8
39
39
  type: :runtime
40
40
  prerelease: false
41
41
  version_requirements: !ruby/object:Gem::Requirement
@@ -43,15 +43,15 @@ dependencies:
43
43
  requirements:
44
44
  - - ~>
45
45
  - !ruby/object:Gem::Version
46
- version: 0.9.7
46
+ version: 0.0.8
47
47
  - !ruby/object:Gem::Dependency
48
- name: activesupport
48
+ name: mixlib-config
49
49
  requirement: !ruby/object:Gem::Requirement
50
50
  none: false
51
51
  requirements:
52
52
  - - ~>
53
53
  - !ruby/object:Gem::Version
54
- version: 3.2.3
54
+ version: 1.1.2
55
55
  type: :runtime
56
56
  prerelease: false
57
57
  version_requirements: !ruby/object:Gem::Requirement
@@ -59,15 +59,15 @@ dependencies:
59
59
  requirements:
60
60
  - - ~>
61
61
  - !ruby/object:Gem::Version
62
- version: 3.2.3
62
+ version: 1.1.2
63
63
  - !ruby/object:Gem::Dependency
64
- name: rack-cache
64
+ name: rubyzip
65
65
  requirement: !ruby/object:Gem::Requirement
66
66
  none: false
67
67
  requirements:
68
68
  - - ~>
69
69
  - !ruby/object:Gem::Version
70
- version: '1.2'
70
+ version: 0.9.7
71
71
  type: :runtime
72
72
  prerelease: false
73
73
  version_requirements: !ruby/object:Gem::Requirement
@@ -75,15 +75,15 @@ dependencies:
75
75
  requirements:
76
76
  - - ~>
77
77
  - !ruby/object:Gem::Version
78
- version: '1.2'
78
+ version: 0.9.7
79
79
  - !ruby/object:Gem::Dependency
80
- name: multi_json
80
+ name: mixlib-cli
81
81
  requirement: !ruby/object:Gem::Requirement
82
82
  none: false
83
83
  requirements:
84
84
  - - ~>
85
85
  - !ruby/object:Gem::Version
86
- version: 1.3.2
86
+ version: 1.2.2
87
87
  type: :runtime
88
88
  prerelease: false
89
89
  version_requirements: !ruby/object:Gem::Requirement
@@ -91,15 +91,15 @@ dependencies:
91
91
  requirements:
92
92
  - - ~>
93
93
  - !ruby/object:Gem::Version
94
- version: 1.3.2
94
+ version: 1.2.2
95
95
  - !ruby/object:Gem::Dependency
96
- name: commander
96
+ name: activesupport
97
97
  requirement: !ruby/object:Gem::Requirement
98
98
  none: false
99
99
  requirements:
100
100
  - - ~>
101
101
  - !ruby/object:Gem::Version
102
- version: 4.1.2
102
+ version: 3.2.3
103
103
  type: :runtime
104
104
  prerelease: false
105
105
  version_requirements: !ruby/object:Gem::Requirement
@@ -107,59 +107,62 @@ dependencies:
107
107
  requirements:
108
108
  - - ~>
109
109
  - !ruby/object:Gem::Version
110
- version: 4.1.2
110
+ version: 3.2.3
111
111
  - !ruby/object:Gem::Dependency
112
- name: mixlib-config
112
+ name: rack-cache
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  none: false
115
115
  requirements:
116
- - - ! '>='
116
+ - - ~>
117
117
  - !ruby/object:Gem::Version
118
- version: '0'
118
+ version: '1.2'
119
119
  type: :runtime
120
120
  prerelease: false
121
121
  version_requirements: !ruby/object:Gem::Requirement
122
122
  none: false
123
123
  requirements:
124
- - - ! '>='
124
+ - - ~>
125
125
  - !ruby/object:Gem::Version
126
- version: '0'
126
+ version: '1.2'
127
127
  - !ruby/object:Gem::Dependency
128
- name: terminal-table
128
+ name: multi_json
129
129
  requirement: !ruby/object:Gem::Requirement
130
130
  none: false
131
131
  requirements:
132
- - - ! '>='
132
+ - - ~>
133
133
  - !ruby/object:Gem::Version
134
- version: '0'
134
+ version: 1.3.2
135
135
  type: :runtime
136
136
  prerelease: false
137
137
  version_requirements: !ruby/object:Gem::Requirement
138
138
  none: false
139
139
  requirements:
140
- - - ! '>='
140
+ - - ~>
141
141
  - !ruby/object:Gem::Version
142
- version: '0'
142
+ version: 1.3.2
143
143
  description:
144
144
  email:
145
145
  - croby@biaprotect.com
146
146
  - pmorton@biaprotect.com
147
147
  executables:
148
- - depend
148
+ - depends
149
149
  extensions: []
150
150
  extra_rdoc_files: []
151
151
  files:
152
- - bin/depend
153
- - lib/depends/cli.rb
152
+ - bin/depends
153
+ - lib/depends/command_factory.rb
154
+ - lib/depends/commands/base.rb
154
155
  - lib/depends/commands/install.rb
155
156
  - lib/depends/commands/list.rb
156
157
  - lib/depends/commands/upload.rb
157
- - lib/depends/commands/versions.rb
158
158
  - lib/depends/config.rb
159
159
  - lib/depends/definition.rb
160
160
  - lib/depends/dsl/depend.rb
161
161
  - lib/depends/exceptions.rb
162
+ - lib/depends/log/formatter.rb
163
+ - lib/depends/log.rb
162
164
  - lib/depends/rest_client.rb
165
+ - lib/depends/server.rb
163
166
  - lib/depends/util.rb
164
167
  - lib/depends.rb
165
168
  - LICENSE
@@ -179,9 +182,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
179
182
  required_rubygems_version: !ruby/object:Gem::Requirement
180
183
  none: false
181
184
  requirements:
182
- - - ! '>'
185
+ - - ! '>='
183
186
  - !ruby/object:Gem::Version
184
- version: 1.3.1
187
+ version: '0'
185
188
  requirements: []
186
189
  rubyforge_project:
187
190
  rubygems_version: 1.8.24
data/bin/depend DELETED
@@ -1,6 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require 'depends'
4
- require 'depends/cli'
5
-
6
-
@@ -1,83 +0,0 @@
1
- require 'commander/import'
2
-
3
- # :name is optional, otherwise uses the basename of this executable
4
- program :name, 'depends'
5
- program :version, '0.2.0'
6
- program :description, 'Simple binary dependency management '
7
-
8
- command :install do |c|
9
- c.syntax = 'install'
10
- c.description = 'Install application dependencies'
11
- c.action do |args,options|
12
- Depends::Commands::Install.new.run
13
- end
14
- end
15
-
16
-
17
- command :list do |c|
18
- c.syntax = 'list'
19
- c.description = 'List application dependencies'
20
- c.action do |args,options|
21
- Depends::Commands::List.new.run
22
- end
23
- end
24
-
25
- command :versions do |c|
26
- c.syntax = 'versions'
27
- c.description = 'List version if an application'
28
- c.action do |args,options|
29
- Depends::Commands::Versions.new.run(args)
30
- end
31
- end
32
-
33
-
34
- command :upload do |c|
35
- c.syntax = 'upload'
36
- c.description = 'Upload a dependency to the server'
37
- c.option '--source DIR', String, 'Directory to be uploaded'
38
- c.option '--name NAME', String, 'Name of the dependency'
39
- c.option '--num VERSION', String, 'Version String'
40
- c.option '--create','Create if does not exist'
41
- c.option '--description', String, 'Description of the dependency'
42
- c.action do |args,options|
43
-
44
- options.source = ask("Source Directory: ") unless options.source
45
- options.name = ask("Dependency Name: ") unless options.dep
46
- options.num = ask("Version Number: ") unless options.num
47
- options.description = ask("Description:") if not options.description and options.create
48
-
49
- Depends::Commands::Upload.new.run(options)
50
- end
51
- end
52
-
53
- command :config do |c|
54
- c.syntax = 'config'
55
- c.description = 'Configure the depends client'
56
- c.option '--key KEY', String, 'The key to use to access the depends server'
57
- c.option '--server SERVER', String, 'The URL of the depends server'
58
- c.option '--cache CACHE', String, 'The path to the folder to use for caching dependencies'
59
- c.option '--overwrite','Overwrite an existing config file'
60
-
61
- c.action do |args,options|
62
- config_file = File.expand_path( '~/.depends/config.rb' )
63
- config_dir = File.dirname(config_file)
64
-
65
- if File.exists? config_file and not options.overwrite
66
- say("Your configuration already exists, please specify --overwrite if you wish to overwrite the existing config")
67
- exit(1)
68
- end
69
-
70
- options.key = ask("Depends server key ") unless options.key
71
-
72
- config_content = ''
73
- config_content << "api_key '#{options.key}'"
74
- config_content << "server '#{options.server}" if options.server
75
- config_content << "cache '#{options.cache}'" if options.cache
76
-
77
- Dir.mkdir config_dir unless File.directory? config_dir
78
-
79
- file = File.new(config_file,'w+')
80
- file.write(config_content)
81
-
82
- end
83
- end
@@ -1,19 +0,0 @@
1
-
2
- module Depends
3
- module Commands
4
- class Versions
5
-
6
- def run(depend)
7
- Depends::Config.load
8
- client = Depends::RestClient.new()
9
- dep = client.get_depend(depend[0])
10
-
11
- headers = ['Version Number','SHA1', 'Publisher Address']
12
- rows = dep['versions'].collect{ |i| [i['number'] ,i['sha1'],i['publisher']] }
13
- table = Terminal::Table.new :title => "Versions for #{depend[0]}", :headings => headers, :rows => rows
14
- puts table
15
- end
16
-
17
- end
18
- end
19
- end