summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDylan Araps <dylanaraps@users.noreply.github.com>2017-06-29 22:52:21 +1000
committerGitHub <noreply@github.com>2017-06-29 22:52:21 +1000
commit27e73e5bba414e30caea0dace5fc5073538359d7 (patch)
treed574432dc7a64b50b5e146fec5ff7db526b020f9
parent06d726a66cec0c5626c31975397ab340349ff39b (diff)
parent3283d38e07d4b20ad3a0646d28284fe205fcdc57 (diff)
Merge pull request #16 from dylanaraps/json
colors: Store colors in a json format.
-rwxr-xr-xpywal/__main__.py3
-rwxr-xr-xpywal/format_colors.py68
-rwxr-xr-xpywal/gen_colors.py32
-rwxr-xr-xpywal/set_colors.py23
-rwxr-xr-xpywal/util.py14
-rwxr-xr-xtests/test_export_colors.py4
-rw-r--r--tests/test_files/test_file17
-rw-r--r--tests/test_files/test_file.json26
-rwxr-xr-xtests/test_format_colors.py14
-rwxr-xr-xtests/test_set_colors.py13
-rwxr-xr-xtests/test_util.py24
11 files changed, 162 insertions, 76 deletions
diff --git a/pywal/__main__.py b/pywal/__main__.py
index f9341a5..c5a4bb8 100755
--- a/pywal/__main__.py
+++ b/pywal/__main__.py
@@ -90,7 +90,6 @@ def process_args(args):
# Create a list of hex colors.
colors_plain = gen_colors.get_colors(image, args.q)
- colors_plain[8] = set_colors.set_grey(colors_plain)
if not args.n:
wallpaper.set_wallpaper(image)
@@ -101,7 +100,7 @@ def process_args(args):
# -f
elif args.f:
- colors_plain = util.read_file(args.f)
+ colors_plain = util.read_file_json(args.f)
set_colors.send_sequences(colors_plain, args.t)
export_colors.export_colors(colors_plain)
diff --git a/pywal/format_colors.py b/pywal/format_colors.py
index 5d70ba0..1d0439b 100755
--- a/pywal/format_colors.py
+++ b/pywal/format_colors.py
@@ -6,20 +6,21 @@ from pywal import util
def plain(colors):
"""Convert colors to plain hex."""
- return [f"{color}\n" for color in colors]
+ return [f"{color}\n" for color in colors["colors"].values()]
def shell(colors):
"""Convert colors to shell variables."""
return [f"color{index}='{color}'\n"
- for index, color in enumerate(colors)]
+ for index, color in enumerate(colors["colors"].values())]
def css(colors):
"""Convert colors to css variables."""
css_colors = [":root {\n"]
css_colors.extend([f"\t--color{index}: {color};\n"
- for index, color in enumerate(colors)])
+ for index, color in
+ enumerate(colors["colors"].values())])
css_colors.append("}\n")
return css_colors
@@ -27,7 +28,7 @@ def css(colors):
def scss(colors):
"""Convert colors to scss variables."""
return [f"$color{index}: {color};\n"
- for index, color in enumerate(colors)]
+ for index, color in enumerate(colors["colors"].values())]
def putty(colors):
@@ -38,7 +39,8 @@ def putty(colors):
"[HKEY_CURRENT_USER\\Software\\SimonTatham\\PuTTY\\Sessions\\Wal]\n",
]
putty_colors.extend([f"\"colour{index}\"=\"{rgb(color)}\"\n"
- for index, color in enumerate(colors)])
+ for index, color in
+ enumerate(colors["colors"].values())])
return putty_colors
@@ -46,33 +48,45 @@ def putty(colors):
def xrdb(colors):
"""Convert colors to xrdb format."""
x_colors = []
- x_colors.append(f"URxvt*foreground: {colors[15]}\n")
- x_colors.append(f"XTerm*foreground: {colors[15]}\n")
- x_colors.append(f"URxvt*background: {colors[0]}\n")
- x_colors.append(f"XTerm*background: {colors[0]}\n")
- x_colors.append(f"URxvt*cursorColor: {colors[15]}\n")
- x_colors.append(f"XTerm*cursorColor: {colors[15]}\n")
+ x_colors.append(f"URxvt*foreground: {colors['special']['foreground']}\n")
+ x_colors.append(f"XTerm*foreground: {colors['special']['foreground']}\n")
+ x_colors.append(f"URxvt*background: {colors['special']['background']}\n")
+ x_colors.append(f"XTerm*background: {colors['special']['background']}\n")
+ x_colors.append(f"URxvt*cursorColor: {colors['special']['cursor']}\n")
+ x_colors.append(f"XTerm*cursorColor: {colors['special']['cursor']}\n")
# Colors 0-15.
- x_colors.extend([f"*.color{index}: {color}\n*color{index}: {color}\n"
- for index, color in enumerate(colors)])
+ x_colors.extend([f"*.color{index}: {color}\n*color{index}: {color}\n"
+ for index, color in enumerate(colors["colors"].values())])
- x_colors.append(f"*.color66: {colors[0]}\n*color66: {colors[0]}\n")
+ x_colors.append(f"*.color66: {colors['special']['background']}\n"
+ f"*color66: {colors['special']['background']}\n")
# Rofi colors.
- x_colors.append(f"rofi.color-window: {colors[0]}, "
- f"{colors[0]}, {colors[10]}\n")
- x_colors.append(f"rofi.color-normal: {colors[0]}, "
- f"{colors[15]}, {colors[0]}, "
- f"{colors[10]}, {colors[0]}\n")
- x_colors.append(f"rofi.color-active: {colors[0]}, "
- f"{colors[15]}, {colors[0]}, "
- f"{colors[10]}, {colors[0]}\n")
- x_colors.append(f"rofi.color-urgent: {colors[0]}, "
- f"{colors[9]}, {colors[0]}, "
- f"{colors[9]}, {colors[15]}\n")
+ x_colors.append(f"rofi.color-window: "
+ f"{colors['special']['background']}, "
+ f"{colors['special']['background']}, "
+ f"{colors['colors']['color10']}\n")
+ x_colors.append(f"rofi.color-normal: "
+ f"{colors['special']['background']}, "
+ f"{colors['special']['foreground']}, "
+ f"{colors['special']['background']}, "
+ f"{colors['colors']['color10']}, "
+ f"{colors['special']['background']}\n")
+ x_colors.append(f"rofi.color-active: "
+ f"{colors['special']['background']}, "
+ f"{colors['special']['foreground']}, "
+ f"{colors['special']['background']}, "
+ f"{colors['colors']['color10']}, "
+ f"{colors['special']['background']}\n")
+ x_colors.append(f"rofi.color-urgent: "
+ f"{colors['special']['background']}, "
+ f"{colors['colors']['color9']}, "
+ f"{colors['special']['background']}, "
+ f"{colors['colors']['color9']}, "
+ f"{colors['special']['foreground']}\n")
# Emacs colors.
- x_colors.append(f"emacs*background: {colors[0]}\n")
- x_colors.append(f"emacs*foreground: {colors[15]}\n")
+ x_colors.append(f"emacs*background: {colors['special']['background']}\n")
+ x_colors.append(f"emacs*foreground: {colors['special']['foreground']}\n")
return x_colors
diff --git a/pywal/gen_colors.py b/pywal/gen_colors.py
index 3f5e16e..bd044c2 100755
--- a/pywal/gen_colors.py
+++ b/pywal/gen_colors.py
@@ -9,6 +9,7 @@ import shutil
import subprocess
from pywal.settings import CACHE_DIR, COLOR_COUNT
+from pywal import set_colors
from pywal import util
@@ -96,9 +97,10 @@ def get_colors(img, quiet):
# Cache the sequences file.
cache_file = pathlib.Path(CACHE_DIR / "schemes" / img.replace("/", "_"))
+ cache_file = pathlib.Path(cache_file.with_suffix(".json"))
if cache_file.is_file():
- colors = util.read_file(cache_file)
+ colors = util.read_file_json(cache_file)
print("colors: Found cached colorscheme.")
else:
@@ -111,7 +113,7 @@ def get_colors(img, quiet):
colors = sort_colors(colors)
# Cache the colorscheme.
- util.save_file("\n".join(colors), cache_file)
+ util.save_file_json(colors, cache_file)
print("colors: Generated colorscheme")
if not quiet:
@@ -121,5 +123,27 @@ def get_colors(img, quiet):
def sort_colors(colors):
- """Sort the generated colors."""
- return colors[:1] + colors[9:] + colors[8:]
+ """Sort the generated colors and store them in a dict that
+ we will later save in json format."""
+ raw_colors = colors[:1] + colors[9:] + colors[8:]
+
+ # Special colors.
+ colors_special = {}
+ colors_special.update({"background": raw_colors[0]})
+ colors_special.update({"foreground": raw_colors[15]})
+ colors_special.update({"cursor": raw_colors[15]})
+
+ # Colors 0-15
+ colors_hex = {}
+ [colors_hex.update({f"color{index}": color}) # pylint: disable=W0106
+ for index, color in enumerate(raw_colors)]
+
+ # Color 8
+ colors_hex["color8"] = set_colors.set_grey(raw_colors)
+
+ # Add the colors to a dict.
+ colors = {}
+ colors["special"] = colors_special
+ colors["colors"] = colors_hex
+
+ return colors
diff --git a/pywal/set_colors.py b/pywal/set_colors.py
index 05b217c..6ac53e7 100755
--- a/pywal/set_colors.py
+++ b/pywal/set_colors.py
@@ -37,19 +37,26 @@ def set_grey(colors):
def send_sequences(colors, vte):
"""Send colors to all open terminals."""
- sequences = [set_color(num, color) for num, color in enumerate(colors)]
- sequences.append(set_special(10, colors[15]))
- sequences.append(set_special(11, colors[0]))
- sequences.append(set_special(12, colors[15]))
- sequences.append(set_special(13, colors[15]))
- sequences.append(set_special(14, colors[0]))
+
+ # Colors 0-15.
+ sequences = [set_color(num, color)
+ for num, color in enumerate(colors["colors"].values())]
+
+ # Special colors.
+ # http://pod.tst.eu/http://cvs.schmorp.de/rxvt-unicode/doc/rxvt.7.pod#XTerm_Operating_System_Commands
+ # 10 = foreground, 11 = background, 12 = cursor foregound
+ # 13 = mouse foreground
+ sequences.append(set_special(10, colors["special"]["foreground"]))
+ sequences.append(set_special(11, colors["special"]["background"]))
+ sequences.append(set_special(12, colors["special"]["cursor"]))
+ sequences.append(set_special(13, colors["special"]["cursor"]))
# Set a blank color that isn"t affected by bold highlighting.
- sequences.append(set_color(66, colors[0]))
+ sequences.append(set_color(66, colors["special"]["background"]))
# This escape sequence doesn"t work in VTE terminals.
if not vte:
- sequences.append(set_special(708, colors[0]))
+ sequences.append(set_special(708, colors["special"]["background"]))
# Get a list of terminals.
terminals = [f"/dev/pts/{term}" for term in os.listdir("/dev/pts/")
diff --git a/pywal/util.py b/pywal/util.py
index 67baa6a..69a9d9d 100755
--- a/pywal/util.py
+++ b/pywal/util.py
@@ -1,6 +1,7 @@
"""
Misc helper functions.
"""
+import json
import os
import pathlib
import subprocess
@@ -13,12 +14,25 @@ def read_file(input_file):
return colors
+def read_file_json(input_file):
+ """Read colors from a json file."""
+ with open(input_file) as json_file:
+ colors = json.load(json_file)
+ return colors
+
+
def save_file(colors, export_file):
"""Write the colors to the file."""
with open(export_file, "w") as file:
file.write(colors)
+def save_file_json(colors, export_file):
+ """Write the colors to a json file."""
+ with open(export_file, "w") as file:
+ json.dump(colors, file, indent=4)
+
+
def create_dir(directory):
"""Alias to create the cache dir."""
pathlib.Path(directory).mkdir(parents=True, exist_ok=True)
diff --git a/tests/test_export_colors.py b/tests/test_export_colors.py
index 3e87f95..7cee594 100755
--- a/tests/test_export_colors.py
+++ b/tests/test_export_colors.py
@@ -7,7 +7,7 @@ from pywal import util
# Import colors.
-COLORS = util.read_file("tests/test_files/test_file")
+COLORS = util.read_file_json("tests/test_files/test_file.json")
class TestExportColors(unittest.TestCase):
@@ -15,7 +15,7 @@ class TestExportColors(unittest.TestCase):
def test_save_colors(self):
"""> Export colors to a file."""
- tmp_file = pathlib.Path("/tmp/test_file")
+ tmp_file = pathlib.Path("/tmp/test_file.json")
export_colors.save_colors(COLORS, tmp_file, "plain colors")
result = tmp_file.is_file()
self.assertTrue(result)
diff --git a/tests/test_files/test_file b/tests/test_files/test_file
index 30eeeaa..21106fe 100644
--- a/tests/test_files/test_file
+++ b/tests/test_files/test_file
@@ -1,16 +1 @@
-#363442
-#99A3B1
-#C5BDB6
-#98AEC2
-#A8B9C6
-#96C4CF
-#B7C5CC
-#C9CFD0
-#999999
-#99A3B1
-#C5BDB6
-#98AEC2
-#A8B9C6
-#96C4CF
-#B7C5CC
-#C9CFD0
+/home/dylan/Pictures/Wallpapers/1.jpg
diff --git a/tests/test_files/test_file.json b/tests/test_files/test_file.json
new file mode 100644
index 0000000..b92c84e
--- /dev/null
+++ b/tests/test_files/test_file.json
@@ -0,0 +1,26 @@
+{
+ "special": {
+ "background":"#3A5130",
+ "foreground":"#FAF9F5",
+ "cursor":"#FAF9F5"
+ },
+
+ "colors": {
+ "color0":"#3A5130",
+ "color1":"#E3A19D",
+ "color2":"#E1CEAE",
+ "color3":"#D6DDCC",
+ "color4":"#F1D2CB",
+ "color5":"#F5E9D6",
+ "color6":"#F9F0E5",
+ "color7":"#FAF9F5",
+ "color8":"#999999",
+ "color9":"#E3A19D",
+ "color10":"#E1CEAE",
+ "color11":"#D6DDCC",
+ "color12":"#F1D2CB",
+ "color13":"#F5E9D6",
+ "color14":"#F9F0E5",
+ "color15":"#FAF9F5"
+ }
+}
diff --git a/tests/test_format_colors.py b/tests/test_format_colors.py
index ab5946a..732f67b 100755
--- a/tests/test_format_colors.py
+++ b/tests/test_format_colors.py
@@ -6,7 +6,7 @@ from pywal import util
# Import colors.
-COLORS = util.read_file("tests/test_files/test_file")
+COLORS = util.read_file_json("tests/test_files/test_file.json")
class TestFormatColors(unittest.TestCase):
@@ -15,32 +15,32 @@ class TestFormatColors(unittest.TestCase):
def test_plain(self):
"""> Convert colors to plain."""
result = format_colors.plain(COLORS)
- self.assertEqual(result[0], "#363442\n")
+ self.assertEqual(result[0], "#3A5130\n")
def test_shell(self):
"""> Convert colors to shell variables."""
result = format_colors.shell(COLORS)
- self.assertEqual(result[0], "color0='#363442'\n")
+ self.assertEqual(result[0], "color0='#3A5130'\n")
def test_css(self):
"""> Convert colors to css variables."""
result = format_colors.css(COLORS)
- self.assertEqual(result[1], "\t--color0: #363442;\n")
+ self.assertEqual(result[1], "\t--color0: #3A5130;\n")
def test_scss(self):
"""> Convert colors to scss variables."""
result = format_colors.scss(COLORS)
- self.assertEqual(result[0], "$color0: #363442;\n")
+ self.assertEqual(result[0], "$color0: #3A5130;\n")
def test_putty(self):
"""> Convert colors to putty theme."""
result = format_colors.putty(COLORS)
- self.assertEqual(result[2], "\"colour0\"=\"54,52,66\"\n")
+ self.assertEqual(result[2], "\"colour0\"=\"58,81,48\"\n")
def test_xrdb(self):
"""> Convert colors to putty theme."""
result = format_colors.xrdb(COLORS)
- self.assertEqual(result[6], "*.color0: #363442\n*color0: #363442\n")
+ self.assertEqual(result[6], "*.color0: #3A5130\n*color0: #3A5130\n")
if __name__ == "__main__":
diff --git a/tests/test_set_colors.py b/tests/test_set_colors.py
index 43c6aed..983e7e6 100755
--- a/tests/test_set_colors.py
+++ b/tests/test_set_colors.py
@@ -6,7 +6,7 @@ from pywal import util
# Import colors.
-COLORS = util.read_file("tests/test_files/test_file")
+COLORS = util.read_file_json("tests/test_files/test_file.json")
class TestSetColors(unittest.TestCase):
@@ -14,17 +14,18 @@ class TestSetColors(unittest.TestCase):
def test_set_special(self):
"""> Create special escape sequence."""
- result = set_colors.set_special(11, COLORS[0])
- self.assertEqual(result, "\x1b]11;#363442\x07")
+ result = set_colors.set_special(11, COLORS["special"]["background"])
+ self.assertEqual(result, "\x1b]11;#3A5130\x07")
def test_set_color(self):
"""> Create color escape sequence."""
- result = set_colors.set_color(11, COLORS[0])
- self.assertEqual(result, "\033]4;11;#363442\007")
+ result = set_colors.set_color(11, COLORS["colors"]["color0"])
+ self.assertEqual(result, "\033]4;11;#3A5130\007")
def test_set_grey(self):
"""> Create special escape sequence."""
- result = set_colors.set_grey(COLORS)
+ colors = [list(COLORS["colors"].values())]
+ result = set_colors.set_grey(colors[0])
self.assertEqual(result, "#999999")
diff --git a/tests/test_util.py b/tests/test_util.py
index b1a396b..cf2b716 100755
--- a/tests/test_util.py
+++ b/tests/test_util.py
@@ -5,18 +5,27 @@ import pathlib
from pywal import util
+# Import colors.
+COLORS = util.read_file_json("tests/test_files/test_file.json")
+
+
class TestUtil(unittest.TestCase):
"""Test the util functions."""
- def test_read_file_start(self):
+ def test_read_file(self):
"""> Read colors from a file."""
result = util.read_file("tests/test_files/test_file")
- self.assertEqual(result[0], "#363442")
+ self.assertEqual(result[0], "/home/dylan/Pictures/Wallpapers/1.jpg")
+
+ def test_read_file_start(self):
+ """> Read colors from a file."""
+ result = util.read_file_json("tests/test_files/test_file.json")
+ self.assertEqual(result["colors"]["color0"], "#3A5130")
def test_read_file_end(self):
"""> Read colors from a file."""
- result = util.read_file("tests/test_files/test_file")
- self.assertEqual(result[15], "#C9CFD0")
+ result = util.read_file_json("tests/test_files/test_file.json")
+ self.assertEqual(result["colors"]["color15"], "#FAF9F5")
def test_save_file(self):
"""> Save colors to a file."""
@@ -25,6 +34,13 @@ class TestUtil(unittest.TestCase):
result = tmp_file.is_file()
self.assertTrue(result)
+ def test_save_file_json(self):
+ """> Save colors to a file."""
+ tmp_file = pathlib.Path("/tmp/test_file.json")
+ util.save_file_json(COLORS, tmp_file)
+ result = tmp_file.is_file()
+ self.assertTrue(result)
+
def test_create_dir(self):
"""> Create a directoru."""
tmp_dir = pathlib.Path("/tmp/test_dir")