Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-sgp4 for openSUSE:Factory checked in at 2021-02-18 20:41:02 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-sgp4 (Old) and /work/SRC/openSUSE:Factory/.python-sgp4.new.28504 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-sgp4" Thu Feb 18 20:41:02 2021 rev:5 rq:873226 version:2.16 Changes: -------- --- /work/SRC/openSUSE:Factory/python-sgp4/python-sgp4.changes 2021-01-02 21:31:18.663452580 +0100 +++ /work/SRC/openSUSE:Factory/.python-sgp4.new.28504/python-sgp4.changes 2021-02-18 20:53:02.323474754 +0100 @@ -1,0 +2,11 @@ +Wed Feb 17 20:47:21 UTC 2021 - Ben Greiner <[email protected]> + +- Update to Version 2.16 + * Fixed ``days2mdhms()`` rounding to always match TLE epoch. +- Changes in Version 2.15 + * Fixed parsing of the ``satnum`` TLE field in the Python + fallback code, when the field has a leading space + * added OMM export routine. +- skip python36 (NEP 29, NumPy 1.20) + +------------------------------------------------------------------- Old: ---- sgp4-2.14.tar.gz New: ---- sgp4-2.16.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-sgp4.spec ++++++ --- /var/tmp/diff_new_pack.zQV7pG/_old 2021-02-18 20:53:03.483475843 +0100 +++ /var/tmp/diff_new_pack.zQV7pG/_new 2021-02-18 20:53:03.483475843 +0100 @@ -18,8 +18,9 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 +%define skip_python36 1 Name: python-sgp4 -Version: 2.14 +Version: 2.16 Release: 0 Summary: Track earth satellite TLE orbits using up-to-date 2010 version of SGP4 License: MIT ++++++ sgp4-2.14.tar.gz -> sgp4-2.16.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sgp4-2.14/PKG-INFO new/sgp4-2.16/PKG-INFO --- old/sgp4-2.14/PKG-INFO 2020-12-17 01:31:49.000000000 +0100 +++ new/sgp4-2.16/PKG-INFO 2021-02-12 22:28:18.969517500 +0100 @@ -1,6 +1,6 @@ Metadata-Version: 1.1 Name: sgp4 -Version: 2.14 +Version: 2.16 Summary: Track earth satellite TLE orbits using up-to-date 2020 version of SGP4 Home-page: https://github.com/brandon-rhodes/python-sgp4 Author: Brandon Rhodes @@ -9,7 +9,7 @@ Description: This Python package computes the position and velocity of an earth-orbiting satellite, given the satellite's TLE orbital elements - from a source like `Celestrak <https://celestrak.com/>`_. It implements + from a source like `CelesTrak <https://celestrak.com/>`_. It implements the most recent version of SGP4, and is regularly run against the SGP4 test suite to make sure that its satellite position predictions **agree to within 0.1??mm** with the predictions of the standard distribution of @@ -124,7 +124,10 @@ convention and should return the correct integer in Python. * Some authorities are now distributing satellite elements in an ???OMM??? - Orbit Mean Elements Message format that replaces the TLE format. + Orbit Mean Elements Message format that replaces the TLE format. You + can learn about OMM in Dr.??T.S. Kelso???s `???A New Way to Obtain GP Data??? + <https://celestrak.com/NORAD/documentation/gp-data-formats.php>`_ at + the CelesTrak site. You can already try out experimental support for OMM: @@ -150,6 +153,9 @@ Either way, the satellite object should wind up properly initialized and ready to start producing positions. + If you are interested in saving satellite parameters using the new OMM + format, then read the section on ???Export??? below. + Epoch ----- @@ -307,7 +313,8 @@ ``no_kozai`` Mean motion in radians per minute. - Look at the class's documentation for details. + The parameters are also listed briefly, along with their units, in the + ???Providing your own elements??? section below. Export ------ @@ -315,13 +322,41 @@ If you have a ``Satrec`` you want to share with friends or persist to a file, there???s an export routine that will turn it back into a TLE: - >>> from sgp4.exporter import export_tle - >>> line1, line2 = export_tle(satellite) + >>> from sgp4 import exporter + >>> line1, line2 = exporter.export_tle(satellite) >>> line1 '1 25544U 98067A 19343.69339541 .00001764 00000-0 38792-4 0 9991' >>> line2 '2 25544 51.6439 211.2001 0007417 17.6667 85.6398 15.50103472202482' + And another that produces the fields defined by the new OMM format (see + the ???OMM??? section above): + + >>> from pprint import pprint + >>> fields = exporter.export_omm(satellite, 'ISS (ZARYA)') + >>> pprint(fields) + {'ARG_OF_PERICENTER': 17.6667, + 'BSTAR': 3.8792e-05, + 'CENTER_NAME': 'EARTH', + 'CLASSIFICATION_TYPE': 'U', + 'ECCENTRICITY': 0.0007417, + 'ELEMENT_SET_NO': 999, + 'EPHEMERIS_TYPE': 0, + 'EPOCH': '2019-12-09T16:38:29.363423', + 'INCLINATION': 51.6439, + 'MEAN_ANOMALY': 85.6398, + 'MEAN_ELEMENT_THEORY': 'SGP4', + 'MEAN_MOTION': 15.501034720000002, + 'MEAN_MOTION_DDOT': 0.0, + 'MEAN_MOTION_DOT': 1.764e-05, + 'NORAD_CAT_ID': 25544, + 'OBJECT_ID': '1998-067A', + 'OBJECT_NAME': 'ISS (ZARYA)', + 'RA_OF_ASC_NODE': 211.2001, + 'REF_FRAME': 'TEME', + 'REV_AT_EPOCH': 20248, + 'TIME_SYSTEM': 'UTC'} + Gravity ------- @@ -357,8 +392,8 @@ ... 5, # satnum: Satellite number ... 18441.785, # epoch: days since 1949 December 31 00:00 UT ... 2.8098e-05, # bstar: drag coefficient (/earth radii) - ... 6.969196665e-13, # ndot: ballistic coefficient (revs/day) - ... 0.0, # nddot: second derivative of mean motion (revs/day^3) + ... 6.969196665e-13, # ndot (NOT USED): ballistic coefficient (revs/day) + ... 0.0, # nddot (NOT USED): mean motion 2nd derivative (revs/day^3) ... 0.1859667, # ecco: eccentricity ... 5.7904160274885, # argpo: argument of perigee (radians) ... 0.5980929187319, # inclo: inclination (radians) @@ -367,8 +402,14 @@ ... 6.0863854713832, # nodeo: right ascension of ascending node (radians) ... ) - To compute the ???epoch??? value, simply take a normal Julian date and - subtract ``2433281.5`` days. + The two parameters marked ???NOT USED??? above, ``ndot`` and ``nddot``, do + get saved to the satellite object, and do get written out if you write + the parameters to a TLE or OMM file. But they are ignored by SGP4 when + doing propagation, so you can leave them ``0.0`` without any effect on + the resulting satellite positions. + + To compute the ???epoch??? value, you can simply take a normal Julian date + and subtract ``2433281.5`` days. In addition to setting the attributes natively set by the underlying ``sgp4init()`` routine, this library also goes ahead and sets the date @@ -429,6 +470,8 @@ Changelog --------- + | 2021-02-12 ??? 2.16 ??? Fixed ``days2mdhms()`` rounding to always match TLE epoch. + | 2021-01-08 ??? 2.15 ??? Fixed parsing of the ``satnum`` TLE field in the Python fallback code, when the field has a leading space; added OMM export routine. | 2020-12-16 ??? 2.14 ??? New data formats: added OMM message support for both XML and CSV, and added support for the new Alpha-5 extension to TLE files. | 2020-10-14 ??? 2.13 ??? Enhanced ``sgp4init()`` with custom code that also sets the ``epochdays`` and ``epochyr`` satellite attributes. | 2020-05-28 ??? 2.12 ??? Moved the decision of whether to set the locale during ``twoline2rv()`` from import time to runtime, for users who change locales after their application is up and running. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sgp4-2.14/setup.py new/sgp4-2.16/setup.py --- old/sgp4-2.14/setup.py 2020-12-16 20:38:56.000000000 +0100 +++ new/sgp4-2.16/setup.py 2021-02-12 22:28:12.257153000 +0100 @@ -1,4 +1,5 @@ import os +import re import sys from distutils.core import setup, Extension from textwrap import dedent @@ -7,7 +8,12 @@ description, long_description = sgp4.__doc__.split('\n', 1) satdoc = dedent(sgp4.model.Satellite.__doc__.split('\n', 1)[1]) -long_description = long_description.replace('entry.', 'entry.' + satdoc) +long_description = re.sub( + r'\s+\[INSERT CLASS DOCSTRING HERE.\]\s+', + satdoc, + long_description, + re.M, +) # Force compilation on Travis CI + Python 3 to make sure it keeps working. optional = True @@ -31,10 +37,11 @@ # multiple processors when available? # extra_compile_args=['-fopenmp'], # extra_link_args=['-fopenmp'], + extra_compile_args=['-ffloat-store'], )) setup(name = 'sgp4', - version = '2.14', + version = '2.16', description = description, long_description = long_description, license = 'MIT', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sgp4-2.14/sgp4/__init__.py new/sgp4-2.16/sgp4/__init__.py --- old/sgp4-2.14/sgp4/__init__.py 2020-12-16 20:38:56.000000000 +0100 +++ new/sgp4-2.16/sgp4/__init__.py 2021-02-12 22:28:12.257153000 +0100 @@ -3,7 +3,7 @@ This Python package computes the position and velocity of an earth-orbiting satellite, given the satellite's TLE orbital elements -from a source like `Celestrak <https://celestrak.com/>`_. It implements +from a source like `CelesTrak <https://celestrak.com/>`_. It implements the most recent version of SGP4, and is regularly run against the SGP4 test suite to make sure that its satellite position predictions **agree to within 0.1??mm** with the predictions of the standard distribution of @@ -118,7 +118,10 @@ convention and should return the correct integer in Python. * Some authorities are now distributing satellite elements in an ???OMM??? - Orbit Mean Elements Message format that replaces the TLE format. + Orbit Mean Elements Message format that replaces the TLE format. You + can learn about OMM in Dr.??T.S. Kelso???s `???A New Way to Obtain GP Data??? + <https://celestrak.com/NORAD/documentation/gp-data-formats.php>`_ at + the CelesTrak site. You can already try out experimental support for OMM: @@ -144,6 +147,9 @@ Either way, the satellite object should wind up properly initialized and ready to start producing positions. +If you are interested in saving satellite parameters using the new OMM +format, then read the section on ???Export??? below. + Epoch ----- @@ -268,7 +274,10 @@ ---------- The attributes of a ``Satrec`` object carry the data loaded from the TLE -entry. Look at the class's documentation for details. +entry. [INSERT CLASS DOCSTRING HERE.] + +The parameters are also listed briefly, along with their units, in the +???Providing your own elements??? section below. Export ------ @@ -276,13 +285,41 @@ If you have a ``Satrec`` you want to share with friends or persist to a file, there???s an export routine that will turn it back into a TLE: ->>> from sgp4.exporter import export_tle ->>> line1, line2 = export_tle(satellite) +>>> from sgp4 import exporter +>>> line1, line2 = exporter.export_tle(satellite) >>> line1 '1 25544U 98067A 19343.69339541 .00001764 00000-0 38792-4 0 9991' >>> line2 '2 25544 51.6439 211.2001 0007417 17.6667 85.6398 15.50103472202482' +And another that produces the fields defined by the new OMM format (see +the ???OMM??? section above): + +>>> from pprint import pprint +>>> fields = exporter.export_omm(satellite, 'ISS (ZARYA)') +>>> pprint(fields) +{'ARG_OF_PERICENTER': 17.6667, + 'BSTAR': 3.8792e-05, + 'CENTER_NAME': 'EARTH', + 'CLASSIFICATION_TYPE': 'U', + 'ECCENTRICITY': 0.0007417, + 'ELEMENT_SET_NO': 999, + 'EPHEMERIS_TYPE': 0, + 'EPOCH': '2019-12-09T16:38:29.363423', + 'INCLINATION': 51.6439, + 'MEAN_ANOMALY': 85.6398, + 'MEAN_ELEMENT_THEORY': 'SGP4', + 'MEAN_MOTION': 15.501034720000002, + 'MEAN_MOTION_DDOT': 0.0, + 'MEAN_MOTION_DOT': 1.764e-05, + 'NORAD_CAT_ID': 25544, + 'OBJECT_ID': '1998-067A', + 'OBJECT_NAME': 'ISS (ZARYA)', + 'RA_OF_ASC_NODE': 211.2001, + 'REF_FRAME': 'TEME', + 'REV_AT_EPOCH': 20248, + 'TIME_SYSTEM': 'UTC'} + Gravity ------- @@ -318,8 +355,8 @@ ... 5, # satnum: Satellite number ... 18441.785, # epoch: days since 1949 December 31 00:00 UT ... 2.8098e-05, # bstar: drag coefficient (/earth radii) -... 6.969196665e-13, # ndot: ballistic coefficient (revs/day) -... 0.0, # nddot: second derivative of mean motion (revs/day^3) +... 6.969196665e-13, # ndot (NOT USED): ballistic coefficient (revs/day) +... 0.0, # nddot (NOT USED): mean motion 2nd derivative (revs/day^3) ... 0.1859667, # ecco: eccentricity ... 5.7904160274885, # argpo: argument of perigee (radians) ... 0.5980929187319, # inclo: inclination (radians) @@ -328,8 +365,14 @@ ... 6.0863854713832, # nodeo: right ascension of ascending node (radians) ... ) -To compute the ???epoch??? value, simply take a normal Julian date and -subtract ``2433281.5`` days. +The two parameters marked ???NOT USED??? above, ``ndot`` and ``nddot``, do +get saved to the satellite object, and do get written out if you write +the parameters to a TLE or OMM file. But they are ignored by SGP4 when +doing propagation, so you can leave them ``0.0`` without any effect on +the resulting satellite positions. + +To compute the ???epoch??? value, you can simply take a normal Julian date +and subtract ``2433281.5`` days. In addition to setting the attributes natively set by the underlying ``sgp4init()`` routine, this library also goes ahead and sets the date @@ -390,6 +433,8 @@ Changelog --------- +| 2021-02-12 ??? 2.16 ??? Fixed ``days2mdhms()`` rounding to always match TLE epoch. +| 2021-01-08 ??? 2.15 ??? Fixed parsing of the ``satnum`` TLE field in the Python fallback code, when the field has a leading space; added OMM export routine. | 2020-12-16 ??? 2.14 ??? New data formats: added OMM message support for both XML and CSV, and added support for the new Alpha-5 extension to TLE files. | 2020-10-14 ??? 2.13 ??? Enhanced ``sgp4init()`` with custom code that also sets the ``epochdays`` and ``epochyr`` satellite attributes. | 2020-05-28 ??? 2.12 ??? Moved the decision of whether to set the locale during ``twoline2rv()`` from import time to runtime, for users who change locales after their application is up and running. diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sgp4-2.14/sgp4/exporter.py new/sgp4-2.16/sgp4/exporter.py --- old/sgp4-2.14/sgp4/exporter.py 2020-12-16 20:38:56.000000000 +0100 +++ new/sgp4-2.16/sgp4/exporter.py 2021-02-12 22:28:12.257153000 +0100 @@ -5,6 +5,7 @@ """ from math import pi from sgp4.io import compute_checksum +from sgp4.conveniences import sat_epoch_datetime # Define constants _deg2rad = pi / 180.0 # 0.0174532925199433 @@ -103,3 +104,32 @@ line2 += str(compute_checksum(line2)) return line1, line2 + +def export_omm(satrec, object_name): + launch_year = int(satrec.intldesg[:2]) + launch_year += 1900 + (launch_year < 57) * 100 + object_id = '{0}-{1}'.format(launch_year, satrec.intldesg[2:]) + + return { + "OBJECT_NAME": object_name, + "OBJECT_ID": object_id, + "CENTER_NAME": "EARTH", + "REF_FRAME": "TEME", + "TIME_SYSTEM": "UTC", + "MEAN_ELEMENT_THEORY": "SGP4", + "EPOCH": sat_epoch_datetime(satrec).strftime('%Y-%m-%dT%H:%M:%S.%f'), + "MEAN_MOTION": satrec.no_kozai * _xpdotp, + "ECCENTRICITY": satrec.ecco, + "INCLINATION": satrec.inclo / _deg2rad, + "RA_OF_ASC_NODE": satrec.nodeo / _deg2rad, + "ARG_OF_PERICENTER": satrec.argpo / _deg2rad, + "MEAN_ANOMALY": satrec.mo / _deg2rad, + "EPHEMERIS_TYPE": satrec.ephtype, + "CLASSIFICATION_TYPE": satrec.classification, + "NORAD_CAT_ID": satrec.satnum, + "ELEMENT_SET_NO": satrec.elnum, + "REV_AT_EPOCH": satrec.revnum, + "BSTAR": satrec.bstar, + "MEAN_MOTION_DOT": satrec.ndot * (_xpdotp * 1440.0), + "MEAN_MOTION_DDOT": satrec.nddot * (_xpdotp * 1440.0 * 1440), + } diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sgp4-2.14/sgp4/functions.py new/sgp4-2.16/sgp4/functions.py --- old/sgp4-2.14/sgp4/functions.py 2020-06-07 19:19:26.000000000 +0200 +++ new/sgp4-2.16/sgp4/functions.py 2021-02-12 22:28:12.257153000 +0100 @@ -5,8 +5,6 @@ routines instead. """ -from math import trunc - def jday(year, mon, day, hr, minute, sec): """Return two floats that, when added, produce the specified Julian date. @@ -43,9 +41,9 @@ def days2mdhms(year, days, round_to_microsecond=6): """Convert a float point number of days into the year into date and time. - Given the integer year plus the "day of the year" (where 1.0 means + Given the integer year plus the "day of the year" where 1.0 means the beginning of January 1, 2.0 means the beginning of January 2, - and so forth), returns the Gregorian calendar month, day, hour, + and so forth, return the Gregorian calendar month, day, hour, minute, and floating point seconds. >>> days2mdhms(2000, 1.0) # January 1 @@ -55,28 +53,28 @@ >>> days2mdhms(2000, 366.0) # December 31, since 2000 was a leap year (12, 31, 0, 0, 0.0) + The floating point seconds are rounded to an even number of + microseconds if ``round_to_microsecond`` is true. + """ - whole, fraction = divmod(days, 1.0) + second = days * 86400.0 + if round_to_microsecond: + second = round(second, round_to_microsecond) + + minute, second = divmod(second, 60.0) + if round_to_microsecond: + second = round(second, round_to_microsecond) + + minute = int(minute) + hour, minute = divmod(minute, 60) + day_of_year, hour = divmod(hour, 24) is_leap = year % 400 == 0 or (year % 4 == 0 and year % 100 != 0) - month, day = _day_of_year_to_month_day(int(whole), is_leap) + month, day = _day_of_year_to_month_day(day_of_year, is_leap) if month == 13: # behave like the original in case of overflow month = 12 day += 31 - # The 8 digits of floating point day specified in the TLE have a - # resolution of exactly 1e-8 * 24 * 3600 * 1e6 = 864 microseconds, - # so round off any floating-point noise beyond the microsecond. - if round_to_microsecond: - fraction += 0.5 / 86400e6 - - second = fraction * 86400.0 - minute, second = divmod(second, 60.0) - hour, minute = divmod(minute, 60.0) - - if round_to_microsecond: - second = trunc(second * 1e6) / 1e6 - return month, day, int(hour), int(minute), second def _day_of_year_to_month_day(day_of_year, is_leap): diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sgp4-2.14/sgp4/io.py new/sgp4-2.16/sgp4/io.py --- old/sgp4-2.14/sgp4/io.py 2020-12-16 20:38:56.000000000 +0100 +++ new/sgp4-2.16/sgp4/io.py 2021-02-12 22:28:12.257153000 +0100 @@ -271,7 +271,7 @@ return sum((int(c) if c.isdigit() else c == '-') for c in line[0:68]) % 10 def _alpha5(s): - if s[0].isdigit(): + if not s[0].isalpha(): return int(s) c = s[0] n = ord(c) - ord('A') + 10 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/sgp4-2.14/sgp4/tests.py new/sgp4-2.16/sgp4/tests.py --- old/sgp4-2.14/sgp4/tests.py 2020-12-16 20:38:56.000000000 +0100 +++ new/sgp4-2.16/sgp4/tests.py 2021-02-12 22:28:12.261153200 +0100 @@ -25,10 +25,11 @@ from sgp4.functions import days2mdhms, _day_of_year_to_month_day from sgp4.propagation import sgp4, sgp4init from sgp4 import conveniences, io, omm -from sgp4.exporter import export_tle +from sgp4.exporter import export_omm, export_tle import sgp4.model as model _testcase = TestCase('setUp') +_testcase.maxDiff = 9999 assertEqual = _testcase.assertEqual assertAlmostEqual = _testcase.assertAlmostEqual assertRaises = _testcase.assertRaises @@ -290,6 +291,13 @@ # Special Cases # +def test_satnum_leading_spaces(): + # https://github.com/brandon-rhodes/python-sgp4/issues/81 + l1 = '1 4859U 21001A 21007.63955392 .00000000 00000+0 00000+0 0 9990' + l2 = '2 4859 000.0000 000.0000 0000000 000.0000 000.0000 01.00000000 09' + sat = Satrec.twoline2rv(l1, l2) + assertEqual(sat.satnum, 4859) + def test_satnum_alpha5_encoding(): def make_sat(satnum_string): return Satrec.twoline2rv(LINE1.replace('00005', satnum_string), @@ -528,6 +536,7 @@ # output in tcppver.out. data = get_data(__name__, 'tcppver.out') + data = data.replace(b'\r', b'') tcppver_lines = data.decode('ascii').splitlines(True) error_list = [] @@ -733,6 +742,38 @@ value2 = round(value2, 10) assertEqual(value1, value2, '%s %r != %r' % (attr, value1, value2)) +# Live example of OMM: +# https://celestrak.com/NORAD/elements/gp.php?INTDES=2020-025&FORMAT=JSON-PRETTY + +def test_omm_export(): + line0, line1, line2 = VANGUARD_TLE.splitlines() + sat = Satrec.twoline2rv(line1, line2) + + fields = export_omm(sat, 'VANGUARD 1') + assertEqual(fields, { + 'ARG_OF_PERICENTER': 162.2516, + 'BSTAR': -2.2483e-05, + 'CENTER_NAME': 'EARTH', + 'CLASSIFICATION_TYPE': 'U', + 'ECCENTRICITY': 0.1845686, + 'ELEMENT_SET_NO': 999, + 'EPHEMERIS_TYPE': 0, + 'EPOCH': '2020-10-13T04:52:48.472320', + 'INCLINATION': 34.2443, + 'MEAN_ANOMALY': 205.2356, + 'MEAN_ELEMENT_THEORY': 'SGP4', + 'MEAN_MOTION': 10.84869164, + 'MEAN_MOTION_DDOT': 0.0, + 'MEAN_MOTION_DOT': -1.6e-07, + 'NORAD_CAT_ID': 5, + 'OBJECT_ID': '1958-002B', + 'OBJECT_NAME': 'VANGUARD 1', + 'RA_OF_ASC_NODE': 225.5254, + 'REF_FRAME': 'TEME', + 'REV_AT_EPOCH': 21814, + 'TIME_SYSTEM': 'UTC', + }) + # ---------------------------------------------------------------------- def load_tests(loader, tests, ignore):
