cejo 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (83) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +13 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +0 -0
  5. data/.rufo +3 -0
  6. data/.travis.yml +6 -0
  7. data/CODE_OF_CONDUCT.md +74 -0
  8. data/Gemfile +6 -0
  9. data/INSTALL +2 -0
  10. data/LICENSE +674 -0
  11. data/README.org +23 -0
  12. data/README.rdoc +28 -0
  13. data/Rakefile +6 -0
  14. data/annotations/legacy.org +11 -0
  15. data/annotations/todo.org +54 -0
  16. data/bin/console +14 -0
  17. data/bin/setup +9 -0
  18. data/cejo.gemspec +50 -0
  19. data/cejo.rdoc +5 -0
  20. data/exe/cejo +298 -0
  21. data/lib/cejo.rb +42 -0
  22. data/lib/cejo/distro/base.rb +52 -0
  23. data/lib/cejo/distro/commands.rb +26 -0
  24. data/lib/cejo/distro/current_packager.rb +18 -0
  25. data/lib/cejo/distro/help.rb +9 -0
  26. data/lib/cejo/distro/need.rb +32 -0
  27. data/lib/cejo/distro/parsed_commands.rb +23 -0
  28. data/lib/cejo/distro/translate_action.rb +11 -0
  29. data/lib/cejo/floss/archive.rb +49 -0
  30. data/lib/cejo/floss/core.rb +55 -0
  31. data/lib/cejo/floss/grab.rb +44 -0
  32. data/lib/cejo/floss/project_info.rb +28 -0
  33. data/lib/cejo/media/get.rb +54 -0
  34. data/lib/cejo/media/play.rb +45 -0
  35. data/lib/cejo/ops/brightness.rb +37 -0
  36. data/lib/cejo/ops/dots.rb +98 -0
  37. data/lib/cejo/ops/homey.rb +76 -0
  38. data/lib/cejo/ops/screenshot.rb +78 -0
  39. data/lib/cejo/ops/sysinfo.rb +27 -0
  40. data/lib/cejo/ops/volume/sound_manager.rb +45 -0
  41. data/lib/cejo/ops/volume/volume.rb +117 -0
  42. data/lib/cejo/projects/builder.rb +138 -0
  43. data/lib/cejo/projects/dwm.rb +23 -0
  44. data/lib/cejo/projects/emacs.rb +23 -0
  45. data/lib/cejo/projects/ruby.rb +23 -0
  46. data/lib/cejo/projects/st.rb +23 -0
  47. data/lib/cejo/services/folders.rb +21 -0
  48. data/lib/cejo/services/utils.rb +54 -0
  49. data/lib/cejo/version.rb +5 -0
  50. data/lib/tasks/list.rake +7 -0
  51. data/lib/tasks/man.rake +7 -0
  52. data/lib/tasks/spec.rake +5 -0
  53. data/lib/tasks/test.rake +7 -0
  54. data/man/cejo.1.ronn +0 -0
  55. data/spec/distro/action_spec.rb +21 -0
  56. data/spec/distro/base_spec.rb +67 -0
  57. data/spec/distro/commands_spec.rb +22 -0
  58. data/spec/distro/current_packager_spec.rb +17 -0
  59. data/spec/distro/need_spec.rb +22 -0
  60. data/spec/floss/archive_spec.rb +1 -0
  61. data/spec/floss/core_spec.rb +1 -0
  62. data/spec/floss/grab_spec.rb +1 -0
  63. data/spec/media/get_spec.rb +20 -0
  64. data/spec/media/play_spec.rb +41 -0
  65. data/spec/ops/ops_brightness_spec.rb +16 -0
  66. data/spec/ops/ops_volume_spec.rb +22 -0
  67. data/spec/spec_helper.rb +96 -0
  68. data/spec/utils_spec.rb +18 -0
  69. data/test/test_cejo.rb +16 -0
  70. data/test/test_distro_base.rb +13 -0
  71. data/test/test_floss.rb +13 -0
  72. data/test/test_media_get.rb +0 -0
  73. data/test/test_media_play.rb +0 -0
  74. data/test/test_ops_brightness.rb +0 -0
  75. data/test/test_ops_dots.rb +0 -0
  76. data/test/test_ops_homer.rb +0 -0
  77. data/test/test_ops_oss.rb +18 -0
  78. data/test/test_ops_screenshot.rb +0 -0
  79. data/test/test_ops_sysinfo.rb +0 -0
  80. data/test/test_ops_volume.rb +0 -0
  81. data/test/test_projects_builder.rb +0 -0
  82. data/test/test_projects_emacs.rb +0 -0
  83. 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