qas 1.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: afc9a95cd6ed2302619ac4f6b3b2faa3c0697ab43b5294aa4e56b3b30e911d00
4
+ data.tar.gz: bc22a9f7fb23ac3e6ead7b641b9a728c483d36b36f1a96f557065fd1ed376405
5
+ SHA512:
6
+ metadata.gz: d3e660ed349fd2e51698f908fcb8b3391b5e88ae9bb9d6f2a8bcb0709ddae2883a9095ba93602c473acdb09a843e273957c5a27d214a2d36d76cda7ad876d226
7
+ data.tar.gz: 113dade5770939ff258ca7f6586bfd92c9e7418085ce9f731fadd1c052cabc8beb41cb19ba498c9b0f5f2489eb6a00a0b3a732b06759434af262a5831ca58f4b
data/exe/qas ADDED
@@ -0,0 +1,52 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../lib/info'
5
+ require_relative '../lib/qas'
6
+
7
+ module Cli
8
+ attr_accessor :action, :args
9
+
10
+ def self.options
11
+ require 'optparse'
12
+
13
+ OptionParser.new do |parser|
14
+ parser.banner = Qas::DESCRIPTION
15
+
16
+ parser.on('-v', '--version', 'project information') do
17
+ print Qas::VERSION
18
+ exit!
19
+ end
20
+
21
+ parser.on('-g', '--grab', 'grab floss projects') do
22
+ @action = :grab
23
+ end
24
+
25
+ parser.on('-a', '--archive NAMES', Array, 'archive floss projects listed on NAMES') do |names|
26
+ @names = names
27
+ @action = :archive
28
+ end
29
+ end
30
+ end
31
+
32
+ def self.start
33
+ options.parse! ['--help'] if ARGV.empty?
34
+
35
+ begin
36
+ options.parse!
37
+ rescue OptionParser::MissingArgument
38
+ puts <<~ERROR
39
+ --archive NAMES
40
+
41
+ Missing NAMES of projects!'
42
+ ERROR
43
+ exit!
44
+ rescue OptionParser::InvalidOption
45
+ options.parse! ['--help']
46
+ end
47
+
48
+ Qas::Main.new(@action, @names).run
49
+ end
50
+ end
51
+
52
+ Cli.start
data/lib/info.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Easily manage floss repositories.
4
+ module Qas
5
+ VERSION = '1.5.0'
6
+ DESCRIPTION = 'Easily manage floss repositories.'
7
+ URL = 'https://github.com/easbarba/qas'
8
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ # TODO: if project is not present, clone it!
6
+
7
+ module Qas
8
+ # Archive FLOSS Projects
9
+ class Archive
10
+ # Format to be compressed
11
+ attr_reader :format
12
+
13
+ # FLOSS Projects elected to be archived
14
+ attr_reader :names
15
+
16
+ # project
17
+ attr_reader :project
18
+
19
+ # Folder to store compressed projects
20
+ ARCHIVED = Pathname.new(File.join(Dir.home, 'Downloads', 'archived'))
21
+
22
+ def initialize(project, names, fmt = 'tar')
23
+ @project = project
24
+ @names = names
25
+ @format = fmt
26
+ @fullpath = "#{ARCHIVED.join(project.name)}.#{@format}"
27
+ end
28
+
29
+ # Archiving FLOSS project
30
+ def archive
31
+ require 'git'
32
+
33
+ Utils.spin(project.name) do
34
+ repo = Git.open project.folder
35
+ repo.archive repo.current_branch, @fullpath, format: @format # TODO: fiber/multithread
36
+ end
37
+
38
+ puts # a bit more of space
39
+ end
40
+
41
+ # create archived folder
42
+ def mkfolder
43
+ require 'fileutils'
44
+ FileUtils.mkdir_p ARCHIVED unless ARCHIVED.exist?
45
+ end
46
+
47
+ def info
48
+ print "#{project.name} > #{@fullpath}"
49
+ end
50
+
51
+ def run
52
+ return unless names.include? project.name
53
+
54
+ mkfolder
55
+ info
56
+ archive
57
+ end
58
+ end
59
+ end
data/lib/qas/config.rb ADDED
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'csv'
4
+ require 'pathname'
5
+ require 'uri'
6
+
7
+ # TODO: Delay parsing file till just finally needed
8
+ # TODO: Check if file match expect structure
9
+ # TODO: check if file is empty
10
+
11
+ module Qas
12
+ # List all config available
13
+ class Config
14
+ def parse(file, lang)
15
+ [].tap do |x|
16
+ CSV.read(file, headers: true).by_row.each do |project|
17
+ name = project['name']
18
+ branch = project['branch']
19
+ url = URI project['url']
20
+
21
+ x << Info.new(name, branch, url, lang.to_s)
22
+ end
23
+ end
24
+ end
25
+
26
+ def found
27
+ files = Pathname.new(File.join(Dir.home, '.config', 'qas'))
28
+
29
+ [].tap do |x|
30
+ # Check if config does not exist if a symlink
31
+ files.children.each do |y|
32
+ x << y if y.exist?
33
+ end
34
+ end
35
+ end
36
+
37
+ # returns all parsed items
38
+ def items
39
+ {}.tap do |x|
40
+ found.each do |file|
41
+ lang = file.basename.sub_ext('').to_s.to_sym
42
+ x[lang] = parse file, lang
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
data/lib/qas/grab.rb ADDED
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'git'
4
+
5
+ module Qas
6
+ # Grab FLOSS Projects
7
+ class Grab
8
+ attr_reader :project
9
+
10
+ def initialize(project)
11
+ @project = project
12
+ end
13
+
14
+ def pull
15
+ Utils.spin(project.name) do
16
+ repo = Git.open project.folder
17
+ repo.pull 'origin', repo.current_branch
18
+ end
19
+ end
20
+
21
+ def clone
22
+ Utils.spin(project.name) do
23
+ Git.clone project.url, project.folder
24
+ end
25
+ end
26
+
27
+ # Cloning/Pulling FLOSS Project
28
+ def run
29
+ project.folder.join('.git').exist? ? pull : clone
30
+ end
31
+ end
32
+ end
data/lib/qas/info.rb ADDED
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'pathname'
4
+
5
+ module Qas
6
+ # Project Information
7
+ class Info
8
+ ROOT = Pathname.new(File.join(Dir.home, 'Projects'))
9
+
10
+ # project name
11
+ attr_reader :name
12
+
13
+ # project git branch
14
+ attr_reader :branch
15
+
16
+ # project uri
17
+ attr_reader :url
18
+
19
+ # project folder
20
+ attr_reader :folder
21
+
22
+ def initialize(name, branch, url, language)
23
+ @name = name
24
+ @branch = branch
25
+ @url = url
26
+ @folder = ROOT.join(language, name)
27
+ end
28
+
29
+ def to_s
30
+ <<~INFO
31
+ #{name}
32
+ INFO
33
+ end
34
+ end
35
+ end
data/lib/qas/main.rb ADDED
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Qas
4
+ # Main start point
5
+ class Main
6
+ class GitMustBeAvailable < StandardError; end
7
+
8
+ attr_reader :folders, :utils, :command, :projects
9
+
10
+ def initialize(command, names = nil)
11
+ @command = command
12
+ @names = names
13
+ end
14
+
15
+ def projects
16
+ c = Config.new
17
+ c.items
18
+ end
19
+
20
+ def current_project
21
+ projects.each do |_, repos|
22
+ repos.each do |project|
23
+ yield project if block_given?
24
+ end
25
+ end
26
+ end
27
+
28
+ def actions
29
+ {
30
+ grab: ->(project) { Grab.new(project) }.curry,
31
+ archive: ->(project) { Archive.new(project, @names) }.curry
32
+ }
33
+ end
34
+
35
+ def run
36
+ raise GitMustBeAvailable, 'Git was not found!' unless Utils.which?('git').any?
37
+
38
+ current_project do |project|
39
+ actions[command].call(project).run
40
+ end
41
+ end
42
+ end
43
+ end
data/lib/qas/utils.rb ADDED
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Qas
4
+ # General Utilities.
5
+ module Utils
6
+ # Spin for me, dear.
7
+ def self.spin(project)
8
+ require 'tty-spinner'
9
+
10
+ spinner = TTY::Spinner.new("#{project} :spinner ", format: :dots_6)
11
+ spinner.auto_spin
12
+
13
+ yield
14
+
15
+ spinner.success
16
+ end
17
+
18
+ # prints external executable location
19
+ def self.which?(executable)
20
+ require 'pathname'
21
+
22
+ [].tap do |x|
23
+ ENV['PATH'].split(File::PATH_SEPARATOR) do |directory|
24
+ exec = Pathname.new(directory).join executable.to_s
25
+
26
+ x << exec.to_path if exec.file?
27
+ end
28
+ end.uniq
29
+ end
30
+ end
31
+ end
data/lib/qas.rb ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'qas/archive'
4
+ require_relative 'qas/grab'
5
+ require_relative 'qas/main'
6
+ require_relative 'qas/info'
7
+ require_relative 'qas/config'
8
+ require_relative 'qas/utils'
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: qas
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.5.0
5
+ platform: ruby
6
+ authors:
7
+ - easbarba
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2022-05-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: git
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: tty-spinner
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 0.9.3
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 0.9.3
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '13.0'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 13.0.6
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '13.0'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 13.0.6
61
+ - !ruby/object:Gem::Dependency
62
+ name: reek
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '6.1'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 6.1.1
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '6.1'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 6.1.1
81
+ - !ruby/object:Gem::Dependency
82
+ name: rspec
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '3.11'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '3.11'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rubocop
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '1.29'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '1.29'
109
+ - !ruby/object:Gem::Dependency
110
+ name: rufo
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: 0.13.0
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: 0.13.0
123
+ description:
124
+ email:
125
+ - easbarba@outlook.com
126
+ executables:
127
+ - qas
128
+ extensions: []
129
+ extra_rdoc_files: []
130
+ files:
131
+ - exe/qas
132
+ - lib/info.rb
133
+ - lib/qas.rb
134
+ - lib/qas/archive.rb
135
+ - lib/qas/config.rb
136
+ - lib/qas/grab.rb
137
+ - lib/qas/info.rb
138
+ - lib/qas/main.rb
139
+ - lib/qas/utils.rb
140
+ homepage: https://github.com/easbarba/qas
141
+ licenses:
142
+ - gpl-v3
143
+ metadata:
144
+ homepage_uri: https://github.com/easbarba/qas
145
+ post_install_message:
146
+ rdoc_options: []
147
+ require_paths:
148
+ - lib
149
+ required_ruby_version: !ruby/object:Gem::Requirement
150
+ requirements:
151
+ - - ">="
152
+ - !ruby/object:Gem::Version
153
+ version: '2.7'
154
+ required_rubygems_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ requirements: []
160
+ rubygems_version: 3.3.5
161
+ signing_key:
162
+ specification_version: 4
163
+ summary: Easily manage floss repositories.
164
+ test_files: []