Sejak memasang "dark" theme, saya cenderung menjadi malas menulis. Untuk sementara, dark theme saya disable dulu yaa. Terima kasih (^_^) (bandithijo, 2024/09/15) ●
Latar Belakang Masalah
Saya membuat sebuah Ruby script untuk shell wraper dalam memudahkan proses copy paste asset modifikasi dari user direktori ke root direktori.
Misal, saya memiliki sebuah asset meta_01.svg yang berada di home user
$HOME/theme/keymon/oblivion/meta_01.svg
Ingin saya copy ke direktori asset dari keymon yang berada di
/usr/lib/python3.8/site-packages/keymon/themes/oblivion/meta.svg
Jika menggunakan command cp akan seperti ini kira-kira.
$ sudo cp -vf $HOME/theme/keymon/oblivion/meta_01.svg \
/usr/lib/python3.8/site-packages/keymon/themes/oblivion/meta.svg
Karena path yang dituju sangat dalam, maka timbul rasa malas apabila pekerjaan modifikasi ini dialkukan berulang kali untuk tujuan pengujian.
Maka dari itu, saya berinisiatif untuk membuatkan Ruby installation script agar dapat menangani masalah ini dengan memberikan instruksi secara interaktif.
Selain itu juga karena saya mengharapkan apabila saya menambahkan direktori theme lain, dan juga style yang lain, saya tidak perlu mengubah-ubah script untk memberikan option atau pilihan lagi. Karena pilihan-pilihan theme dan style sudah ditangani oleh script.
Mantaaaaaap memang!
Pemecahan Masalah
Secara sederhana, algoritma dari script ini adalah:
- Membuat list semua direktori theme yang ada
- Menampilkan semua direktori theme sebagai pilihan (option)
- User: Memilih theme yang tersedia
Nama theme diambil dari nama direktori dari masing-masing theme. - Masuk ke dalam direktori theme
- Membuat list semua style yang ada di dalam direktori theme
- Menampilkan semua style sebagai pilihan (option)
- User: Memilih style yang ada di dalam theme
- User: Konfirmasi untuk melakukan proses instalasi
- Melakukan proses $ sudo cp
Selanjutnya, saya membuat sebuah file install.rb.
Kemudian mulai menulis prosedur dari algoritma di atas dengan bahasa Ruby.
Saya akan menjelaskan perbagian kecil, agar teman-teman yang teratarik dengan bahasa Ruby dapat lebih mudah memahami.
- Mendefinisikan lokasi dari keymon installation direktori.
Setiap sistem kemungkinan akan berbeda berdasarkan distro yang digunakan dan versi Python yang digunakan.
Pada langkah ini, mau tidak mau saya harus meminta akses administrator dengan sudo.
python_lib_path = `sudo python -c "import sys; print(sys.path[4])"` keymon_dir = python_lib_path.strip << '/keymon/themes' puts "\nYour Key-Mon installation directory is on: #{keymon_dir.sub('/themes', '')}"
- Membuat daftar semua theme yang ada di dalam project.
list_theme = `ls -1d */`.gsub("\/", '').split("\n")
- Mengecualikan direktori tertentu dari daftar direktori theme.
Dalam kasus ini, direktori sample.['sample'].each do |exclude| list_theme.delete(exclude) end
- Menampilkan option (pilihan) berupa daftar theme yang ada.
puts 'Select your Key-mon theme!' list_theme.each_with_index do |theme, index| puts " (#{index + 1}) #{theme.capitalize}" end
Output:
Select your Key-mon theme! (1) Oblivion
- Meminta inputan ke user dari pertanyaan di atas.
puts "\nEnter theme number:" print '=> ' selected_theme = gets.chomp
Output:
Enter theme number: => _
- Mendefinisikan nama theme berdasarkan jawaban yang diberikan user.
Dari jawaban berupa string angka ke theme name dari list_theme.selected_theme_name = list_theme[selected_theme.to_i - 1]
- Berpindah direktori ke dalam direktori theme yang dipilih user.
Dir.chdir(selected_theme_name) puts "\nYou are in #{selected_theme_name.capitalize} directory"
Output:
You are in ... directory
- Membuat kondisi, apabila direktori terdapat style, maka masukkan ke dalam variable list_style array.
Apabila di dalam direktori kosong, maka exit program.unless `ls -p | grep -v /`.empty? list_style = `ls -p | grep -v /`.split("\n") else puts "\nThere are no style in this directory" exit end
- Menampilkan option (pilihan) berupa style-style yang terdapat di dalam direktori theme.
puts "\nSelect you modification style:" list_style.each_with_index do |style, index| puts " (#{index + 1}) #{style}" end
Output:
Select you modification style: (1) meta_01.svg (2) meta_02.svg (3) meta_03.svg (4) meta_04.svg
- Meminta inputan berupa nomor style ke user.
puts "\nEnter style number" print '=> ' selected_style = gets.chomp
Output:
Enter style number => _
- Mendefinisikan nama style berdasarkan jawaban yang diberikan user.
Dari jawaban berupa string angka ke nama style.selected_style_name = list_style[selected_style.to_i - 1]
- Menampilkan pilihan style yang dipilih user.
puts "\nYou choose: #{selected_style_name}"
Output:
You choose: ...
- Menanyakan persetujuan kepada user, apakah ingin melakukan instalasi atau tidak.
puts "\nAre you sure want to change the style? [y/n]" print '=> ' agreement = gets.chomp
Output:
Are you sure want to change the style? [y/n] => _
- Mengolah jawaban user.
if %w[y Y].include? agreement puts "\nLet's party!" puts system "sudo cp -vf #{selected_style_name} \ #{keymon_dir}/#{selected_theme_name}/meta.svg" puts "\nInstallation COMPLETED!" elsif %w[n N].include? agreement puts "\nAh, Maybe later" else puts "\nYou are not enter the correct answer" end
Output:
Apabila yLet's party!
[sudo] password for user:
'meta_01.svg' -> '/usr/lib/python3.8/site-packages/keymon/themes/oblivion/meta.svg'
Installation COMPLETED!Apabila n
Ah, Maybe later
Selain y & n
You are not enter the correct answer
- Selesai
Full Script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#!/usr/bin/env ruby
# This is a Ruby wraper script for change the Meta/Super key logo of your
# Key-mon. You can choose your Meta modification style with this installation
# script install.rb.
# source : https://github.com/bandithijo/key-mon-meta-mod
# author : bandithijo@gmail.com
# created : 2020/09/27
# Please take a look a installation path of your keymon.
# It probably difference with my own system.
python_lib_path = `sudo python -c "import sys; print(sys.path[4])"`
keymon_dir = python_lib_path.strip << '/keymon/themes'
puts "\nYour Key-Mon installation directory is on:
#{keymon_dir.sub('/themes', '')}"
list_theme = `ls -1d */`.gsub("\/", '').split("\n")
['sample'].each do |exclude|
list_theme.delete(exclude)
end
puts 'Select your Key-mon theme!'
list_theme.each_with_index do |theme, index|
puts " (#{index + 1}) #{theme.capitalize}"
end
puts "\nEnter theme number:"
print '=> '
selected_theme = gets.chomp
selected_theme_name = list_theme[selected_theme.to_i - 1]
Dir.chdir(selected_theme_name)
puts "\nYou are in #{selected_theme_name.capitalize} directory"
unless `ls -p | grep -v /`.empty?
list_style = `ls -p | grep -v /`.split("\n")
else
puts "\nThere are no style in this directory"
exit
end
puts "\nSelect you modification style:"
list_style.each_with_index do |style, index|
puts " (#{index + 1}) #{style}"
end
puts "\nEnter style number"
print '=> '
selected_style = gets.chomp
selected_style_name = list_style[selected_style.to_i - 1]
puts "\nYou choose: #{selected_style_name}"
puts "\nAre you sure want to change the style? [y/n]"
print '=> '
agreement = gets.chomp
if %w[y Y].include? agreement
puts "\nLet's party!"
puts
system "sudo cp -vf #{selected_style_name} \
#{keymon_dir}/#{selected_theme_name}/meta.svg"
puts "\nInstallation COMPLETED!"
elsif %w[n N].include? agreement
puts "\nAh, Maybe later"
else
puts "\nYou are not enter the correct answer"
end
Pesan Penulis
Untuk versi lebih update dapat dilihat pada repositori di sini
Sepertinya, segini dulu yang dapat saya tuliskan.
Mudah-mudahan dapat bermanfaat.
Terima kasih.
(^_^)
Lisensi
Atribusi-NonKomersial-BerbagiSerupa 4.0 Internasional (CC BY-NC-SA 4.0)
Penulis
My journey kicks off from reading textbooks as a former Medical Student to digging bugs as a Software Engineer – a delightful rollercoaster of career twists. Embracing failure with the grace of a Cat avoiding water, I've seamlessly transitioned from Stethoscope to Keyboard. Armed with ability for learning and adapting faster than a Heart Beat, I'm on a mission to turn Code into a Product.
- Rizqi Nur Assyaufi