/ subplot / jt.py
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, "")