cejo 0.0.5
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.
- checksums.yaml +7 -0
- data/.gitignore +13 -0
- data/.rspec +3 -0
- data/.rubocop.yml +0 -0
- data/.rufo +3 -0
- data/.travis.yml +6 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +6 -0
- data/INSTALL +2 -0
- data/LICENSE +674 -0
- data/README.org +23 -0
- data/README.rdoc +28 -0
- data/Rakefile +6 -0
- data/annotations/legacy.org +11 -0
- data/annotations/todo.org +54 -0
- data/bin/console +14 -0
- data/bin/setup +9 -0
- data/cejo.gemspec +50 -0
- data/cejo.rdoc +5 -0
- data/exe/cejo +298 -0
- data/lib/cejo.rb +42 -0
- data/lib/cejo/distro/base.rb +52 -0
- data/lib/cejo/distro/commands.rb +26 -0
- data/lib/cejo/distro/current_packager.rb +18 -0
- data/lib/cejo/distro/help.rb +9 -0
- data/lib/cejo/distro/need.rb +32 -0
- data/lib/cejo/distro/parsed_commands.rb +23 -0
- data/lib/cejo/distro/translate_action.rb +11 -0
- data/lib/cejo/floss/archive.rb +49 -0
- data/lib/cejo/floss/core.rb +55 -0
- data/lib/cejo/floss/grab.rb +44 -0
- data/lib/cejo/floss/project_info.rb +28 -0
- data/lib/cejo/media/get.rb +54 -0
- data/lib/cejo/media/play.rb +45 -0
- data/lib/cejo/ops/brightness.rb +37 -0
- data/lib/cejo/ops/dots.rb +98 -0
- data/lib/cejo/ops/homey.rb +76 -0
- data/lib/cejo/ops/screenshot.rb +78 -0
- data/lib/cejo/ops/sysinfo.rb +27 -0
- data/lib/cejo/ops/volume/sound_manager.rb +45 -0
- data/lib/cejo/ops/volume/volume.rb +117 -0
- data/lib/cejo/projects/builder.rb +138 -0
- data/lib/cejo/projects/dwm.rb +23 -0
- data/lib/cejo/projects/emacs.rb +23 -0
- data/lib/cejo/projects/ruby.rb +23 -0
- data/lib/cejo/projects/st.rb +23 -0
- data/lib/cejo/services/folders.rb +21 -0
- data/lib/cejo/services/utils.rb +54 -0
- data/lib/cejo/version.rb +5 -0
- data/lib/tasks/list.rake +7 -0
- data/lib/tasks/man.rake +7 -0
- data/lib/tasks/spec.rake +5 -0
- data/lib/tasks/test.rake +7 -0
- data/man/cejo.1.ronn +0 -0
- data/spec/distro/action_spec.rb +21 -0
- data/spec/distro/base_spec.rb +67 -0
- data/spec/distro/commands_spec.rb +22 -0
- data/spec/distro/current_packager_spec.rb +17 -0
- data/spec/distro/need_spec.rb +22 -0
- data/spec/floss/archive_spec.rb +1 -0
- data/spec/floss/core_spec.rb +1 -0
- data/spec/floss/grab_spec.rb +1 -0
- data/spec/media/get_spec.rb +20 -0
- data/spec/media/play_spec.rb +41 -0
- data/spec/ops/ops_brightness_spec.rb +16 -0
- data/spec/ops/ops_volume_spec.rb +22 -0
- data/spec/spec_helper.rb +96 -0
- data/spec/utils_spec.rb +18 -0
- data/test/test_cejo.rb +16 -0
- data/test/test_distro_base.rb +13 -0
- data/test/test_floss.rb +13 -0
- data/test/test_media_get.rb +0 -0
- data/test/test_media_play.rb +0 -0
- data/test/test_ops_brightness.rb +0 -0
- data/test/test_ops_dots.rb +0 -0
- data/test/test_ops_homer.rb +0 -0
- data/test/test_ops_oss.rb +18 -0
- data/test/test_ops_screenshot.rb +0 -0
- data/test/test_ops_sysinfo.rb +0 -0
- data/test/test_ops_volume.rb +0 -0
- data/test/test_projects_builder.rb +0 -0
- data/test/test_projects_emacs.rb +0 -0
- metadata +468 -0
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
# Provide system media interaction.
|
5
|
+
module Media
|
6
|
+
# Play file, random media in folder or with url.
|
7
|
+
class Play
|
8
|
+
PLAYER = 'mpv'.freeze
|
9
|
+
PLAYER_CONFIG = '--no-config --no-audio-display'.freeze
|
10
|
+
PLAYER_FORMAT = '--ytdl-format="bestvideo[height<=?1080]+bestaudio/best"'.freeze
|
11
|
+
|
12
|
+
attr_reader :media
|
13
|
+
|
14
|
+
def initialize(media)
|
15
|
+
@media = media
|
16
|
+
end
|
17
|
+
|
18
|
+
def pick_random_media_in_folder(folder)
|
19
|
+
file = folder.children.sample
|
20
|
+
folder.join(file).to_path
|
21
|
+
end
|
22
|
+
|
23
|
+
def pick_media
|
24
|
+
filepath = Pathname.new(media)
|
25
|
+
return filepath.to_path if filepath.file?
|
26
|
+
return pick_random_media_in_folder(filepath) if filepath.directory?
|
27
|
+
return media
|
28
|
+
end
|
29
|
+
|
30
|
+
public
|
31
|
+
|
32
|
+
def player_settings
|
33
|
+
"#{PLAYER} #{PLAYER_CONFIG} #{PLAYER_FORMAT}"
|
34
|
+
end
|
35
|
+
|
36
|
+
def final_command
|
37
|
+
"#{player_settings} #{pick_media}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def run
|
41
|
+
system final_command
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Manage System brightness.
|
6
|
+
class Brightness
|
7
|
+
STEP = 5
|
8
|
+
BRIGHTER = 'brightnessctl'
|
9
|
+
|
10
|
+
attr_reader :state, :step
|
11
|
+
|
12
|
+
def initialize(state)
|
13
|
+
@state = state
|
14
|
+
end
|
15
|
+
|
16
|
+
def states
|
17
|
+
{
|
18
|
+
up: "set #{STEP}%+",
|
19
|
+
down: "set #{STEP}%-",
|
20
|
+
}
|
21
|
+
end
|
22
|
+
|
23
|
+
def action
|
24
|
+
states[state.to_sym]
|
25
|
+
end
|
26
|
+
|
27
|
+
def final_command
|
28
|
+
"#{BRIGHTER} #{action}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def run
|
32
|
+
@state = state.to_sym if %w[up down].include? state
|
33
|
+
system(action)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,98 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'pathname'
|
4
|
+
require 'find'
|
5
|
+
|
6
|
+
module Cejo
|
7
|
+
module Ops
|
8
|
+
# Mirror Lar files in $HOME.
|
9
|
+
class Dots
|
10
|
+
attr_reader :root, :ignore_these, :utils, :home, :target_link
|
11
|
+
|
12
|
+
def initialize(utils, root)
|
13
|
+
@utils = utils
|
14
|
+
@root = Pathname.new root if root
|
15
|
+
@home = Pathname.new(Dir.home)
|
16
|
+
@target_link = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def root_files_folders
|
20
|
+
files = []
|
21
|
+
folders = []
|
22
|
+
|
23
|
+
Find.find(root) do |file|
|
24
|
+
file = Pathname.new file
|
25
|
+
next if file.to_path.include? '.git'
|
26
|
+
next if file == root
|
27
|
+
|
28
|
+
files << file if file.file?
|
29
|
+
folders << file if file.directory?
|
30
|
+
end
|
31
|
+
|
32
|
+
{ folders: folders, files: files }
|
33
|
+
end
|
34
|
+
|
35
|
+
# transform origin file absolute path with home as its root instead
|
36
|
+
# /a/b/c.tar --> /home/b/c.tar
|
37
|
+
def to_home(this)
|
38
|
+
origin = this.to_path
|
39
|
+
homey = home.to_path.concat('/')
|
40
|
+
result = origin.gsub(root.to_path, homey)
|
41
|
+
Pathname.new(result)
|
42
|
+
end
|
43
|
+
|
44
|
+
# Create only the folders, if those do not exist
|
45
|
+
def make_folders
|
46
|
+
root_files_folders[:folders].each do |fld|
|
47
|
+
folder = to_home fld
|
48
|
+
next if folder.exist?
|
49
|
+
|
50
|
+
puts folder
|
51
|
+
folder.mkdir
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
def feed_target_link
|
56
|
+
root_files_folders[:files].each do |target|
|
57
|
+
next if ignored_ones.include? target.basename.to_s
|
58
|
+
|
59
|
+
symlink_name = to_home target
|
60
|
+
target_link.store(target, symlink_name)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# Move file from home to a /home/backup/{file}
|
65
|
+
# or delete it if the file it is pointing does not exist
|
66
|
+
def backup_this(this)
|
67
|
+
warn "WARNING: #{this} found! Deleting/Moving it."
|
68
|
+
this.delete if this.exist? # TODO: if file exist back/delete up it
|
69
|
+
end
|
70
|
+
|
71
|
+
def backup_files
|
72
|
+
target_link.each do |target, link_name|
|
73
|
+
puts "#{target} ❯ #{link_name}"
|
74
|
+
backup_this link_name
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def symlink_files
|
79
|
+
target_link.each do |target, link_name|
|
80
|
+
puts "#{target} ❯ #{link_name}"
|
81
|
+
link_name.make_symlink target # As enumerator yielding folder to symlink
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# ignore these ones
|
86
|
+
def ignored_ones
|
87
|
+
['LICENSE', root.join('.git').to_path.to_s].freeze
|
88
|
+
end
|
89
|
+
|
90
|
+
def run
|
91
|
+
feed_target_link
|
92
|
+
make_folders
|
93
|
+
backup_files
|
94
|
+
symlink_files
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Mirror user DATA partition folders to $HOME
|
6
|
+
class Homey
|
7
|
+
IGNORE_THESE = %w[.Trash-1000 lost+found].freeze
|
8
|
+
|
9
|
+
attr_reader :root, :target_link
|
10
|
+
|
11
|
+
def initialize(root)
|
12
|
+
@root = root
|
13
|
+
end
|
14
|
+
|
15
|
+
# Confirms if root is a folder or return w/ exeception
|
16
|
+
def root_exist?
|
17
|
+
r = Pathname.new root
|
18
|
+
r.exist?
|
19
|
+
end
|
20
|
+
|
21
|
+
def folders_found
|
22
|
+
folders_found = {}
|
23
|
+
home = Pathname.new(Dir.home)
|
24
|
+
|
25
|
+
root.each_child do |folder|
|
26
|
+
next if IGNORE_THESE.include? folder.basename.to_s
|
27
|
+
|
28
|
+
folders_found[folder] = home.join(folder.basename)
|
29
|
+
end
|
30
|
+
|
31
|
+
folders_found
|
32
|
+
end
|
33
|
+
|
34
|
+
# Remove $HOME folders found in DATA
|
35
|
+
def cleanup_home
|
36
|
+
target_link.each_key do |link_name|
|
37
|
+
link_name.delete if link_name.exist?
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def symlink_folders
|
42
|
+
target_link.each do |target, link_name|
|
43
|
+
File.symlink(target, link_name)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# def show_info
|
48
|
+
# print "root folder".blue, ": ", root, "\n\n"
|
49
|
+
|
50
|
+
# cleanup_home do |link_name|
|
51
|
+
# print "Warning".red, ": ", "#{link_name}".green, " folder found, removing it!", "\n"
|
52
|
+
# end
|
53
|
+
|
54
|
+
# puts
|
55
|
+
|
56
|
+
# symlink_folders do |target, link_name|
|
57
|
+
# print "#{target}".yellow, " --> ", "#{link_name}".green, "\n"
|
58
|
+
# end
|
59
|
+
# end
|
60
|
+
|
61
|
+
def run
|
62
|
+
unless root_exist?
|
63
|
+
print "No such a directory '#{root}' exist! Exiting."
|
64
|
+
exit!
|
65
|
+
end
|
66
|
+
@root = Pathname root
|
67
|
+
@target_link = folders_found
|
68
|
+
# show_info
|
69
|
+
cleanup_home
|
70
|
+
symlink_folders
|
71
|
+
end
|
72
|
+
|
73
|
+
public :run
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Take a shot of the marvelous screen
|
6
|
+
class Screenshot
|
7
|
+
def self.folder
|
8
|
+
Pathname.new(Dir.home).join('Pictures') # TODO: Check if folder exist
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.current_time
|
12
|
+
Time.new.strftime('%d-%m-%y-%k-%M')
|
13
|
+
end
|
14
|
+
|
15
|
+
attr_reader :utils, :mode
|
16
|
+
|
17
|
+
def initialize(utils, mode)
|
18
|
+
@utils = utils
|
19
|
+
@mode = mode.to_sym if mode
|
20
|
+
end
|
21
|
+
|
22
|
+
def shotters
|
23
|
+
[flameshot, scrot, maim]
|
24
|
+
end
|
25
|
+
|
26
|
+
def shotters_available
|
27
|
+
shotters.find { |shotter| utils.which?(shotter[:exec]) }
|
28
|
+
end
|
29
|
+
|
30
|
+
def shotter
|
31
|
+
shotters_available.first
|
32
|
+
end
|
33
|
+
|
34
|
+
def scrot
|
35
|
+
{
|
36
|
+
exec: 'scrot',
|
37
|
+
full: '--focused --silent',
|
38
|
+
partial: '--select --silent',
|
39
|
+
folder: folder.join(screenshot_name),
|
40
|
+
}
|
41
|
+
end
|
42
|
+
|
43
|
+
def flameshot
|
44
|
+
{
|
45
|
+
exec: 'flameshot',
|
46
|
+
full: 'full -p',
|
47
|
+
partial: 'gui -p',
|
48
|
+
folder: folder.to_path,
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
def maim
|
53
|
+
{
|
54
|
+
exec: 'maim',
|
55
|
+
full: '',
|
56
|
+
partial: '--select',
|
57
|
+
folder: folder.join(screenshot_name),
|
58
|
+
}
|
59
|
+
end
|
60
|
+
|
61
|
+
def screenshot_format
|
62
|
+
'png'
|
63
|
+
end
|
64
|
+
|
65
|
+
def screenshot_name
|
66
|
+
"screenshot-#{current_time}.#{screenshot_format}"
|
67
|
+
end
|
68
|
+
|
69
|
+
def final_command
|
70
|
+
"#{shotter[:exec]} #{shotter[mode]} #{shotter[:folder]}"
|
71
|
+
end
|
72
|
+
|
73
|
+
def run
|
74
|
+
system(final_command)
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Display System Hardware Information.
|
6
|
+
class Sysinfo
|
7
|
+
attr_reader :services, :command
|
8
|
+
|
9
|
+
DEPS = %w[pulseaudio amixer ping sensors ryzen vega].freeze
|
10
|
+
|
11
|
+
def initialize(services, command)
|
12
|
+
@services = services
|
13
|
+
@command = command
|
14
|
+
end
|
15
|
+
|
16
|
+
public
|
17
|
+
|
18
|
+
def run_args
|
19
|
+
DEPS
|
20
|
+
end
|
21
|
+
|
22
|
+
def run
|
23
|
+
puts(run_args)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Sound manager information
|
6
|
+
class SoundManager
|
7
|
+
attr_reader :utils
|
8
|
+
|
9
|
+
def initialize(utils)
|
10
|
+
@utils = utils
|
11
|
+
end
|
12
|
+
|
13
|
+
# Find the running Pactl sink
|
14
|
+
def pactl_sink
|
15
|
+
`pactl list sinks`.split('Sink #').each do |sink|
|
16
|
+
sink_id = sink[0]
|
17
|
+
return sink_id if sink.include? 'State: RUNNING'
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def sink
|
22
|
+
{
|
23
|
+
pactl: pactl_sink
|
24
|
+
}
|
25
|
+
end
|
26
|
+
|
27
|
+
def sound_managers
|
28
|
+
%w[pactl amixer mixer]
|
29
|
+
end
|
30
|
+
|
31
|
+
def sound_manager
|
32
|
+
sound_managers.first { |manager| utils.which?(manager) }.to_sym
|
33
|
+
end
|
34
|
+
|
35
|
+
ALL = Struct.new(:name, :sink)
|
36
|
+
def info
|
37
|
+
ALL.new(sound_manager, sink[sound_manager])
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
"#{sound_manager} #{sink}"
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,117 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Cejo
|
4
|
+
module Ops
|
5
|
+
# Manage System Volume.
|
6
|
+
class Volume
|
7
|
+
STEP = 3
|
8
|
+
|
9
|
+
attr_reader :state, :utils
|
10
|
+
attr_accessor :info
|
11
|
+
|
12
|
+
def initialize(utils, state)
|
13
|
+
@utils = utils
|
14
|
+
@state = state.to_sym if state
|
15
|
+
@info = SoundManager.new(utils).info
|
16
|
+
end
|
17
|
+
|
18
|
+
def states
|
19
|
+
{
|
20
|
+
up: '+',
|
21
|
+
down: '-',
|
22
|
+
toggle: ''
|
23
|
+
}
|
24
|
+
end
|
25
|
+
|
26
|
+
# * PACTL
|
27
|
+
|
28
|
+
def pactl_toggle
|
29
|
+
[pactl[:name], pactl[:toggle]].join(' ')
|
30
|
+
end
|
31
|
+
|
32
|
+
def pactl_updown
|
33
|
+
[pactl[:name], pactl[:updown]].join(' ')
|
34
|
+
end
|
35
|
+
|
36
|
+
def pactl
|
37
|
+
{
|
38
|
+
name: 'pactl',
|
39
|
+
toggle: "set-sink-mute #{info.sink} toggle",
|
40
|
+
updown: "set-sink-volume #{info.sink} #{states[state]}#{STEP}%"
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
# * AMIXER
|
45
|
+
|
46
|
+
def amixer_toggle
|
47
|
+
[amixer[:name], amixer[:toggle]].join(' ')
|
48
|
+
end
|
49
|
+
|
50
|
+
def amixer_updown
|
51
|
+
[amixer[:name], amixer[:updown]].join(' ')
|
52
|
+
end
|
53
|
+
|
54
|
+
def amixer
|
55
|
+
{
|
56
|
+
name: 'amixer',
|
57
|
+
toggle: '-q sset Master toggle',
|
58
|
+
updown: "set Master #{STEP}%#{states[state]}"
|
59
|
+
}
|
60
|
+
end
|
61
|
+
|
62
|
+
# * BSD MIXER
|
63
|
+
|
64
|
+
def mixer_toggle
|
65
|
+
[mixer[:name], mixer[:toggle]].join(' ')
|
66
|
+
end
|
67
|
+
|
68
|
+
def mixer_updown
|
69
|
+
[mixer[:name], mixer[:updown]].join(' ')
|
70
|
+
end
|
71
|
+
|
72
|
+
def mixer
|
73
|
+
{
|
74
|
+
name: 'mixer',
|
75
|
+
toggle: '',
|
76
|
+
updown: "mixer vol #{states[state]}#{STEP}"
|
77
|
+
}
|
78
|
+
end
|
79
|
+
|
80
|
+
# * MODES
|
81
|
+
|
82
|
+
def toggle
|
83
|
+
{
|
84
|
+
pactl: pactl_toggle,
|
85
|
+
amixer: amixer_toggle,
|
86
|
+
mixer: mixer_toggle
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
def updown
|
91
|
+
{
|
92
|
+
pactl: pactl_updown,
|
93
|
+
amixer: amixer_updown,
|
94
|
+
mixer: mixer_updown
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
def mode
|
99
|
+
{
|
100
|
+
toggle: toggle[info.name],
|
101
|
+
up: updown[info.name],
|
102
|
+
down: updown[info.name]
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
def final_command
|
107
|
+
mode[state]
|
108
|
+
end
|
109
|
+
|
110
|
+
def run
|
111
|
+
return unless %i[up down toggle].include?(state)
|
112
|
+
|
113
|
+
system(final_command)
|
114
|
+
end
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|