arli 0.5.1 → 0.6.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.
@@ -2,24 +2,29 @@ require 'json'
2
2
  require 'arli'
3
3
  require 'net/http'
4
4
  require_relative 'base'
5
- require_relative '../installers/zip_file'
5
+ require_relative '../installer'
6
6
 
7
7
  module Arli
8
8
  module Commands
9
9
  class Install < Base
10
10
 
11
- def initialize(options)
12
- super(options)
13
- self.arlifile = Arli::ArliFile.new(lib_path: lib_path,
14
- arlifile_path: options[:arli_dir])
11
+ attr_accessor :arlifile
12
+
13
+ def initialize(*args)
14
+ super(*args)
15
15
  end
16
16
 
17
- def run
18
- arlifile.each_dependency do |lib|
19
- Arli::Installer.new(lib: lib, command: self).install
20
- end
17
+ def setup
18
+ self.arlifile = Arli::ArliFile.new(config: config)
19
+ end
20
+
21
+ def params
22
+ arlifile.file
21
23
  end
22
24
 
25
+ def run
26
+ arlifile.each_dependency { |lib| lib.install }
27
+ end
23
28
  end
24
29
  end
25
30
  end
@@ -6,6 +6,7 @@ require 'arli/commands/base'
6
6
  require 'arli/errors'
7
7
  require 'arduino/library'
8
8
  require 'awesome_print'
9
+
9
10
  module Arli
10
11
  module Commands
11
12
  class Search < Base
@@ -13,41 +14,65 @@ module Arli
13
14
 
14
15
  attr_accessor :search_string,
15
16
  :search_opts,
17
+ :results,
16
18
  :limit,
17
19
  :database
18
20
 
19
- def initialize(options)
20
- super(options)
21
- self.search_string = options[:argv].first
21
+ def initialize(*args)
22
+ super(*args)
23
+ end
24
+
25
+ def setup
26
+ search = runtime.argv.first
22
27
 
23
- puts "using search string [#{search_string}]" if search_string && Arli.debug?
24
- self.limit = options[:limit] || 100
28
+ self.search_string = if search =~ /:/
29
+ search
30
+ elsif search
31
+ "name: /#{search}/"
32
+ end
25
33
 
26
- raise Arli::Errors::InvalidSyntaxError, 'Please provide search string after the "search" command' \
27
- unless search_string
34
+ self.limit = config.search.results.limit
35
+
36
+ unless search_string
37
+ raise Arli::Errors::InvalidSyntaxError,
38
+ 'Please provide search string after the "search" command'
39
+ end
28
40
 
29
41
  begin
30
42
  self.search_opts = eval("{ #{search_string} }")
31
43
  rescue => e
32
44
  raise Arli::Errors::InvalidSyntaxError, "Search string '#{search_string}' is invalid.\n" +
33
- e.message.red
45
+ e.message.red
34
46
  end
35
47
 
36
48
  unless search_opts.is_a?(::Hash) && search_opts.size > 0
37
49
  raise Arli::Errors::InvalidSyntaxError, "Search string '#{search_string}' did not eval to Hash.\n"
38
50
  end
39
51
 
40
- self.database = options[:database] ? db_from(option[:database]) : db_default
52
+ self.database = db_default
41
53
 
42
54
  search_opts.merge!(limit: limit) if limit && limit > 0
55
+ search_opts.delete(:limit) if limit == 0
43
56
  end
44
57
 
45
58
  def run
46
- ap search(database, **search_opts).map(&:to_hash)
59
+ self.results = search(database, **search_opts)
60
+ results.map do |lib|
61
+ puts pretty_library(lib)
62
+ end
63
+ puts "\nTotal matches: #{results.size.to_s.bold.magenta}"
47
64
  rescue Exception => e
48
65
  error e
49
66
  puts e.backtrace.join("\n") if ENV['DEBUG']
50
67
  end
68
+
69
+ def pretty_library(lib, **options)
70
+ "#{lib.name.bold.blue} (#{lib.version.yellow}), by #{lib.author.magenta}"
71
+ end
72
+
73
+ def params
74
+ search_opts
75
+ end
51
76
  end
52
77
  end
53
78
  end
@@ -0,0 +1,62 @@
1
+ require 'dry-configurable'
2
+ require 'arduino/library'
3
+ require 'yaml'
4
+
5
+ module Arli
6
+ class Configuration
7
+
8
+ DEFAULT_FILENAME = 'Arlifile'.freeze
9
+ ACTIONS_WHEN_EXISTS = %i(backup overwrite abort)
10
+ ARLI_COMMAND = 'arli'.freeze
11
+
12
+ extend Dry::Configurable
13
+
14
+ # These are populated during the parsing of the params
15
+ setting :runtime do
16
+ setting :argv
17
+ setting :command do
18
+ setting :name
19
+ setting :instance
20
+ end
21
+ end
22
+
23
+ setting :libraries do
24
+ setting :path, ::Arduino::Library::DefaultDatabase.library_path
25
+ end
26
+
27
+ setting :database do
28
+ setting :path, ::Arduino::Library::DefaultDatabase.library_index_path
29
+ setting :url, ::Arduino::Library::DefaultDatabase.library_index_url
30
+ end
31
+
32
+ setting :arlifile do
33
+ setting :path, ::Dir.pwd
34
+ setting :name, ::Arli::Configuration::DEFAULT_FILENAME
35
+ end
36
+
37
+ setting :search do
38
+ setting :default_field, :name
39
+ setting :results do
40
+ setting :limit, 100
41
+ setting :format, :inspect
42
+ end
43
+ end
44
+
45
+ setting :install do
46
+ setting :library
47
+ setting :if_exists do
48
+ setting :overwrite, true
49
+ setting :backup, false
50
+ setting :abort, false
51
+ end
52
+ end
53
+
54
+ setting :debug, ENV['ARLI_DEBUG'] || false
55
+ setting :trace, false
56
+ setting :verbose, false
57
+ setting :help, false
58
+ setting :command_help, false
59
+ end
60
+ end
61
+
62
+
@@ -0,0 +1,9 @@
1
+ class String
2
+ def underscore
3
+ self.gsub(/::/, '/').
4
+ gsub(/([A-Z]+)([A-Z][a-z])/, '\1_\2').
5
+ gsub(/([a-z\d])([A-Z])/, '\1_\2').
6
+ tr('-', '_').
7
+ downcase
8
+ end
9
+ end
@@ -1,100 +1,52 @@
1
- require 'arli'
2
1
  require 'forwardable'
2
+ require 'arli'
3
+ require_relative 'actions'
4
+
3
5
  module Arli
4
6
  class Installer
5
- extend Forwardable
6
- attr_accessor :lib, :lib_dir, :lib_path, :command
7
+ include ::Arli::Output
7
8
 
8
- def_delegators :@command, :info, :error, :debug
9
+ extend Forwardable
10
+ def_delegators :@library, :exists?
9
11
 
10
- def initialize(lib:, command:, lib_path: Arli.library_path)
11
- self.lib = lib
12
- self.command = command
13
- self.lib_dir = lib.name.gsub(/ /, '_')
14
- self.lib_path = lib_path
15
- end
12
+ attr_accessor :library, :config
16
13
 
17
- def exists?
18
- Dir.exist?(target_lib_path)
14
+ def initialize(library, config: Arli.config)
15
+ self.config = config
16
+ self.library = library
19
17
  end
20
18
 
21
19
  def install
22
- action = self.exists? ? 'replacing' : 'installing'
23
- backup! if command.create_backup
24
- abort! if exists? && command.abort_if_exists
20
+ ___ "#{library.name.blue} "
25
21
 
26
- s "#{action} #{lib.name.blue}"
27
- library = ::Arduino::Library::Resolver.resolve(lib)
28
-
29
- if library.nil?
30
- s ' ❌ ' + "\n"
22
+ if library.nil? && library.library.nil?
23
+ ___ ' (no library) '
24
+ fuck
31
25
  elsif library.url.nil?
32
- s ' ' + "\n"
26
+ ___ ' (no url) '
27
+ fuck
33
28
  else
34
- s "(#{library.version.blue})" if library.version
35
- s '✔ '.bold.green
36
- if library.url =~ /\.zip$/i
37
- s 'unpacking zip...'
38
- Arli::Installers::ZipFile.new(lib: library).install
39
- s '✔ '.bold.green
40
- else
41
- c = exists? ? git_update_command : git_clone_command
42
- s 'running git...'
43
- execute(c)
44
- s '✔ '.bold.green
29
+ ___ "(#{library.version.green}) " if library.version
30
+ actions(library).each do |action|
31
+ run_action(action)
45
32
  end
46
33
  end
47
- s nil, true
48
- end
49
-
50
-
51
- def git_update_command
52
- "cd #{lib_dir} && git pull --rebase 2>&1"
53
- end
54
-
55
- def git_clone_command
56
- "git clone -v #{lib.url} #{lib_dir} 2>&1"
57
- end
58
-
59
- def backup_lib_path
60
- target_lib_path + ".#{Time.now.strftime('%Y%m%d%H%M%S')}"
34
+ ___ "\n"
61
35
  end
62
36
 
63
- def target_lib_path
64
- "#{lib_path}/#{lib_dir}"
37
+ def run_action(action)
38
+ klass = Arli::Actions.action(action)
39
+ klass.new(library, config: config).act if klass
65
40
  end
66
41
 
67
- def backup!
68
- FileUtils.cp_r(target_lib_path, backup_lib_path) if exists?
42
+ def actions(library)
43
+ actions = []
44
+ actions << :backup if exists?
45
+ # First, how do we get the library?
46
+ actions << ((library.url =~ /\.zip$/i) ? :zip_file : :git_repo)
47
+ actions << :dir_name
48
+ actions
69
49
  end
70
-
71
- def abort!
72
- raise Arli::Errors::LibraryAlreadyExists,
73
- "Library #{target_lib_path} already exists!"
74
- end
75
-
76
- def s(msg, newline = false)
77
- printf msg + ' ' if msg
78
- puts if newline
79
- end
80
-
81
- protected
82
-
83
- # @param <String> *args — list of arguments or a single string
84
- def execute(*args)
85
- cmd = args.join(' ')
86
- raise 'No command to run was given' unless cmd
87
- info("\n" + cmd.green) if self.debug
88
- o, e, s = Open3.capture3(cmd)
89
- info("\n" + o) if o if self.debug
90
- info("\n" + e.red) if e && self.debug
91
- s
92
- rescue Exception => e
93
- error "Error running [#{args.join(' ')}]\n" +
94
- "Current folder is [#{Dir.pwd.yellow}]", e
95
- raise e
96
- end
97
-
98
50
  end
99
51
  end
100
52
 
@@ -0,0 +1,49 @@
1
+ require_relative 'installer'
2
+
3
+ module Arli
4
+ class Library
5
+ attr_accessor :lib, :config, :canonical_dir
6
+
7
+ def initialize(lib, config: Arli.config)
8
+ self.lib = lib
9
+ self.config = config
10
+ end
11
+
12
+ def install
13
+ Arli::Installer.new(self).install
14
+ end
15
+
16
+ def rm_rf!
17
+ FileUtils.rm_rf(dir)
18
+ end
19
+
20
+ def libraries_home
21
+ config.libraries.path
22
+ end
23
+
24
+ def dir
25
+ lib.name.gsub(/ /, '_')
26
+ end
27
+
28
+ def path
29
+ libraries_home + '/' + dir
30
+ end
31
+
32
+ def canonical_path
33
+ libraries_home + '/' + canonical_dir
34
+ end
35
+
36
+ def exists?
37
+ Dir.exist?(path)
38
+ end
39
+
40
+ def method_missing(method, *args, &block)
41
+ if lib && lib.respond_to?(method)
42
+ lib.send(method, *args, &block)
43
+ else
44
+ super(method, *args, &block)
45
+ end
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,94 @@
1
+ require 'colored2'
2
+
3
+ module Arli
4
+ module Output
5
+
6
+ class << self
7
+ attr_accessor :enabled
8
+ def enable!
9
+ self.enabled = true
10
+ end
11
+ def enabled?
12
+ self.enabled
13
+ end
14
+ def disable!
15
+ self.enabled = false
16
+ end
17
+ end
18
+
19
+ self.enable!
20
+
21
+ def info(msg, header = nil)
22
+ __pf('%-20s', header.blue) if header
23
+ __pf((header ? ' : ' : '') + msg + "\n") if msg
24
+ end
25
+
26
+ def debug(msg)
27
+ __pf('%-20s', header.blue) if header
28
+ __pf((header ? ' : ' : '') + msg + "\n") if msg
29
+ end
30
+
31
+ def error(msg, exception = nil)
32
+ __pf "#{msg.to_s.red}\n" if msg
33
+ __pf "#{exception.inspect.red}\n\n" if exception
34
+ end
35
+
36
+ def report_exception(e, header = nil)
37
+ __pf header.bold.yellow + ': ' if header
38
+ error e.message if (e && e.respond_to?(:message))
39
+ if e && Arli.config.trace
40
+ __pf e.backtrace.reverse.join("\n")
41
+ elsif e
42
+ __pf "\nUse -t (--trace) for detailed exception\n" +
43
+ "or -D (--debug) to print Arli config\n"
44
+ end
45
+ end
46
+
47
+ def raise_invalid_arli_command!(cmd, e = nil)
48
+ raise Arli::Errors::InvalidCommandError.new(cmd)
49
+ end
50
+
51
+ # Shortcuts disabled in tests
52
+ def ___(msg = nil, newline = false)
53
+ return unless Arli::Output.enabled?
54
+ __pf msg if msg
55
+ __p '.'.green if msg.nil?
56
+ __pt if newline
57
+ end
58
+
59
+ def __pt(*args)
60
+ puts(*args) if Arli::Output.enabled?
61
+ end
62
+
63
+ def __p(*args)
64
+ print(*args) if Arli::Output.enabled?
65
+ end
66
+
67
+ def __pf(*args)
68
+ printf(*args) if Arli::Output.enabled?
69
+ end
70
+
71
+ def ok
72
+ ___ '.'.bold.green
73
+ end
74
+
75
+ def fuck
76
+ ___ '✖'.bold.red
77
+ end
78
+
79
+ def header(command: nil)
80
+ out = "\n#{hr}\n"
81
+ out << "Arli (#{::Arli::VERSION.yellow})"
82
+ out << " running #{command.name.to_s.magenta.bold}" if command
83
+ out << " for #{command.params.to_s.blue}\n" if command
84
+ out << "Library Path: #{Arli.default_library_path.green}\n"
85
+ out << "#{hr}\n"
86
+ info out
87
+ end
88
+
89
+ def hr
90
+ '——————————————————————————————————————————————————————————'.red
91
+ end
92
+
93
+ end
94
+ end