Fileseq 2.3.0__tar.gz → 2.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (246) hide show
  1. {fileseq-2.3.0/src/Fileseq.egg-info → fileseq-2.3.2}/PKG-INFO +1 -1
  2. {fileseq-2.3.0 → fileseq-2.3.2/src/Fileseq.egg-info}/PKG-INFO +1 -1
  3. {fileseq-2.3.0 → fileseq-2.3.2}/src/Fileseq.egg-info/SOURCES.txt +1 -0
  4. fileseq-2.3.2/src/fileseq/__version__.py +1 -0
  5. {fileseq-2.3.0 → fileseq-2.3.2}/src/fileseq/filesequence.py +11 -3
  6. {fileseq-2.3.0 → fileseq-2.3.2}/src/fileseq/frameset.py +3 -1
  7. fileseq-2.3.2/test/subframe_seqneg/bar.0000.5000.exr +0 -0
  8. {fileseq-2.3.0 → fileseq-2.3.2}/test/test_unit.py +185 -1
  9. fileseq-2.3.0/src/fileseq/__version__.py +0 -1
  10. {fileseq-2.3.0 → fileseq-2.3.2}/LICENSE +0 -0
  11. {fileseq-2.3.0 → fileseq-2.3.2}/MANIFEST.in +0 -0
  12. {fileseq-2.3.0 → fileseq-2.3.2}/README.md +0 -0
  13. {fileseq-2.3.0 → fileseq-2.3.2}/setup.cfg +0 -0
  14. {fileseq-2.3.0 → fileseq-2.3.2}/setup.py +0 -0
  15. {fileseq-2.3.0 → fileseq-2.3.2}/src/Fileseq.egg-info/dependency_links.txt +0 -0
  16. {fileseq-2.3.0 → fileseq-2.3.2}/src/Fileseq.egg-info/top_level.txt +0 -0
  17. {fileseq-2.3.0 → fileseq-2.3.2}/src/fileseq/__init__.py +0 -0
  18. {fileseq-2.3.0 → fileseq-2.3.2}/src/fileseq/constants.py +0 -0
  19. {fileseq-2.3.0 → fileseq-2.3.2}/src/fileseq/exceptions.py +0 -0
  20. {fileseq-2.3.0 → fileseq-2.3.2}/src/fileseq/py.typed +0 -0
  21. {fileseq-2.3.0 → fileseq-2.3.2}/src/fileseq/utils.py +0 -0
  22. {fileseq-2.3.0 → fileseq-2.3.2}/test/__init__.py +0 -0
  23. {fileseq-2.3.0 → fileseq-2.3.2}/test/broken_seq/broke.0000.exr +0 -0
  24. {fileseq-2.3.0 → fileseq-2.3.2}/test/broken_seq/broke.0001.exr +0 -0
  25. {fileseq-2.3.0 → fileseq-2.3.2}/test/broken_seq/broke.0002.exr +0 -0
  26. {fileseq-2.3.0 → fileseq-2.3.2}/test/broken_seq/broke.0004.exr +0 -0
  27. {fileseq-2.3.0 → fileseq-2.3.2}/test/broken_seq/broke.0006.exr +0 -0
  28. {fileseq-2.3.0 → fileseq-2.3.2}/test/broken_seq/broke.0007.exr +0 -0
  29. {fileseq-2.3.0 → fileseq-2.3.2}/test/broken_seq/broke.0008.exr +0 -0
  30. {fileseq-2.3.0 → fileseq-2.3.2}/test/complex_ext/1.a.jpg +0 -0
  31. {fileseq-2.3.0 → fileseq-2.3.2}/test/complex_ext/2.a.jpg +0 -0
  32. {fileseq-2.3.0 → fileseq-2.3.2}/test/complex_ext/3.a.jpg +0 -0
  33. {fileseq-2.3.0 → fileseq-2.3.2}/test/complex_ext/file.5.a.ext +0 -0
  34. {fileseq-2.3.0 → fileseq-2.3.2}/test/complex_ext/file.6.a.ext +0 -0
  35. {fileseq-2.3.0 → fileseq-2.3.2}/test/complex_ext/file.7.a.ext +0 -0
  36. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.-0001.ext +0 -0
  37. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.-001.ext +0 -0
  38. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.-1.ext +0 -0
  39. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.00.ext +0 -0
  40. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.0000.ext +0 -0
  41. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.00000.ext +0 -0
  42. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.00001.ext +0 -0
  43. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.00002.ext +0 -0
  44. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.00003.ext +0 -0
  45. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.00004.ext +0 -0
  46. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.00005.ext +0 -0
  47. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.0001.ext +0 -0
  48. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.0002.ext +0 -0
  49. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.0003.ext +0 -0
  50. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.0004.ext +0 -0
  51. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.0005.ext +0 -0
  52. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.01.ext +0 -0
  53. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.02.ext +0 -0
  54. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.03.ext +0 -0
  55. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.04.ext +0 -0
  56. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed/seq.05.ext +0 -0
  57. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed_case/sub/file_FOO_004.ext +0 -0
  58. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed_case/sub/file_FOO_005.ext +0 -0
  59. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed_case/sub/file_FOO_006.ext +0 -0
  60. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed_case/sub/file_foo_001.ext +0 -0
  61. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed_case/sub/file_foo_002.ext +0 -0
  62. {fileseq-2.3.0 → fileseq-2.3.2}/test/mixed_case/sub/file_foo_003.ext +0 -0
  63. {fileseq-2.3.0 → fileseq-2.3.2}/test/multi_range/file_0003.0001.exr +0 -0
  64. {fileseq-2.3.0 → fileseq-2.3.2}/test/multi_range/file_0004.0001.exr +0 -0
  65. {fileseq-2.3.0 → fileseq-2.3.2}/test/multi_range/file_0005.0001.exr +0 -0
  66. {fileseq-2.3.0 → fileseq-2.3.2}/test/pytest.ini +0 -0
  67. {fileseq-2.3.0 → fileseq-2.3.2}/test/run.py +0 -0
  68. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/0001.exr +0 -0
  69. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/0002.exr +0 -0
  70. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/0003.exr +0 -0
  71. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/bar1000.exr +0 -0
  72. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/bar1001.exr +0 -0
  73. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/bar1002.exr +0 -0
  74. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/bar1004.exr +0 -0
  75. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/bar1005.exr +0 -0
  76. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/bar1006.exr +0 -0
  77. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/baz_left.0001.exr +0 -0
  78. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/baz_left.0002.exr +0 -0
  79. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/baz_left.0003.exr +0 -0
  80. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/baz_right.0001.exr +0 -0
  81. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/baz_right.0002.exr +0 -0
  82. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/baz_right.0003.exr +0 -0
  83. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/big.0999.ext +0 -0
  84. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/big.1000.ext +0 -0
  85. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/big.1001.ext +0 -0
  86. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/big.1002.ext +0 -0
  87. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/big.1003.ext +0 -0
  88. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0001.exr +0 -0
  89. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0001.jpg +0 -0
  90. /fileseq-2.3.0/test/seq/foo.0002.exr → /fileseq-2.3.2/test/seq/foo.0001_1.exr +0 -0
  91. {fileseq-2.3.0/test/seqhidden → fileseq-2.3.2/test/seq}/foo.0002.exr +0 -0
  92. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0002.jpg +0 -0
  93. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0003.exr +0 -0
  94. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0003.jpg +0 -0
  95. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0004.exr +0 -0
  96. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0004.jpg +0 -0
  97. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0005.exr +0 -0
  98. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.0005.jpg +0 -0
  99. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.debug.0001.exr +0 -0
  100. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.debug.0002.exr +0 -0
  101. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.debug.0003.exr +0 -0
  102. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.debug.0004.exr +0 -0
  103. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo.debug.0005.exr +0 -0
  104. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo_0001.exr +0 -0
  105. {fileseq-2.3.0 → fileseq-2.3.2}/test/seq/foo_0001_extra.exr +0 -0
  106. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.bar1000.exr +0 -0
  107. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.bar1001.exr +0 -0
  108. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.bar1002.exr +0 -0
  109. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.bar1004.exr +0 -0
  110. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.bar1005.exr +0 -0
  111. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.bar1006.exr +0 -0
  112. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0001.exr +0 -0
  113. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0001.jpg +0 -0
  114. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0002.exr +0 -0
  115. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0002.jpg +0 -0
  116. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0003.exr +0 -0
  117. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0003.jpg +0 -0
  118. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0004.exr +0 -0
  119. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0004.jpg +0 -0
  120. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0005.exr +0 -0
  121. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.foo.0005.jpg +0 -0
  122. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/.hidden +0 -0
  123. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/bar1000.exr +0 -0
  124. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/bar1001.exr +0 -0
  125. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/bar1002.exr +0 -0
  126. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/bar1004.exr +0 -0
  127. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/bar1005.exr +0 -0
  128. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/bar1006.exr +0 -0
  129. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0001.exr +0 -0
  130. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0001.jpg +0 -0
  131. {fileseq-2.3.0/test/seqsubdirs/sub1 → fileseq-2.3.2/test/seqhidden}/foo.0002.exr +0 -0
  132. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0002.jpg +0 -0
  133. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0003.exr +0 -0
  134. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0003.jpg +0 -0
  135. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0004.exr +0 -0
  136. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0004.jpg +0 -0
  137. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0005.exr +0 -0
  138. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqhidden/foo.0005.jpg +0 -0
  139. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqneg/bar.-001.exr +0 -0
  140. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqneg/bar.0000.exr +0 -0
  141. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqneg/bar.0001.exr +0 -0
  142. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/0001.exr +0 -0
  143. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/0002.exr +0 -0
  144. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/0003.exr +0 -0
  145. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/bar1000.exr +0 -0
  146. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/bar1001.exr +0 -0
  147. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/bar1002.exr +0 -0
  148. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/bar1004.exr +0 -0
  149. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/bar1005.exr +0 -0
  150. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/bar1006.exr +0 -0
  151. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/foo.0001.exr +0 -0
  152. {fileseq-2.3.0 → fileseq-2.3.2}/test/seqsubdirs/sub1/foo.0001.jpg +0 -0
  153. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.0002.jpg → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0002.exr +0 -0
  154. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.0003.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0002.jpg +0 -0
  155. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.0003.jpg → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0003.exr +0 -0
  156. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.0004.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0003.jpg +0 -0
  157. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.0004.jpg → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0004.exr +0 -0
  158. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.0005.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0004.jpg +0 -0
  159. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.0005.jpg → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0005.exr +0 -0
  160. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.debug.0001.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.0005.jpg +0 -0
  161. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.debug.0002.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.debug.0001.exr +0 -0
  162. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.debug.0003.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.debug.0002.exr +0 -0
  163. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.debug.0004.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.debug.0003.exr +0 -0
  164. /fileseq-2.3.0/test/seqsubdirs/sub1/foo.debug.0005.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.debug.0004.exr +0 -0
  165. /fileseq-2.3.0/test/seqsubdirs/sub1/foo_0001.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo.debug.0005.exr +0 -0
  166. /fileseq-2.3.0/test/step_seq/step1.0001.exr → /fileseq-2.3.2/test/seqsubdirs/sub1/foo_0001.exr +0 -0
  167. /fileseq-2.3.0/test/step_seq/step1.0005.exr → /fileseq-2.3.2/test/step_seq/step1.0001.exr +0 -0
  168. /fileseq-2.3.0/test/step_seq/step1.0009.exr → /fileseq-2.3.2/test/step_seq/step1.0005.exr +0 -0
  169. /fileseq-2.3.0/test/step_seq/step1.0013.exr → /fileseq-2.3.2/test/step_seq/step1.0009.exr +0 -0
  170. /fileseq-2.3.0/test/step_seq/step1.0014.exr → /fileseq-2.3.2/test/step_seq/step1.0013.exr +0 -0
  171. /fileseq-2.3.0/test/step_seq/step1.0015.exr → /fileseq-2.3.2/test/step_seq/step1.0014.exr +0 -0
  172. /fileseq-2.3.0/test/step_seq/step1.0016.exr → /fileseq-2.3.2/test/step_seq/step1.0015.exr +0 -0
  173. /fileseq-2.3.0/test/step_seq/step1.0017.exr → /fileseq-2.3.2/test/step_seq/step1.0016.exr +0 -0
  174. /fileseq-2.3.0/test/subframe_seq/bar.0001.0000.exr → /fileseq-2.3.2/test/step_seq/step1.0017.exr +0 -0
  175. /fileseq-2.3.0/test/subframe_seq/baz.0001.0000.exr → /fileseq-2.3.2/test/subframe_seq/bar.0001.0000.exr +0 -0
  176. /fileseq-2.3.0/test/subframe_seq/baz.0001.2500.exr → /fileseq-2.3.2/test/subframe_seq/baz.0001.0000.exr +0 -0
  177. /fileseq-2.3.0/test/subframe_seq/baz.0001.5000.exr → /fileseq-2.3.2/test/subframe_seq/baz.0001.2500.exr +0 -0
  178. /fileseq-2.3.0/test/subframe_seq/baz.0001.7500.exr → /fileseq-2.3.2/test/subframe_seq/baz.0001.5000.exr +0 -0
  179. /fileseq-2.3.0/test/subframe_seq/baz.0002.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz.0001.7500.exr +0 -0
  180. /fileseq-2.3.0/test/subframe_seq/baz.0003.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz.0002.0000.exr +0 -0
  181. /fileseq-2.3.0/test/subframe_seq/baz.0003.2500.exr → /fileseq-2.3.2/test/subframe_seq/baz.0003.0000.exr +0 -0
  182. /fileseq-2.3.0/test/subframe_seq/baz.0003.5000.exr → /fileseq-2.3.2/test/subframe_seq/baz.0003.2500.exr +0 -0
  183. /fileseq-2.3.0/test/subframe_seq/baz.0003.7500.exr → /fileseq-2.3.2/test/subframe_seq/baz.0003.5000.exr +0 -0
  184. /fileseq-2.3.0/test/subframe_seq/baz.0004.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz.0003.7500.exr +0 -0
  185. /fileseq-2.3.0/test/subframe_seq/baz_left.1001.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz.0004.0000.exr +0 -0
  186. /fileseq-2.3.0/test/subframe_seq/baz_left.1001.2500.exr → /fileseq-2.3.2/test/subframe_seq/baz_left.1001.0000.exr +0 -0
  187. /fileseq-2.3.0/test/subframe_seq/baz_left.1001.5000.exr → /fileseq-2.3.2/test/subframe_seq/baz_left.1001.2500.exr +0 -0
  188. /fileseq-2.3.0/test/subframe_seq/baz_left.1001.7500.exr → /fileseq-2.3.2/test/subframe_seq/baz_left.1001.5000.exr +0 -0
  189. /fileseq-2.3.0/test/subframe_seq/baz_left.1002.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz_left.1001.7500.exr +0 -0
  190. /fileseq-2.3.0/test/subframe_seq/baz_right.1001.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz_left.1002.0000.exr +0 -0
  191. /fileseq-2.3.0/test/subframe_seq/baz_right.1001.2500.exr → /fileseq-2.3.2/test/subframe_seq/baz_right.1001.0000.exr +0 -0
  192. /fileseq-2.3.0/test/subframe_seq/baz_right.1001.5000.exr → /fileseq-2.3.2/test/subframe_seq/baz_right.1001.2500.exr +0 -0
  193. /fileseq-2.3.0/test/subframe_seq/baz_right.1001.7500.exr → /fileseq-2.3.2/test/subframe_seq/baz_right.1001.5000.exr +0 -0
  194. /fileseq-2.3.0/test/subframe_seq/baz_right.1002.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz_right.1001.7500.exr +0 -0
  195. /fileseq-2.3.0/test/subframe_seq/foo.0001.0000.exr → /fileseq-2.3.2/test/subframe_seq/baz_right.1002.0000.exr +0 -0
  196. /fileseq-2.3.0/test/subframe_seq/foo.0001.0000.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0001.0000.exr +0 -0
  197. /fileseq-2.3.0/test/subframe_seq/foo.0001.2500.exr → /fileseq-2.3.2/test/subframe_seq/foo.0001.0000.jpg +0 -0
  198. /fileseq-2.3.0/test/subframe_seq/foo.0001.2500.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0001.2500.exr +0 -0
  199. /fileseq-2.3.0/test/subframe_seq/foo.0001.5000.exr → /fileseq-2.3.2/test/subframe_seq/foo.0001.2500.jpg +0 -0
  200. /fileseq-2.3.0/test/subframe_seq/foo.0001.5000.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0001.5000.exr +0 -0
  201. /fileseq-2.3.0/test/subframe_seq/foo.0001.7500.exr → /fileseq-2.3.2/test/subframe_seq/foo.0001.5000.jpg +0 -0
  202. /fileseq-2.3.0/test/subframe_seq/foo.0001.7500.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0001.7500.exr +0 -0
  203. /fileseq-2.3.0/test/subframe_seq/foo.0002.0000.exr → /fileseq-2.3.2/test/subframe_seq/foo.0001.7500.jpg +0 -0
  204. /fileseq-2.3.0/test/subframe_seq/foo.0002.0000.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0002.0000.exr +0 -0
  205. /fileseq-2.3.0/test/subframe_seq/foo.0002.2500.exr → /fileseq-2.3.2/test/subframe_seq/foo.0002.0000.jpg +0 -0
  206. /fileseq-2.3.0/test/subframe_seq/foo.0002.2500.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0002.2500.exr +0 -0
  207. /fileseq-2.3.0/test/subframe_seq/foo.0002.5000.exr → /fileseq-2.3.2/test/subframe_seq/foo.0002.2500.jpg +0 -0
  208. /fileseq-2.3.0/test/subframe_seq/foo.0002.5000.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0002.5000.exr +0 -0
  209. /fileseq-2.3.0/test/subframe_seq/foo.0002.7500.exr → /fileseq-2.3.2/test/subframe_seq/foo.0002.5000.jpg +0 -0
  210. /fileseq-2.3.0/test/subframe_seq/foo.0002.7500.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0002.7500.exr +0 -0
  211. /fileseq-2.3.0/test/subframe_seq/foo.0003.0000.exr → /fileseq-2.3.2/test/subframe_seq/foo.0002.7500.jpg +0 -0
  212. /fileseq-2.3.0/test/subframe_seq/foo.0003.0000.jpg → /fileseq-2.3.2/test/subframe_seq/foo.0003.0000.exr +0 -0
  213. /fileseq-2.3.0/test/subframe_seq/foz.1001.0000.exr → /fileseq-2.3.2/test/subframe_seq/foo.0003.0000.jpg +0 -0
  214. /fileseq-2.3.0/test/subframe_seq/foz.1001.2500.exr → /fileseq-2.3.2/test/subframe_seq/foz.1001.0000.exr +0 -0
  215. /fileseq-2.3.0/test/subframe_seq/foz.1001.5000.exr → /fileseq-2.3.2/test/subframe_seq/foz.1001.2500.exr +0 -0
  216. /fileseq-2.3.0/test/subframe_seq/foz.1001.7500.exr → /fileseq-2.3.2/test/subframe_seq/foz.1001.5000.exr +0 -0
  217. /fileseq-2.3.0/test/subframe_seq/foz.1002.0000.exr → /fileseq-2.3.2/test/subframe_seq/foz.1001.7500.exr +0 -0
  218. /fileseq-2.3.0/test/subframe_seq/foz.1002.2500.exr → /fileseq-2.3.2/test/subframe_seq/foz.1002.0000.exr +0 -0
  219. /fileseq-2.3.0/test/subframe_seq/foz.1002.5000.exr → /fileseq-2.3.2/test/subframe_seq/foz.1002.2500.exr +0 -0
  220. /fileseq-2.3.0/test/subframe_seq/foz.1002.7500.exr → /fileseq-2.3.2/test/subframe_seq/foz.1002.5000.exr +0 -0
  221. /fileseq-2.3.0/test/subframe_seq/foz.1003.0000.exr → /fileseq-2.3.2/test/subframe_seq/foz.1002.7500.exr +0 -0
  222. /fileseq-2.3.0/test/subframe_seq/foz.debug.1001.0000.exr → /fileseq-2.3.2/test/subframe_seq/foz.1003.0000.exr +0 -0
  223. /fileseq-2.3.0/test/subframe_seq/foz.debug.1001.2500.exr → /fileseq-2.3.2/test/subframe_seq/foz.debug.1001.0000.exr +0 -0
  224. /fileseq-2.3.0/test/subframe_seq/foz.debug.1001.5000.exr → /fileseq-2.3.2/test/subframe_seq/foz.debug.1001.2500.exr +0 -0
  225. /fileseq-2.3.0/test/subframe_seq/foz.debug.1001.7500.exr → /fileseq-2.3.2/test/subframe_seq/foz.debug.1001.5000.exr +0 -0
  226. /fileseq-2.3.0/test/subframe_seq/foz.debug.1002.0000.exr → /fileseq-2.3.2/test/subframe_seq/foz.debug.1001.7500.exr +0 -0
  227. /fileseq-2.3.0/test/subframe_seq/guz.0001.00.exr → /fileseq-2.3.2/test/subframe_seq/foz.debug.1002.0000.exr +0 -0
  228. /fileseq-2.3.0/test/subframe_seq/guz.0001.25.exr → /fileseq-2.3.2/test/subframe_seq/guz.0001.00.exr +0 -0
  229. /fileseq-2.3.0/test/subframe_seq/guz.0001.50.exr → /fileseq-2.3.2/test/subframe_seq/guz.0001.25.exr +0 -0
  230. /fileseq-2.3.0/test/subframe_seq/guz.0001.75.exr → /fileseq-2.3.2/test/subframe_seq/guz.0001.50.exr +0 -0
  231. /fileseq-2.3.0/test/subframe_seq/guz.0002.00.exr → /fileseq-2.3.2/test/subframe_seq/guz.0001.75.exr +0 -0
  232. /fileseq-2.3.0/test/subframe_seq/quux.02.3333.exr → /fileseq-2.3.2/test/subframe_seq/guz.0002.00.exr +0 -0
  233. /fileseq-2.3.0/test/subframe_seq/quux.02.6667.exr → /fileseq-2.3.2/test/subframe_seq/quux.02.3333.exr +0 -0
  234. /fileseq-2.3.0/test/subframe_seq/quux.03.0000.exr → /fileseq-2.3.2/test/subframe_seq/quux.02.6667.exr +0 -0
  235. /fileseq-2.3.0/test/subframe_seq/quux.03.3333.exr → /fileseq-2.3.2/test/subframe_seq/quux.03.0000.exr +0 -0
  236. /fileseq-2.3.0/test/subframe_seq/qux.00.0000.exr → /fileseq-2.3.2/test/subframe_seq/quux.03.3333.exr +0 -0
  237. /fileseq-2.3.0/test/subframe_seq/qux.00.3333.exr → /fileseq-2.3.2/test/subframe_seq/qux.00.0000.exr +0 -0
  238. /fileseq-2.3.0/test/subframe_seq/qux.00.6667.exr → /fileseq-2.3.2/test/subframe_seq/qux.00.3333.exr +0 -0
  239. /fileseq-2.3.0/test/subframe_seq/qux.01.0000.exr → /fileseq-2.3.2/test/subframe_seq/qux.00.6667.exr +0 -0
  240. /fileseq-2.3.0/test/subframe_seq/qux.01.3333.exr → /fileseq-2.3.2/test/subframe_seq/qux.01.0000.exr +0 -0
  241. /fileseq-2.3.0/test/subframe_seq/qux.01.6667.exr → /fileseq-2.3.2/test/subframe_seq/qux.01.3333.exr +0 -0
  242. /fileseq-2.3.0/test/subframe_seq/qux.02.0000.exr → /fileseq-2.3.2/test/subframe_seq/qux.01.6667.exr +0 -0
  243. /fileseq-2.3.0/test/subframe_seqneg/bar.-000.5000.exr → /fileseq-2.3.2/test/subframe_seq/qux.02.0000.exr +0 -0
  244. /fileseq-2.3.0/test/subframe_seqneg/bar.0000.0000.exr → /fileseq-2.3.2/test/subframe_seqneg/bar.-000.5000.exr +0 -0
  245. /fileseq-2.3.0/test/subframe_seqneg/bar.0000.5000.exr → /fileseq-2.3.2/test/subframe_seqneg/bar.0000.0000.exr +0 -0
  246. {fileseq-2.3.0 → fileseq-2.3.2}/test/test_fuzz.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Fileseq
3
- Version: 2.3.0
3
+ Version: 2.3.2
4
4
  Summary: A Python library for parsing frame ranges and file sequences commonly used in VFX and Animation applications.
5
5
  Home-page: https://github.com/justinfx/fileseq
6
6
  Author: Matt Chambers
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: Fileseq
3
- Version: 2.3.0
3
+ Version: 2.3.2
4
4
  Summary: A Python library for parsing frame ranges and file sequences commonly used in VFX and Animation applications.
5
5
  Home-page: https://github.com/justinfx/fileseq
6
6
  Author: Matt Chambers
@@ -84,6 +84,7 @@ test/seq/big.1002.ext
84
84
  test/seq/big.1003.ext
85
85
  test/seq/foo.0001.exr
86
86
  test/seq/foo.0001.jpg
87
+ test/seq/foo.0001_1.exr
87
88
  test/seq/foo.0002.exr
88
89
  test/seq/foo.0002.jpg
89
90
  test/seq/foo.0003.exr
@@ -0,0 +1 @@
1
+ __version__ = '2.3.2'
@@ -963,9 +963,11 @@ class BaseFileSequence(typing.Generic[T]):
963
963
  path: str
964
964
  for path in filter(None, map(utils.asString, paths)):
965
965
  frame = path[head:tail]
966
- try:
967
- int(frame)
968
- except ValueError:
966
+ # Use isdigit() instead of int() to reject PEP 515 underscore
967
+ # digit separators: int("1001_1") succeeds in Python 3.6+ but
968
+ # "1001_1" is not a valid frame number.
969
+ _int_part = frame.partition('.')[0]
970
+ if not _int_part.lstrip('-').isdigit():
969
971
  if not allow_subframes:
970
972
  continue
971
973
  try:
@@ -1505,6 +1507,12 @@ class BaseFileSequence(typing.Generic[T]):
1505
1507
  if len(subframe) != decimal_places:
1506
1508
  continue
1507
1509
 
1510
+ # Reject frames with non-digit characters such as PEP 515
1511
+ # underscore separators (e.g. "1001_1") which int() accepts in
1512
+ # Python 3.6+ but are not valid frame numbers.
1513
+ if not frame.lstrip('-').isdigit():
1514
+ continue
1515
+
1508
1516
  has_padded_frame = check_padded(frame)
1509
1517
  has_padded_subframe = check_padded(subframe)
1510
1518
 
@@ -177,6 +177,7 @@ class FrameSet(BaseFrameSet):
177
177
  frange = str(frange)
178
178
  for key in self.PAD_MAP:
179
179
  frange = frange.replace(key, '')
180
+ frange = ''.join(frange.split()) # https://github.com/justinfx/fileseq/issues/137: strip all whitespace
180
181
  self._frange = asString(frange)
181
182
 
182
183
  # because we're acting like a set, we need to support the empty set
@@ -1485,7 +1486,8 @@ class FrameSet(BaseFrameSet):
1485
1486
  # Dispatch to appropriate specialized method based on frame type
1486
1487
  # Handle empty frames by defaulting to float method
1487
1488
  if frames and isinstance(frames[0], decimal.Decimal):
1488
- yield from FrameSet._framesToFrameRangesDecimal(frames, zfill) # type: ignore[arg-type]
1489
+ # noinspection PyTypeChecker
1490
+ yield from FrameSet._framesToFrameRangesDecimal(frames, zfill)
1489
1491
  else:
1490
1492
  yield from FrameSet._framesToFrameRangesFloat(frames, zfill) # type: ignore[arg-type]
1491
1493
 
File without changes
@@ -657,6 +657,175 @@ class TestFrameSet(unittest.TestCase):
657
657
  actual = list(FrameSet(case.input).batches(case.batch, frames=False))
658
658
  self.assertListEqual(expect, actual, msg=str(case))
659
659
 
660
+ def testWhitespaceHandling(self):
661
+ """
662
+ Issue #137: Whitespace tolerance in frame range parsing.
663
+
664
+ Test that FrameSet correctly handles whitespace in various positions:
665
+ - Spaces after commas
666
+ - Spaces around range operators
667
+ - Leading/trailing spaces
668
+ - Spaces with modifiers (x, y, :)
669
+ - Tabs and newlines
670
+ """
671
+ @dataclasses.dataclass
672
+ class Case:
673
+ input: str
674
+ expected_frange: str
675
+ expected_frames: list[int]
676
+ description: str
677
+
678
+ table = [
679
+ # Basic whitespace after commas
680
+ Case(
681
+ input='1, 2, 3',
682
+ expected_frange='1,2,3',
683
+ expected_frames=[1, 2, 3],
684
+ description='spaces after commas'
685
+ ),
686
+ Case(
687
+ input='1 , 2 , 3',
688
+ expected_frange='1,2,3',
689
+ expected_frames=[1, 2, 3],
690
+ description='spaces before and after commas'
691
+ ),
692
+
693
+ # Whitespace around range operators
694
+ Case(
695
+ input='1 - 10',
696
+ expected_frange='1-10',
697
+ expected_frames=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
698
+ description='spaces around dash'
699
+ ),
700
+ Case(
701
+ input='1 - 10',
702
+ expected_frange='1-10',
703
+ expected_frames=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
704
+ description='multiple spaces around dash'
705
+ ),
706
+
707
+ # Leading and trailing whitespace
708
+ Case(
709
+ input=' 1-5 ',
710
+ expected_frange='1-5',
711
+ expected_frames=[1, 2, 3, 4, 5],
712
+ description='leading and trailing spaces'
713
+ ),
714
+ Case(
715
+ input=' 1 ',
716
+ expected_frange='1',
717
+ expected_frames=[1],
718
+ description='spaces around single frame'
719
+ ),
720
+
721
+ # Whitespace with x modifier (step)
722
+ Case(
723
+ input='1-10 x 2',
724
+ expected_frange='1-10x2',
725
+ expected_frames=[1, 3, 5, 7, 9],
726
+ description='spaces with x modifier'
727
+ ),
728
+ Case(
729
+ input='1 - 10 x 2',
730
+ expected_frange='1-10x2',
731
+ expected_frames=[1, 3, 5, 7, 9],
732
+ description='spaces in range and x modifier'
733
+ ),
734
+
735
+ # Whitespace with y modifier (fill)
736
+ Case(
737
+ input='1-10 y 2',
738
+ expected_frange='1-10y2',
739
+ expected_frames=[2, 4, 6, 8, 10],
740
+ description='spaces with y modifier'
741
+ ),
742
+
743
+ # Whitespace with : modifier (stagger)
744
+ Case(
745
+ input='1-6 : 3',
746
+ expected_frange='1-6:3',
747
+ expected_frames=[1, 4, 3, 5, 2, 6],
748
+ description='spaces with : modifier'
749
+ ),
750
+
751
+ # Complex case with multiple comma-separated ranges
752
+ Case(
753
+ input='1 , 2 , 3 , 5-10 , 20-30',
754
+ expected_frange='1,2,3,5-10,20-30',
755
+ expected_frames=[1, 2, 3, 5, 6, 7, 8, 9, 10, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30],
756
+ description='complex multi-range with spaces'
757
+ ),
758
+ Case(
759
+ input=' 1 , 5-10 , 20 ',
760
+ expected_frange='1,5-10,20',
761
+ expected_frames=[1, 5, 6, 7, 8, 9, 10, 20],
762
+ description='multiple spaces in complex range'
763
+ ),
764
+
765
+ # Tabs (should also be removed)
766
+ Case(
767
+ input='1\t,\t2\t,\t3',
768
+ expected_frange='1,2,3',
769
+ expected_frames=[1, 2, 3],
770
+ description='tabs instead of spaces'
771
+ ),
772
+ Case(
773
+ input='1\t-\t10',
774
+ expected_frange='1-10',
775
+ expected_frames=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
776
+ description='tabs around dash'
777
+ ),
778
+
779
+ # Newlines (should also be removed)
780
+ Case(
781
+ input='1\n-\n10',
782
+ expected_frange='1-10',
783
+ expected_frames=[1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
784
+ description='newlines in range'
785
+ ),
786
+
787
+ # Mixed whitespace characters
788
+ Case(
789
+ input=' \t1\n,\r2 , 3\t ',
790
+ expected_frange='1,2,3',
791
+ expected_frames=[1, 2, 3],
792
+ description='mixed whitespace types'
793
+ ),
794
+
795
+ # Edge case: all whitespace
796
+ Case(
797
+ input=' ',
798
+ expected_frange='',
799
+ expected_frames=[],
800
+ description='only whitespace (empty range)'
801
+ ),
802
+
803
+ # Negative frames with whitespace
804
+ Case(
805
+ input=' -10 - -5 ',
806
+ expected_frange='-10--5',
807
+ expected_frames=[-10, -9, -8, -7, -6, -5],
808
+ description='negative frames with spaces'
809
+ ),
810
+ ]
811
+
812
+ for case in table:
813
+ with self.subTest(case.description):
814
+ fs = FrameSet(case.input)
815
+
816
+ # Check normalized frange string
817
+ self.assertEqual(fs.frange, case.expected_frange,
818
+ f"frange mismatch for {case.description}")
819
+
820
+ # Check actual frame values
821
+ actual_frames = list(fs)
822
+ self.assertEqual(actual_frames, case.expected_frames,
823
+ f"frames mismatch for {case.description}")
824
+
825
+ # Check length
826
+ self.assertEqual(len(fs), len(case.expected_frames),
827
+ f"length mismatch for {case.description}")
828
+
660
829
  class TestBase(unittest.TestCase):
661
830
  RX_PATHSEP = re.compile(r'[/\\]')
662
831
 
@@ -1798,7 +1967,7 @@ class AbstractBaseTests:
1798
1967
 
1799
1968
  def testFindSequencesOnDisk(self):
1800
1969
  seqs = self.FS.findSequencesOnDisk("seq", strictPadding=True)
1801
- self.assertEquals(len(seqs), 10)
1970
+ self.assertEquals(len(seqs), 11)
1802
1971
 
1803
1972
  known = {
1804
1973
  "seq/bar1000-1002,1004-1006#.exr",
@@ -1811,6 +1980,10 @@ class AbstractBaseTests:
1811
1980
  "seq/baz_left.1-3#.exr",
1812
1981
  "seq/baz_right.1-3#.exr",
1813
1982
  "seq/big.999-1003#.ext",
1983
+ # foo.0001_1.exr: underscore fixture for issue #158; DISK_RE
1984
+ # parses it as basename="foo.0001_", frame="1", so it appears
1985
+ # as a standalone sequence rather than contaminating foo.1-5#.exr
1986
+ "seq/foo.0001_1@.exr",
1814
1987
  }
1815
1988
  found = set([str(s) for s in seqs])
1816
1989
  self.assertEqualPaths(found, known)
@@ -2042,6 +2215,17 @@ class AbstractBaseTests:
2042
2215
  self.FS.findSequenceOnDisk(pattern, strictPadding=False)
2043
2216
  self.assertEqual(str(cm.exception), 'no sequence found on disk matching ' + pattern)
2044
2217
 
2218
+ def testFindSequenceOnDiskUnderscoreFrameIgnored(self):
2219
+ # Issue #158: findSequenceOnDisk should not match filenames whose
2220
+ # "frame" component contains an underscore (e.g. foo.0001_1.exr).
2221
+ # Python's int() accepts underscore digit separators (PEP 515), so
2222
+ # "1001_1" would previously be treated as a valid frame, causing
2223
+ # "multiple sequences found on disk" errors.
2224
+ # seq/foo.0001_1.exr is present on disk alongside seq/foo.{0001-0005}.exr
2225
+ for strict in (False, True):
2226
+ seq = self.FS.findSequenceOnDisk('seq/foo.#.exr', strictPadding=strict)
2227
+ self.assertEqual(str(seq), 'seq/foo.1-5#.exr')
2228
+
2045
2229
  def testFindSequenceOnDiskSubFrames(self):
2046
2230
  tests = [
2047
2231
  ("seq/foo.#.exr", "seq/foo.1-5#.exr"),
@@ -1 +0,0 @@
1
- __version__ = '2.3.0'
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes