Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

sphobjinv-textconv #307

Open
wants to merge 32 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
55e0d00
sphobjinv-textconv
msftcangoblowm Dec 12, 2024
27153cd
adjustments to pass linkcheck
msftcangoblowm Dec 12, 2024
9d0c847
reduce fail under percentage
msftcangoblowm Dec 12, 2024
04bd1d3
fix README.md doctest
msftcangoblowm Dec 12, 2024
a087e33
git diff support
msftcangoblowm Aug 26, 2024
e2cbd6a
fix py38
msftcangoblowm Aug 27, 2024
2b8f4a9
kiss principle strikes back
msftcangoblowm Aug 27, 2024
dab90f2
when need add SCRIPTS folder to sys.path
msftcangoblowm Aug 27, 2024
325697b
meant list.insert
msftcangoblowm Aug 27, 2024
6f2a6b2
use relative not absolute path
msftcangoblowm Aug 28, 2024
8bf128d
escape regex metacharacters
msftcangoblowm Aug 28, 2024
2de2492
.git/config textconv executable resolve path
msftcangoblowm Aug 28, 2024
3a1fa88
resolve both executables path
msftcangoblowm Aug 28, 2024
f898793
To be young resolved or unresolved
msftcangoblowm Aug 28, 2024
a7c760b
track down object count discrepency
msftcangoblowm Aug 28, 2024
920b0fb
consistantly use import_infile
msftcangoblowm Aug 28, 2024
bc36bc9
compare existing resources
msftcangoblowm Aug 29, 2024
9b6d7cf
.git/config algo refactor
msftcangoblowm Aug 29, 2024
a1450fa
git diff err message
msftcangoblowm Aug 29, 2024
88b188f
specify encoding and linesep
msftcangoblowm Aug 29, 2024
3578516
git config to the rescue
msftcangoblowm Aug 30, 2024
617b132
inventory path need single quotes
msftcangoblowm Aug 30, 2024
6011edd
what garble WindowsPath
msftcangoblowm Aug 30, 2024
097aeb8
sandbox mystery no file .gitattributes
msftcangoblowm Aug 30, 2024
17ae632
ci adjustments need
msftcangoblowm Aug 30, 2024
cd36666
restore fixture
msftcangoblowm Dec 31, 2024
c28a4a5
fix format and lint
msftcangoblowm Dec 31, 2024
695aa55
remove py313 from pipeline
msftcangoblowm Jan 5, 2025
9b313d4
Merge branch 'bskinn:main' into textconv
msftcangoblowm Jan 7, 2025
71b914e
cleanup conftest
msftcangoblowm Jan 7, 2025
dc5ea78
no change semantic version
msftcangoblowm Jan 12, 2025
0a30a83
one run_cmdline fixture
msftcangoblowm Jan 14, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .coveragerc
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ source =
omit =
# Don't worry about covering vendored libraries
src/sphobjinv/_vendored/*
setup.py
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Noticed this -- I'd be fine with adding conftest.py in here too, actually. It would both be a direct signal that setup.py and conftest.py are meant to not be covered, and I believe would result in them being excluded entirely from any coverage reports.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Oh nice! That's much better


[report]
exclude_lines =
Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,7 @@ inventory creation/modification:
>>> import sphobjinv as soi
>>> inv = soi.Inventory('doc/build/html/objects.inv')
>>> print(inv)
<Inventory (fname_zlib): sphobjinv v2.3, 220 objects>
<Inventory (fname_zlib): sphobjinv v2.3, ... objects>
>>> inv.project
'sphobjinv'
>>> inv.version
Expand Down
8 changes: 2 additions & 6 deletions azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,6 @@ stages:
spec: '3.11'
py312:
spec: '3.12'
py313:
spec: '3.13'
pypy3:
spec: 'pypy3'
platforms: [linux]
Expand All @@ -106,8 +104,6 @@ stages:
spec: '3.11'
py312:
spec: '3.12'
py313:
spec: '3.13'
platforms: [windows, macOs]

- template: azure-sdisttest.yml
Expand Down Expand Up @@ -226,8 +222,8 @@ stages:
- script: pytest --cov=. --nonloc --flake8_ext
displayName: Run pytest with coverage on the entire project tree

- script: coverage report --include="tests/*" --fail-under=100
displayName: Check 100% test execution
- script: coverage report --include="tests/*" --fail-under=90
displayName: Check 90% test execution


- job: noqa_info
Expand Down
26 changes: 22 additions & 4 deletions conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,7 @@
import pytest
from sphinx import __version__ as sphinx_version_str
from sphinx.util.inventory import InventoryFile as IFile
from tests.enum import Entrypoints

import sphobjinv as soi

Expand Down Expand Up @@ -233,21 +234,32 @@ def sphinx_version():
@pytest.fixture() # Must be function scope since uses monkeypatch
def run_cmdline_test(monkeypatch):
"""Return function to perform command line exit code test."""
from sphobjinv.cli.core import main

def func(arglist, *, expect=0): # , suffix=None):
def func(arglist, *, expect=0, prog: Entrypoints = Entrypoints.SOI):
"""Perform the CLI exit-code test."""

# Assemble execution arguments
runargs = ["sphobjinv"]
assert isinstance(prog, Entrypoints)
runargs = []
if prog == Entrypoints.SOI:
from sphobjinv.cli.core import main

ep_fcn = main
runargs.append(Entrypoints.SOI.value)
else:
from sphobjinv.cli.core_textconv import main as main_textconv

ep_fcn = main_textconv
runargs.append(Entrypoints.SOI_TEXTCONV.value)

runargs.extend(str(a) for a in arglist)

# Mock sys.argv, run main, and restore sys.argv
with monkeypatch.context() as m:
m.setattr(sys, "argv", runargs)

try:
main()
ep_fcn()
except SystemExit as e:
retcode = e.args[0]
ok = True
Expand Down Expand Up @@ -323,6 +335,12 @@ def is_win():
return platform.system().lower() == "windows"


@pytest.fixture(scope="session")
def is_linux():
"""Report boolean of whether the current system is Linux."""
return platform.system() in ("Linux",)


Comment on lines +338 to +343
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't see anywhere this fixture is currently used, do we need it?

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Slated for removal

@pytest.fixture(scope="session")
def unix2dos():
"""Provide function for converting POSIX to Windows EOLs."""
Expand Down
160 changes: 160 additions & 0 deletions doc/source/cli/git_diff.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
.. Description of configure git diff support for inventory files

Integration -- git diff
========================

.. program:: git diff

|soi-textconv| converts .inv files to plain text sending the
output to |stdout|.

.. code-block:: shell

sphobjinv-textconv objects.inv

Which is equivalent to

.. code-block:: shell

sphobjinv convert plain objects.inv -

Convenience aside, why the redundant CLI command, |soi-textconv|?

To compare changes to a |objects.inv| file, :code:`git diff` won't
produce a useful result without configuration. And git only accepts a
CLI command with:

- one input, the INFILE path

- sends output to |stdout|

Usage
------

Initialize git
"""""""""""""""

.. code-block:: shell

git init
git config user.email [email protected]
git config user.name "a test"

Configure git
""""""""""""""

``git diff`` is really useful, so it's time to configure git

There is no CLI command to configure git for us.

In ``.git/config`` (or $HOME/.config/git/config) append,

.. code-block:: text

[diff "inv"]
textconv = [absolute path to venv bin folder]/sphobjinv-textconv

Note has one tab, not whitespace(s)

In ``.gitattributes`` append,

.. code-block:: text

*.inv binary diff=inv

Example
--------

Make one commit
""""""""""""""""

Commit these files:

- objects_attrs.inv

- objects_attrs.txt

- .gitattributes

.. code-block:: shell

git add .
git commit --no-verify --no-gpg-sign -m "test textconv"

Make a change to ``objects_attrs.inv``
"""""""""""""""""""""""""""""""""""""""

By shell

.. code-block:: shell

URL="https://github.com/bskinn/sphobjinv/raw/main/tests/resource/objects_attrs.inv"
wget "$URL"
sphobjinv convert plain -qu "$URL" objects_attrs.txt
export APPEND_THIS="attrs.validators.set_cheat_mode py:function 1 api.html#$ -"
echo "$APPEND_THIS" >> objects_attrs.txt
sphobjinv convert zlib -qu objects_attrs.txt objects_attrs.inv

By python code

.. versionadded:: 2.4.0
Append a line to .inv (compressed) inventory

.. doctest:: append_a_line

>>> from pathlib import Path
>>> from sphobjinv import DataObjStr
>>> from sphobjinv.cli.load import import_infile
>>> from sphobjinv.cli.write import write_plaintext
>>>
>>> remote_url = (
... "https://github.com/bskinn/sphobjinv/"
... "raw/main/tests/resource/objects_attrs.inv"
... )
>>> cli_run(f'sphobjinv convert plain -qu {remote_url} objects_attrs.txt')
<BLANKLINE>
>>> path_dst_dec = Path('objects_attrs.txt')
>>> path_dst_cmp = Path('objects_attrs.inv')
>>> dst_dec_path = str(path_dst_dec)
>>> path_dst_dec.is_file()
True
>>> inv_0 = import_infile(dst_dec_path)
>>> obj_datum = DataObjStr(
... name="attrs.validators.set_cheat_mode",
... domain="py",
... role="function",
... priority="1",
... uri="api.html#$",
... dispname="-",
... )
>>> inv_0.objects.append(obj_datum)
>>> write_plaintext(inv_0, dst_dec_path)
>>> cli_run('sphobjinv convert -q zlib objects_attrs.txt objects_attrs.inv')
<BLANKLINE>
>>> path_dst_cmp.is_file()
True

Show the diff
""""""""""""""

To see the changes to objects_attrs.inv

.. code-block:: shell

git diff HEAD objects_attrs.inv 2>/dev/null

Without |soi-textconv|, *These two binary files differ*

With |soi-textconv| configured

.. code-block:: text

diff --git a/objects.inv b/objects.inv
index 85189bd..65cc567 100644
--- a/objects.inv
+++ b/objects.inv
@@ -131,4 +131,5 @@ types std:doc -1 types.html Type Annotations
validators std:label -1 init.html#$ Validators
version-info std:label -1 api.html#$ -
why std:doc -1 why.html Why not…
+attrs.validators.set_cheat_mode py:function 1 api.html#$ -
7 changes: 7 additions & 0 deletions doc/source/cli/implementation/core-textconv.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
.. Module API page for cli/core_textconv.py

sphobjinv.cli.core_textconv
===========================

.. automodule:: sphobjinv.cli.core_textconv
:members:
1 change: 1 addition & 0 deletions doc/source/cli/implementation/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ sphobjinv.cli (non-API)

convert
core
core-textconv
load
parser
paths
Expand Down
112 changes: 112 additions & 0 deletions doc/source/cli/textconv.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,112 @@
.. Description of sphobjinv-textconv commandline usage

Command-Line Usage: |soi-textconv|
===================================

.. program:: |soi-textconv|

Terse syntax command to convert |objects.inv| to |stdout|. Extends
:code:`git diff`. Comparing against partially binary
|objects.inv| versions, produces useful results.

Rather than *These two binary files differ*

Unlike |soi|, |soi-textconv| coding style is ``adapt to survive``.
Regardless of what's thrown at it, does what it can.

Difference

- when an inventory file is piped in from |stdin|, specifying "-" is optional

- checks |stdin| even before parsing cli arguments

----

**Usage**

.. command-output:: sphobjinv-textconv --help
:ellipsis: 4

.. versionadded:: 2.4.0

.. seealso::

Step by step configuration, usage, and code samples

:doc:`git_diff`

**Positional Arguments**

.. option:: infile

Path (or URL, if :option:`--url` is specified) to file to be converted.

If passed as ``-``, |soi-textconv| will attempt import of a plaintext or JSON
inventory from |stdin| (incompatible with :option:`--url`).

**Flags**

.. option:: -h, --help

Display help message and exit.

.. option:: -u, --url

Treat :option:`infile` as a URL for download. Cannot be used when
:option:`infile` is passed as ``-``.

.. option:: -e, --expand

Expand any abbreviations in `uri` or `dispname` fields before writing to output;
see :ref:`here <syntax_shorthand>`.

**Examples**

Remote URL

.. code-block:: shell

export URL="https://github.com/bskinn/sphobjinv/raw/main/tests/resource/objects_attrs.inv"
sphobjinv-textconv "$URL"

Local URL

.. code-block:: shell

sphobjinv-textconv --url "file:///home/pepe/Downloads/objects.inv"

Piping in compressed inventories is not allowed

.. code-block:: shell

sphobjinv-textconv "-" < objects.inv

^^ BAD ^^

.. code-block:: shell

export URL="https://github.com/bskinn/sphobjinv/raw/main/tests/resource/objects_attrs.inv"
sphobjinv-textconv "-" < "$URL"

plain text

.. code-block:: shell

export URL="https://github.com/bskinn/sphobjinv/raw/main/tests/resource/objects_attrs.inv"
sphobjinv convert -uq plain "$URL" "-" | sphobjinv-textconv

JSON

.. code-block:: shell

sphobjinv-textconv < objects.json

Expanding `uri` or `dispname` fields

.. code-block:: shell

sphobjinv-textconv -e objects.inv

.. caution:: Caveat

When an inventory is piped in from stdin, ``-e`` option is ignored
Loading