jt.py
1 import logging 2 import os 3 4 5 def install_jt(ctx): 6 runcmd_prepend_to_path = globals()["runcmd_prepend_to_path"] 7 runcmd_run = globals()["runcmd_run"] 8 runcmd_exit_code_is_zero = globals()["runcmd_exit_code_is_zero"] 9 srcdir = globals()["srcdir"] 10 11 target = os.environ.get("CARGO_TARGET_DIR", os.path.join(srcdir, "target")) 12 bindir = os.path.join(target, "debug") 13 runcmd_prepend_to_path(ctx, bindir) 14 15 # Configure git. 16 17 runcmd_run(ctx, ["git", "config", "--global", "user.name", "J. Random Hacker"]) 18 runcmd_exit_code_is_zero(ctx) 19 20 runcmd_run(ctx, ["git", "config", "--global", "user.email", "subplot@example.com"]) 21 runcmd_exit_code_is_zero(ctx) 22 23 24 def create_script(ctx, filename=None): 25 get_file = globals()["get_file"] 26 text = get_file(filename) 27 open(filename, "wb").write(text) 28 os.chmod(filename, 0o755) 29 30 31 def run_jt_init(ctx, dirname=None, journalname=None, title=None): 32 runcmd_run = globals()["runcmd_run"] 33 runcmd_run(ctx, [_binary("jt"), "init", dirname, journalname, title]) 34 35 36 def run_jt_list_journals(ctx): 37 runcmd_run = globals()["runcmd_run"] 38 runcmd_run(ctx, [_binary("jt"), "list-journals"]) 39 40 41 def run_jt_is_journal(ctx, dirname=None): 42 runcmd_run = globals()["runcmd_run"] 43 runcmd_run(ctx, [_binary("jt"), "is-journal", dirname]) 44 45 46 def run_jt_new(ctx, title=None, dirname=None): 47 runcmd_run = globals()["runcmd_run"] 48 runcmd_run( 49 ctx, [_binary("jt"), "new", title, "--dirname", dirname, "--editor=none"] 50 ) 51 52 53 def run_jt_edit(ctx, editor=None, dirname=None): 54 runcmd_run = globals()["runcmd_run"] 55 env = dict(os.environ) 56 env["JT_LOG"] = "jt" 57 runcmd_run( 58 ctx, [_binary("jt"), "edit", "--dirname", dirname, "--editor", editor], env=env 59 ) 60 61 62 def run_jt_finish(ctx, dirname=None): 63 runcmd_run = globals()["runcmd_run"] 64 runcmd_run(ctx, [_binary("jt"), "finish", "--dirname", dirname]) 65 66 67 def _binary(name): 68 srcdir = globals()["srcdir"] 69 return os.path.join(srcdir, "target", "debug", "jt") 70 71 72 def output_contains(ctx, pattern=None): 73 assert_eq = globals()["assert_eq"] 74 logging.debug("checking if %r contains", ctx["stdout"], pattern) 75 assert_eq(pattern in ctx["stdout"], True) 76 77 78 def journal_has_no_drafts(ctx, dirname=None): 79 _journal_has_n_drafts(ctx, 0, dirname=dirname) 80 81 82 def journal_has_one_draft(ctx, dirname=None): 83 _journal_has_n_drafts(ctx, 1, dirname=dirname) 84 85 86 def journal_has_two_drafts(ctx, dirname=None): 87 _journal_has_n_drafts(ctx, 2, dirname=dirname) 88 89 90 def _journal_has_n_drafts(ctx, n, dirname=None): 91 assert_eq = globals()["assert_eq"] 92 logging.debug(f"checking {dirname} has {n} drafts") 93 drafts = os.path.join(dirname, "drafts") 94 assert_eq(len(_find_files(drafts)), n) 95 96 97 def journal_has_no_entries(ctx, dirname=None): 98 assert_eq = globals()["assert_eq"] 99 logging.debug(f"checking {dirname} has no entries") 100 entries = os.path.join(dirname, "entries") 101 assert_eq(_find_files(entries), []) 102 103 104 def journal_has_one_entry(ctx, dirname=None, variable=None): 105 assert_eq = globals()["assert_eq"] 106 logging.debug( 107 f"checking {dirname} has one entry, whose filename is remembered as {variable}" 108 ) 109 entries = os.path.join(dirname, "entries") 110 files = _find_files(entries) 111 assert_eq(len(files), 1) 112 variables = ctx.get("variables", {}) 113 variables[variable] = files[0] 114 ctx["variables"] = variables 115 116 117 def journal_has_two_entries(ctx, dirname=None, variable1=None, variable2=None): 118 assert_eq = globals()["assert_eq"] 119 logging.debug(f"checking {dirname} has two entries") 120 entries = os.path.join(dirname, "entries") 121 files = list(sorted(_find_files(entries))) 122 assert_eq(len(files), 2) 123 variables = ctx.get("variables", {}) 124 variables[variable1] = files[0] 125 variables[variable2] = files[1] 126 ctx["variables"] = variables 127 128 129 def _find_files(root): 130 if not os.path.exists(root): 131 return [] 132 133 files = [] 134 for dirname, _, basenames in os.walk(root): 135 for basename in basenames: 136 files.append(os.path.join(dirname, basename)) 137 return files 138 139 140 def draft_contains_string(ctx, dirname=None, draftno=None, pattern=None): 141 logging.debug(f"checking draft {draftno} in {dirname} has contains {pattern!r}") 142 draft = os.path.join(dirname, "drafts", f"{draftno}.md") 143 with open(draft) as f: 144 data = f.read() 145 logging.debug(f"draft content: {data!r}") 146 assert pattern in data 147 148 149 def draft_links_to_topic(ctx, dirname=None, draftno=None, topic=None): 150 logging.debug(f"checking draft {draftno} in {dirname} links to {topic!r}") 151 draft_contains_string( 152 ctx, dirname=dirname, draftno=draftno, pattern=f'\n[[!meta link="{topic}"]]\n' 153 ) 154 155 156 def edit_draft(ctx, dirname=None, draftno=None, text=None): 157 logging.debug(f"editing draft {draftno} in {dirname} to also contain {text!r}") 158 draft = os.path.join(dirname, "drafts", f"{draftno}.md") 159 with open(draft, "a") as f: 160 f.write(text) 161 162 163 def file_contains(ctx, variable=None, pattern=None): 164 logging.debug(f"checking {variable} contains {pattern!r}") 165 166 variables = ctx.get("variables", {}) 167 logging.debug(f"variables: {variables!r}") 168 169 filename = variables[variable] 170 with open(filename) as f: 171 data = f.read() 172 logging.debug(f"file content: {data!r}") 173 assert pattern in data 174 175 176 def file_name_has_suffix(ctx, varname=None, suffix=None): 177 variables = ctx.get("variables", {}) 178 filename = variables[varname] 179 assert filename.endswith(suffix) 180 181 182 def git_is_clean(ctx, dirname=None): 183 runcmd_run = globals()["runcmd_run"] 184 runcmd_exit_code_is_zero = globals()["runcmd_exit_code_is_zero"] 185 runcmd_get_stdout = globals()["runcmd_get_stdout"] 186 assert_eq = globals()["assert_eq"] 187 188 runcmd_run(ctx, ["git", "status", "--porcelain"], cwd=dirname) 189 runcmd_exit_code_is_zero(ctx) 190 191 stdout = runcmd_get_stdout(ctx) 192 assert_eq(stdout, "")