рдЕрдЬрдЧрд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рд╕рд╣реА рдкрд┐рдкреА рдкреИрдХреЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдирд╛

рдпрд╣ рдПрдХ рдЫреЛрдЯрд╛ рдореИрдиреБрдЕрд▓ / рдХрд╣рд╛рдиреА рд╣реИ рдХрд┐ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП "рд╕рд╣реА" рдкреАрдкреАрдЖрдИ рдкреИрдХреЗрдЬ рдХреИрд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рдП, рдЬрд┐рд╕реЗ рдХреЛрдИ рднреА рдкреЛрд╖рд┐рдд рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ:


pip install my-perfect-package 

рдпрд╣ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдкреЗрд╢реЗрд╡рд░реЛрдВ рд╕реЗ "рд╕рд╣реА" рдкреИрдХреЗрдЬ рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдкрдиреА рд░рд╛рдп рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХрд╛ рдЖрдЧреНрд░рд╣ рдХрд░рддрд╛ рд╣реВрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдмрд┐рд▓реНрд▓реА рдХреЗ рд▓рд┐рдП рдкреВрдЫрдирд╛ред


"рдЖрджрд░реНрд╢" рдкреИрдХреЗрдЬ рдХрд╛ рдХреНрдпрд╛ рдЕрд░реНрде рд╣реИ?


рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рд╕реЗ рдЖрдЧреЗ рдмрдврд╝реВрдВрдЧрд╛:


  • рдЧреАрдереБрдм рдкрд░ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд;
    рд╣рд░ рдХреЛрдИ рд╡рд┐рдХрд╛рд╕ рдореЗрдВ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдФрд░ рд▓реЗрдЦрдХ рдХреЛ рдзрдиреНрдпрд╡рд╛рдж рджреЗрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
  • рдЕрдЬрдЧрд░ рдХреЗ рд╕рднреА рд╡рд░реНрддрдорд╛рди / рд▓реЛрдХрдкреНрд░рд┐рдп рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди (2.7, 3.5, 3.6, 3.7, 3.8);
    рдЕрдЬрдЧрд░ рдЕрд▓рдЧ рд╣реИрдВ, рдФрд░ рдХрд╣реАрдВ рди рдХрд╣реАрдВ рдЕрднреА рднреА 2.7 рдкрд░ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд▓рд┐рдЦрддреЗ рд╣реИрдВред
  • рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде 100% рдХрд╡рд░реЗрдЬ;
    рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдкреНрд░рддрд┐рдЧрдорди рдЬрд╛рдВрдЪ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
    рдкреЛрд╖рд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдмреИрдЬ рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди рдЙрдард╛рддрд╛ рд╣реИ рдФрд░ рджреВрд╕рд░реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╛рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ ред
  • CI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛:
    рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЬрд╛рдБрдЪ рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ! рдФрд░ рд╢рд╛рдВрдд рдмреИрдЬ рдХрд╛ рдПрдХ рдЧреБрдЪреНрдЫрд╛
    • рд╕рднреА рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдФрд░ рдЕрдЬрдЧрд░ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рд░рдирд┐рдВрдЧ рдпреВрдирд┐рдЯ рдкрд░реАрдХреНрд╖рдг;
      рдЙрди рд▓реЛрдЧреЛрдВ рдкрд░ рд╡рд┐рд╢реНрд╡рд╛рд╕ рди рдХрд░реЗрдВ рдЬреЛ рджрд╛рд╡рд╛ рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдЬрдЧрд░ рдФрд░ рд╕реНрдерд╛рдкрд┐рдд рдкреИрдХреЗрдЬ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╣реИрдВ , рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╣рдореЗрд╢рд╛ рдПрдХ рдмрдЧ рднрд░ рдореЗрдВ рдЖ рд╕рдХрддреЗ рд╣реИрдВред
    • рд╕реНрдЯрд╛рдЗрд▓ рдХреЛрдб рдХреА рдЬрд╛рдВрдЪ;
      рдПрдХ рд╕рдорд╛рди рд╢реИрд▓реА рдкрдардиреАрдпрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреА рд╣реИ рдФрд░ рдПрдХ рд╕рдореАрдХреНрд╖рд╛ рдореЗрдВ рдЦрд╛рд▓реА рдЪрд░реНрдЪрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рдХрдо рдХрд░рддреА рд╣реИред
    • рд╕реНрдЯреЗрдЯрд┐рдХ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдХ;
      рдХреЛрдб рдореЗрдВ рдмрдЧ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдЦреЛрдЬ? рдореБрдЭреЗ рджреЛ!
  • рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкреНрд░рд▓реЗрдЦрди;
    рдкреИрдХреЗрдЬ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг, рд╡рд┐рдзрд┐рдпреЛрдВ / рдХрдХреНрд╖рд╛рдУрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг - рджрд╕реНрддрд╛рд╡реЗрдЬ рдЕрдиреБрднрд╡ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╡реЗрд╢ рд╕реАрдорд╛ рдХреЛ рдХрдо рдХрд░реЗрдЧрд╛ред
  • рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд┐рдХрд╛рд╕;
    рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреЗрд╡рд▓ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реНрдпрдХреНрддрд┐рдЧрдд рдпреЛрдЧрджрд╛рди рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдг рддреЗрдЬ рдХрд░ рджрд┐рдП рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдмреИрд╢ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред
  • рдкреИрдХреЗрдЬ рдЙрдкрдпреЛрдЧреА рд╣реИ рдФрд░ рджреБрдирд┐рдпрд╛ рдХреЛ рдПрдХ рдмреЗрд╣рддрд░ рд╕реНрдерд╛рди рдмрдирд╛рддрд╛ рд╣реИред
    рдПрдХ рдХрдард┐рди рдЖрд╡рд╢реНрдпрдХрддрд╛, рдкреАрдкреАрдкреА (~ 210k) рдореЗрдВ рдкреИрдХреЗрдЬреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП , рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЬрдВрдЧрд▓реА рдкрд░реЛрдкрдХрд╛рд░реА рд╣реИрдВ рдФрд░ рдмрд╣реБрдд рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛ рдЪреБрдХрд╛ рд╣реИред

рдХрд╣рд╛рдБ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ?


рдЕрдЪреНрдЫреЗ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рдереЗ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдПрдХ рд╣реИрдХрдиреАрдб рдФрд░ рдмрд╣реБрдд рд▓реЛрдХрдкреНрд░рд┐рдп рд╡рд┐рд╖рдп рдЪреБрдирд╛ - рдирдВрдмрд░ рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдирд╛ред рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд░реЛрдорди рдФрд░ рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореИрдиреБрдЕрд▓ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред рдЕрд░реЗ рд╣рд╛рдБ, рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд╛рдо рд╣реИ: numsys - рдЕрдВрдХ рдкреНрд░рдгрд╛рд▓реА рдХреЗ рдбрд┐рдХреНрд░рд┐рдкреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВред numeral-system-py ред


рдХреИрд╕реЗ рдХрд░реЗрдВ рдЯреЗрд╕реНрдЯ?


рдореИрдВрдиреЗ python3.7 рд▓рд┐рдпрд╛ рдФрд░ рдкрд╣рд▓реЗ рдорд╛рдирдХ unittests рдореЙрдбреНрдпреВрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рдВрдХреНрд╢рди рд╕реНрдЯрдмреНрд╕ (рд╣рдо рд╕рднреА TDDs рд╣реИрдВ ) рдХреЗ рд╕рд╛рде рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦрд╛ред


рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╕рдВрд░рдЪрдирд╛ рдмрдирд╛рддрд╛ рд╣реВрдВ:


 src/ numeral-system/ __init__.py roman.py tests __init__.py test_roman.py 

рдореИрдВрдиреЗ рдкреИрдХреЗрдЬ рдореЗрдВ рдкрд░реАрдХреНрд╖рдг рдирд╣реАрдВ рдХрд┐рдП рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЕрд▓рдЧ рд╣реВрдВ рднреВрд╕рд╛ рд╕реЗ рдЧреЗрд╣реВрдВ ред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, src/ folder рдирд╣реАрдВ рдмрдирд╛рдпрд╛, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдХреЗ рд╡рд┐рдХрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рд╕рдВрдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИред


рдореИрдВрдиреЗ рд▓реЙрдиреНрдЪ рдХреЗ рд▓рд┐рдП рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рдпрд╣ рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рд╕реЗ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдПред рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрддрд╛рд░реНрдХрд┐рдХ рд▓рдЧ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореЗрд░реЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд╛ рдорд╛рдирдХ рдореЙрдбреНрдпреВрд▓ рд╣реИ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдереЛрдбрд╝рд╛ рдФрд░ рд╕рд╣рдЬ рд▓рдЧ рд░рд╣рд╛ рдерд╛ред рдЕрдм рдореИрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдкреВрд░реА рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ред


рд▓реЗрдХрд┐рди, рд╡реЗ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╕рд┐рд╕реНрдЯрдо рдЕрдЬрдЧрд░ рдореЗрдВ pytest (рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдирд┐рд░реНрднрд░рддрд╛ рдХреА рддрд░рд╣) pytest рдмрд╣реБрдд рд╕реНрдорд╛рд░реНрдЯ рд╡рд┐рдЪрд╛рд░ рдирд╣реАрдВ рд╣реИ ...


рдирд┐рд░реНрднрд░рддрд╛ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ?


рдХреЗрд╡рд▓ virtualenv рдФрд░ requirements.txt рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЖрдк рдкреНрд░рдЧрддрд┐рд╢реАрд▓ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдХрд╡рд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ, рд╢рд╛рдпрдж, рд╡рд┐рд╖рд╛рдХреНрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдБрдЧрд╛ - рд╕реНрд╡рдЪрд╛рд▓рди рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдг, рдЬреЛ рдореБрдЭреЗ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рдкреНрд░рдмрдВрдзрди рдХрд░рдиреЗ рдХреА рднреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред


рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдЯреЙрдХреНрд╕рд┐.рдЗрди рдХреЙрдиреНрдлрд┐рдЧрд░ рдмрдирд╛рддрд╛ рд╣реВрдВ рдФрд░ pytest рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ pytest :


 [tox] envlist = py37 ;     ,   python3.7 [testenv] ;     deps =  `deps`  ,   . -r requirements.txt ;     -r requirements-test.txt ; commands = pytest ;   

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрднрд░рддрд╛ рдХрд╛ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛ рдерд╛, рд▓реЗрдХрд┐рди рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреА рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреЗ рдЕрднреНрдпрд╛рд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рд╛ рдХрд┐ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдЕрднреА рднреА requirements.txt рдореЗрдВ рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдлрд╝рд╛рдЗрд▓ рдореЗрдВред


рдмрд╣реБрдд рд╕реВрдХреНрд╖реНрдо рдХреНрд╖рдг рдкреИрджрд╛ рд╣реЛрддрд╛ рд╣реИред рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рдордп рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдареАрдХ рдХрд░реЗрдВ рдпрд╛ рд╣рдореЗрд╢рд╛ рдирд╡реАрдирддрдо рд░рдЦреЗрдВ?


рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдмрджреНрдз рд╣реИрдВ, рддреЛ рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рджреМрд░рд╛рди рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдХрд╛рд░рдг рд╕рдВрдХреБрд▓ рдХреЗ рдмреАрдЪ рд╕рдВрдШрд░реНрд╖ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдкреНрд░рддрд┐рдмрджреНрдз рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдкреИрдХреЗрдЬ рдЕрдЪрд╛рдирдХ рдХрд╛рдо рдХрд░рдирд╛ рдмрдВрдж рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдЕрдкреНрд░рд┐рдп рд╣реИ, рдЬрдм рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рдирд┐рд░реНрднрд░рддрд╛ рдХреЗ рдорд╛рдореВрд▓реА рдЕрджреНрдпрддрди рдХреЗ рдХрд╛рд░рдг рд╕рднреА рдмрд┐рд▓реНрдб рдПрдХ рд░рд╛рдд рдореЗрдВ "рд▓рд╛рд▓ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ"ред рдФрд░ рдорд░реНрдлреА рдХреЗ рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрд╣ рд░рд┐рд▓реАрдЬ рдХреЗ рджрд┐рди рд╣реЛрдЧрд╛ред


рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдПрдХ рдирд┐рдпрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛:


  1. рд╣рдореЗрд╢рд╛ рдЕрдВрддрд┐рдо рдЙрддреНрдкрд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдареАрдХ рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж рд╕реЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЙрдирдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реА рд╣реИред
  2. рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд┐рдП рдЧрдП рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдареАрдХ рди рдХрд░реЗрдВред рдпрд╛ рдЗрд╕реЗ рдПрдХ рд╕реАрдорд╛ рддрдХ рд╕реАрдорд┐рдд рдХрд░реЗрдВ рдпрджрд┐ рдкреИрдХреЗрдЬ рдХреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдБ!


рдореИрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╢рд░реАрд░ рдореЗрдВ рднрд░рддрд╛ рд╣реВрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЪрд▓рд╛рддрд╛ рд╣реВрдВред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдЕрдзрд┐рдХрд╛рдВрд╢ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЖрдорддреМрд░ рдкрд░ рдмрдВрдж рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ (рдореБрдЭреЗ рдЕрднреА рднреА рд╡рд┐рд╢реНрд╡рд╛рд╕ рд╣реИ рдХрд┐ рд╣рд░ рдХреЛрдИ рдкрд░реАрдХреНрд╖рдг = рд▓рд┐рдЦрддрд╛ рд╣реИ), рдкреИрдХреЗрдЬ рдФрд░ рд╣реИрдХ рдмрдЧ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдВред рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реВрдВ рдФрд░ рдЦрд░рдЧреЛрд╢ рдЫреЗрдж рдореЗрдВ рдХреВрджреЛ ред


рдЕрдЬрдЧрд░ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд░реЗрдВ?


tox рд╡рд┐рдиреНрдпрд╛рд╕ рдореЗрдВ, tox рдЕрдЬрдЧрд░ рдХреЗ рд╕рднреА рджрд┐рд▓рдЪрд╕реНрдк рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдгреЛрдВ рдХреА рд╢реБрд░реВрдЖрдд рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ tox :


 [tox] envlist = py{27,35,36,37,38} 

рдкрд╛рдЗрдиреЗрд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдореИрдВ рд╕реНрдерд╛рдиреАрдп рд░реВрдк рд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрд╕реНрдХрд░рдг рд╡рд┐рддрд░рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рддрд╛рдХрд┐ рд╡рд┐рд╖рд╛рдХреНрдд рдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬ рд╕рдХреЗрдВ рдФрд░ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛ рд╕рдХреЗрдВред


рдкреЛрд╖рд┐рдд 100% рдХрд╣рд╛рдВ рд╣реИрдВ?


рдореИрдВ рдХреЛрдб рдХреЗ рдХрд╡рд░реЗрдЬ рдХрд╛ рдПрдХ рдорд╛рдк рдЬреЛрдбрд╝реВрдВрдЧрд╛ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдХрд╡рд░реЗрдЬ рдкреИрдХреЗрдЬ рд╣реИ рдФрд░ рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ - рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ-рдХреЛрд╡ рдХреЗ рд╕рд╛рде рдХреЛрдИ рдХрдо рдЙрддреНрдХреГрд╖реНрдЯ рдПрдХреАрдХрд░рдг рдирд╣реАрдВ рд╣реИред
requirements-test.txt рдЕрдм рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:


 six=1.13.0 pytest=4.6.7 pytest-cov=2.8.1 parameterized=0.7.1 

рдЙрдкрд░реЛрдХреНрдд рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдореИрдВ рдЙрди рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдареАрдХ рдХрд░рддрд╛ рд╣реВрдВ рдЬреЛ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред


рдореИрдВ рдЯреЗрд╕реНрдЯ рд░рди рдХрдорд╛рдВрдб рдмрджрд▓рддрд╛ рд╣реВрдВ:


 deps = -r requirements.txt -r requirements-test.txt commands = pytest \ --cov=src/ \ --cov-config="{toxinidir}/tox.ini" \ --cov-append 

рдореИрдВ src/ folder - рд╕рдВрдХреБрд▓ рд╕реНрд╡рдпрдВ ( numeral_system / ) рдФрд░ рдкрд░реАрдХреНрд╖рдг рдХреЛрдб ( рдкрд░реАрдХреНрд╖рдгреЛрдВ / ) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рдХреЛрдб рдХреЗ рд▓рд┐рдП рдХрд╡рд░реЗрдЬ рдХреЗ рдЖрдБрдХрдбрд╝реЗ рдПрдХрддреНрд░ рдХрд░ рд░рд╣рд╛ рд╣реВрдБ - рдореИрдВ рдирд╣реАрдВ рдЪрд╛рд╣рддрд╛ рдХрд┐ рдкрд░реАрдХреНрд╖рдг рд╕реНрд╡рдпрдВ рдЧреИрд░-рдирд┐рд╖реНрдкрд╛рджрди рдпреЛрдЧреНрдп рднрд╛рдЧреЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ?


рдХрдорд╛рдВрдб --cov-append рдПрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдПрдХрддреНрд░ рдХрд┐рдП рдЧрдП рд╕рднреА рдЖрдБрдХрдбрд╝реЛрдВ рдХреЛ рдПрдХ рдЕрд▓рдЧ рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рдЕрдЬрдЧрд░ рдХреЗ рддрд╣рдд рдПрдХ рдореЗрдВ --cov-append рдХрд░рддрд╛ --cov-append , рдХреНрдпреЛрдВрдХрд┐ рджреВрд╕рд░реЗ рдФрд░ рддреАрд╕рд░реЗ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдХрд╡рд░реЗрдЬ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ (рд╣рд╛рдп рд╕рдВрд╕реНрдХрд░рдг-рдирд┐рд░реНрднрд░ рдХреЛрдб рдФрд░ рдореЙрдбреНрдпреВрд▓ рдЫрд╣ !), рд▓реЗрдХрд┐рди рдХреБрд▓ рдореЗрдВ 100 рджреЗрддреЗ рд╣реИрдВ! %ред рдПрдХ рд╕рд░рд▓ рдЙрджрд╛рд╣рд░рдг:


 if sys.version_info > (3, 0): # Python 3 code in this block else: # Python 2 code in this block 

рдПрдХ рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдпрд╛ рд╡рд╛рддрд╛рд╡рд░рдг рдЬреЛрдбрд╝реЗрдВред


 [testenv:coverage_report] deps = coverage commands = coverage html ;   ,   coverage report --include="src/*" --fail-under=100 -m ;    100%  

рдФрд░ рдореИрдВ рдЕрдЬрдЧрд░ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╡рд╛рддрд╛рд╡рд░рдг рдХреА рд╕реВрдЪреА рдореЗрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВред


 [tox] envlist = py{27,35,36,37,38} coverage_report 

tox рдХрдорд╛рдВрдб рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рд╕реБрдВрджрд░ рд░рд┐рдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде index.html рдлрд╝рд╛рдЗрд▓ рдпреБрдХреНрдд tox рдлрд╝реЛрд▓реНрдбрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред


рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдмреИрдЬ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХреЛрдбрдХреЛрд╡ рд╕реЗрд╡рд╛ рдХреЗ рд╕рд╛рде 100% рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ , рдЬреЛ рдЦреБрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬреАрдердм рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрдЧрд╛ рдФрд░ рдЖрдкрдХреЛ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, рдЖрдкрдХреЛ рд╡рд╣рд╛рдВ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ред


рдЕрдВрддрд┐рдо рд▓реЙрдиреНрдЪ рд╡рд╛рддрд╛рд╡рд░рдг рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:


 [testenv:coverage_report] deps = coverage==5.0.2 codecov==2.0.15 commands = coverage html coverage report --include="src/*" --fail-under=100 -m coverage xml codecov -f coverage.xml --token=2455dcfa-f9fc-4b3a-b94d-9765afe87f0f ;     codecov,    

рдпрд╣ рдЕрдм рдХреЗрд╡рд▓ README.rst рдореЗрдВ рдмреИрдЬ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:


 |Code Coverage| .. |Code Coverage| image:: https://codecov.io/gh/zifter/numeral-system-py/branch/master/graph/badge.svg :target: https://codecov.io/gh/zifter/numeral-system-py 

рдХреЛрдб рдХрд╛ рдкреНрд░рд╛рд░реВрдк рдФрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреИрд╕реЗ рдХрд░реЗрдВ?


рдХрдИ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ, рдЕрдзрд┐рдХрд╛рдВрд╢ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдкреВрд░рдХ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рд▓реЛрдХрдкреНрд░рд┐рдп рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реВрдВрдЧрд╛ рдЬреЛ рдкреАрдИрдкреА 8 рдХреЗ рдЕрдиреБрдкрд╛рд▓рди рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВрдЧреЗ, рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдФрд░ рд╕рднреА рдХреАрдбрд╝реЗ рдХреЛ рдареАрдХ рдХрд░реЗрдВ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рдХреЛрдб рдХреЛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдХрд░реЗрдВред


рдЖрдкрдХреЛ рддреБрд░рдВрдд рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдареАрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдХрд╣рд╛рдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк tox.ini рдлрд╝рд╛рдЗрд▓, setup.cfg , рдПрдХ рдПрдХрд▓ рдХрд╕реНрдЯрдо рдлрд╝рд╛рдЗрд▓ рдпрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢рд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕реАрдзреЗ tox.ini рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рднрд╡рд┐рд╖реНрдп рдХреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдмрд╕ tox.ini рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


isort


рдЖрдпрд╛рдд рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП isort рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╣реИред


рдореИрдВ рдХреЛрдб рдкреНрд░рд╛рд░реВрдк рдореЛрдб рдореЗрдВ isort рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд╛рддрд╛рд╡рд░рдг isort ред


 [testenv:isort] changedir = {toxinidir}/src deps = isort==4.3.21 commands = isort -y -sp={toxinidir}/tox.ini 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, isort рдкреНрд░рд╛рд░реВрдкрдг рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ changedir рдорд╛рдзреНрдпрдо рд╕реЗ changedir рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ -sp={toxinidir}/tox.ini рд╕рд╛рде рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкрде рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ -sp={toxinidir}/tox.ini ред рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдореЛрдб рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП -y рд╕реНрд╡рд┐рдЪ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред


рдкрд░реАрдХреНрд╖рдгреЛрдВ рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рд╕рддреНрдпрд╛рдкрди рдореЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ --check-only рдзреНрд╡рдЬ рд╣реИ:


 [testenv:isort-check] changedir = {toxinidir}/src deps = isort==4.3.21 commands = isort --check-only -sp={toxinidir}/tox.ini 

рдХрд╛рд▓рд╛


рдЕрдЧрд▓рд╛, рдореИрдВ рдмреНрд▓реИрдХ рдХреЛрдб рдлреЙрд░реНрдореЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВред рдореИрдВ рдЗрд╕реЗ isort рд╕рд╛рде рд╕рд╛рджреГрд╢реНрдп рджреНрд╡рд╛рд░рд╛ рдХрд░рддрд╛ isort :


 [testenv:black] deps = black==19.10b0 commands = black src/ [testenv:black-check] deps = black==19.10b0 commands = black --check src/ 

рд╕рдм рдХреБрдЫ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди isort рд╕рд╛рде рдПрдХ рд╕рдВрдШрд░реНрд╖ рд╣реИ - рдЖрдпрд╛рдд рдХреЗ рдкреНрд░рд╛рд░реВрдкрдг рдореЗрдВ рдЕрдВрддрд░ рд╣реИред


рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдореБрдЭреЗ рдПрдХ рдиреНрдпреВрдирддрдо рд╕рдВрдЧрдд isort рд╕реЗрдЯрд┐рдВрдЧ isort , рдЬрд┐рд╕рдХрд╛ рдореИрдВрдиреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛:


 [isort] multi_line_output=3 include_trailing_comma=True force_grid_wrap=0 use_parentheses=True line_length=88 

flake8


рдЗрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ flake8 рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдХ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ ред


 [testenv:flake8-check] deps = flake8==3.7.9 commands = flake8 --config=tox.ini src/ 

рдлрд┐рд░ рд╕реЗ black рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВред рд╣рдореЗрдВ рдПрдХ рдареАрдХ рдЯреНрдпреВрдирд┐рдВрдЧ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, black рджреНрд╡рд╛рд░рд╛ рд╣реА рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ:


 [flake8] max-line-length=88 ignore=E203 

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдиреЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд┐рдпрд╛ред E231 missing whitespace after ',' рддреНрд░реБрдЯрд┐ рдХреЗ рд╕рд╛рде рдлреЗрд▓ рд╣реЛ E231 missing whitespace after ',' , рдореБрдЭреЗ рдЗрд╕ рддреНрд░реБрдЯрд┐ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛:


 [flake8] max-line-length=88 ignore=E203,E231 

pylint


рдкрд╛рдЗрд▓рд┐рдВрдЯ рд╕реНрдерд┐рд░ рдХреЛрдб analyzers рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд


 [testenv:pylint-check] deps = {[testenv]deps} # pylint  ,     pylint==2.4.4 commands = pylint --rcfile=tox.ini src/ 

рдореИрдВ рддреБрд░рдВрдд рдЕрдЬреАрдм рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдореЗрдВ рдЖрддрд╛ рд╣реВрдВ - 30 рдЕрдХреНрд╖рд░реЛрдВ рдХреЗ рдлрд╝рдВрдХреНрд╢рди рдирд╛рдо (рд╣рд╛рдВ, рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдмрд╣реБрдд рд▓рдВрдмреЗ рдирд╛рдо рд▓рд┐рдЦрддрд╛ рд╣реВрдВ) рдФрд░ рдХреЛрдб рдореЗрдВ TODO рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЪреЗрддрд╛рд╡рдиреАред
рдореБрдЭреЗ рдХреБрдЫ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╣реИ:


 [MESSAGES CONTROL] disable=fixme,invalid-name 

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдкреНрд░рд┐рдп рдХреНрд╖рдг рдпрд╣ рд╣реИ рдХрд┐ pylint рдбреЗрд╡рд▓рдкрд░реНрд╕ pylint рд╣реА python2.7 рджрдлрди рдХрд░ python2.7 рдФрд░ рдЕрдм рдЗрд╕рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬ рд╡рд┐рдХрд╕рд┐рдд рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЪреЗрдХ рдХреЛ рдореМрдЬреВрджрд╛ рдкреИрдХреЗрдЬ рдкрд░ python3.7 рд▓рд┐рдП рдЪрд▓рд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:


 [tox] envlist = isort-check black-check flake8-check pylint-check py{27,35,36,37,38} coverage_report basepython = python3.7 

рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ рдкрд░ рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕реАрдЖрдИ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЕрдЬрдЧрд░ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рдЕрд▓рдЧ рд╣реИред


CI рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ?


Appveyor


рдПрдкреНрд╡рд╛рдЗрдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░реЗрдВ - рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреЗ рд▓рд┐рдП CIред рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реЗрдЯрдЕрдк рд╕рд░рд▓ рд╣реИ - рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдореЗрдВ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдлрд┐рд░ yaml рдлрд╝рд╛рдЗрд▓ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрд░реЗрдВред


 version: 0.0.{build} install: - cmd: >- C:\\Python37\\python -m pip install --upgrade pip C:\\Python37\\pip install tox build: off test_script: - cmd: C:\\Python37\\tox 

рдпрд╣рд╛рдВ рдореИрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ python3.7 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддрд╛ python3.7 , рдХреНрдпреЛрдВрдХрд┐ python2.7 рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ (рдФрд░ python2.7 рднреА рдЗрд╕ рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рд╣рд╛рд▓рд╛рдВрдХрд┐ рдореИрдВрдиреЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ python3.7 рдирд┐рд░реНрджрд┐рд╖реНрдЯ python3.7 )ред
рдмреИрдЬ рдХрд╛ рд▓рд┐рдВрдХ, рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, README.rst рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИ


 |Build status Appveyor| .. |Build status Appveyor| image:: https://ci.appveyor.com/api/projects/status/github/zifter/numeral-system-py?branch=master&svg=true :target: https://ci.appveyor.com/project/zifter/numeral-system-py 

рдЯреНрд░реИрд╡рд┐рд╕ рд╕реА.рдЖрдИ.


рдЙрд╕рдХреЗ рдмрд╛рдж, рдореИрдВ рдЯреНрд░реИрд╡рд┐рд╕ CI - CI рдХреЛ рд▓рд┐рдирдХреНрд╕ рдХреЗ рддрд╣рдд (рдФрд░ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рд╕рд╛рде рдореИрдХрдУрдПрд╕ рдХреЗ рддрд╣рдд рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди Python builds are not available on the macOS and Windows environments ред рд╕реЗрдЯрдЕрдк рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЛ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рд╕реЗ рд╕реАрдзреЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреЗ рдПрдХ рдЬреЛрдбрд╝реЗред рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рддреИрдпрд╛рд░ рд╣реИ, рдореИрдВ рдПрдХ рд╕реБрдВрджрд░ рдкреНрд░рддрд┐рдмрджреНрдз рдореЗрдВ рд╕реНрдХреНрд╡реИрд╢ рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдорд░реНрдЬ рдЕрдиреБрд░реЛрдз рддреИрдпрд╛рд░ рд╣реИред


 language: python python: 3.8 # dist: xenial # required for Python 3.7 (travis-ci/travis-ci#9069) sudo: required # required for Python 3.7 (travis-ci/travis-ci#9069) addons: apt: sources: - deadsnakes packages: - python3.5 - python3.6 - python3.7 - pypy install: - pip install tox script: - tox 

( рдмрдпрд╛рдирдмрд╛рдЬреА рдХрд╛ рд╕рд╡рд╛рд▓: рдФрд░ CI рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдЬреИрд╕реЗ рдпрд╛рдореНрд▓ рдлреЙрд░реНрдореЗрдЯ рдХреЛ рдЗрддрдирд╛ рдкрд╕рдВрдж рдХреНрдпреЛрдВ рдХрд░рддреЗ рд╣реИрдВ? )


рдореИрдВ python3.8 рдХреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ python3.8 , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ addon рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдФрд░ Travis CI рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕рдВрд╕реНрдХрд░рдг рд╕реЗ python3.8 рдмрдирд╛рддрд╛ рд╣реИред


Travis CI рдкрд░рд┐рдЪрд┐рдд рд▓реЛрдЧ рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВ рдирд╣реАрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЕрдЬрдЧрд░ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЛ рдЗрд╕ рддрд░рд╣ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВ? рдЖрдЦрд┐рд░рдХрд╛рд░, Travis CI рд╕реНрд╡рддрдГ рд╣реА virtualenv рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред


рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рд╕реЗ рдХреЛрдб рдХрд╡рд░реЗрдЬ рдбреЗрдЯрд╛ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдкрд░реАрдХреНрд╖рдг рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рдиреМрдХрд░рд┐рдпреЛрдВ рдореЗрдВ рдЪрд▓рд╛рдП рдЬрд╛рдПрдВрдЧреЗ, рдпрд╣реА рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдпрд╣ рд╕рд╛рдорд╛рдиреНрдп рдХрд╡рд░реЗрдЬ рд░рд┐рдкреЛрд░реНрдЯ рдПрдХрддреНрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред


рдмреЗрд╢рдХ, рдореБрдЭреЗ рдпрдХреАрди рд╣реИ рдХрд┐ рдереЛрдбрд╝реА рдФрд░ рд╕рдордЭ рд╣реИ рдФрд░ рдЗрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдкрд░рдВрдкрд░рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдмреИрдЬ рдХрд╛ рд▓рд┐рдВрдХ README.rst рдореЗрдВ рднреА рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИ


 |Build Status Travis CI| .. |Build Status Travis CI| image:: https://travis-ci.org/zifter/numeral-system-py.svg?branch=master :target: https://travis-ci.org/zifter/numeral-system-py 

рдкреНрд░рд▓реЗрдЦрди


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рд░ рдЕрдЬрдЧрд░ рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рд╕реЗрд╡рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ - readthedocs.org ред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЕрдкрдиреЗ рдкреНрд░рд▓реЗрдЦрди рдХреА рдореЗрдЬрдмрд╛рдиреА рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреА рд╕реЗрд╡рд╛ рд╣реИред
рдореИрдВ рд╕реНрдлрд┐рдВрдХреНрд╕ рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рдореИрдВ рд╢реБрд░реБрдЖрддреА рдореИрдиреБрдЕрд▓ рд╕реЗ рдЪрд░рдгреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕рдВрд░рдЪрдирд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реВрдВ:


 src/ docs/ build/ #      html  source/ #     _static/ #   , ,  _templates/ #     conf.py #    index.rst #    make.bat Makefile # make     make 

рдЕрдЧрд▓рд╛, рдЖрдкрдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреНрдпреВрдирддрдо рдЪрд░рдг рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


  1. рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ github README.md рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдХ README.md рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ, рдЬрдм рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ sphinx рд░реВрдк рдореЗрдВ рдпрд╣ ReStructuredText рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реИ ред

рдЗрд╕рд▓рд┐рдП, рдореБрдЭреЗ рдЗрд╕реЗ .rst рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рдкрдбрд╝рд╛ред рдФрд░ рдЕрдЧрд░ рдореИрдВрдиреЗ рдХрдо рд╕реЗ рдХрдо рдПрдХ рдмрд╛рд░ рд╕реНрдЯрд╛рд░реНрдЯ рдореИрдиреБрдЕрд▓ рдХреЛ рдкрдврд╝рд╛ рдерд╛, рддреЛ рдореИрдВрдиреЗ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ рдХрд┐ sphinx рдЗрд╕реЗ рдорд╛рд░реНрдХрдбрд╛рдЙрди рдореЗрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИ ред
рдореИрдВ README.rst рдлрд╝рд╛рдЗрд▓ рдХреЛ index.rst рдореЗрдВ README.rst index.rst


 .. include:: ../../README.rst 

  1. рд╕реНрд░реЛрдд рдореЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдПрдХреНрд╕рдЯреЗрдВрд╢рди sphinx.ext.autodoc рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ ред
  2. рдореИрдВ рдкреИрдХреЗрдЬ рдлрд╝реЛрд▓реНрдбрд░ рдХреЛ conf.py рдпрд╣ sphinx рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рдХреЛрдб рдХреЛ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
     import os import sys sys.path.insert(0, os.path.abspath('./../../src')) import numeral_system 
  3. рдореИрдВ docs/source/api-docs рдлрд╝реЛрд▓реНрдбрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ рдФрд░ рд╡рд╣рд╛рдВ рдкреНрд░рддреНрдпреЗрдХ рдореЙрдбреНрдпреВрд▓ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╡рд░рдг рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реВрдВред рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП:
     Roman numeral system ========================= .. automodule:: numeral_system.roman :members: 

рдЙрд╕рдХреЗ рдмрд╛рдж, рдкрд░рд┐рдпреЛрдЬрдирд╛ рджреБрдирд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╡рд┐рд╡рд░рдг рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИред рдЖрдкрдХреЛ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ (рдЕрдзрд┐рдорд╛рдирддрдГ github рдкрд░ рдПрдХ рдЦрд╛рддреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдФрд░ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдЖрдпрд╛рдд рдХрд░реЗрдВ, рд╡рд┐рд╕реНрддреГрдд рдЪрд░рдгреЛрдВ рдХреЛ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
рдкрд░рдВрдкрд░рд╛ рд╕реЗ, рдореИрдВ tox рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддрд╛ рд╣реВрдВ:


 [testenv:gen_docs] deps = -r docs/requirements.txt commands = sphinx-build -b html docs/source/ docs/build/ 

рдореИрдВ sphinx-build рдЙрдкрдпреЛрдЧ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХрд░рддрд╛ рд╣реВрдВ, рдмрдЬрд╛рдп make , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рд╡рд┐рдВрдбреЛрдЬ рдХреЗ рддрд╣рдд рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИред рдФрд░ рдореИрдВ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд┐рдХрд╛рд╕ рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рдЙрд▓реНрд▓рдВрдШрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред


рдЬреИрд╕реЗ рд╣реА рдкрд░рд┐рд╡рд░реНрддрди рдЬрдореЗ рд╣реБрдП рд╣реИрдВ, readthedocs.org рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдПрдХрддреНрд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реЗрдЧрд╛ред


рд▓реЗрдХрд┐рди ... Build failed ред рдореИрдВрдиреЗ sphinx рдФрд░ sphinx_rtd_theme , рдФрд░ рдореБрдЭреЗ рд╡рд░реНрддрдорд╛рди рд╕рдВрд╕реНрдХрд░рдгреЛрдВ readthedocs.org рд▓реЗрдиреЗ рдХреЗ readthedocs.org рдХреА readthedocs.org ред рд▓реЗрдХрд┐рди рдРрд╕рд╛ рд╣реИ рдирд╣реАрдВред рдореИрдВ рдареАрдХ рдХрд░рддрд╛ рд╣реВрдБ:


 sphinx==2.3.1 sphinx_rtd_theme==0.4.3 

рдФрд░ рдореИрдВ .readthedocs.yml рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ .readthedocs.yml readthedocs.org , рдЬрд┐рд╕рдореЗрдВ рдореИрдВ рдмрд┐рд▓реНрдб рд▓реЙрдиреНрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдг рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реВрдВ:


 python: version: 3.7 install: - requirements: docs/requirements.txt - requirements: requirements.txt 

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдБ рдпрд╣ рддрдереНрдп рдХрд╛рдо рдореЗрдВ рдЖрдпрд╛ рд╣реИ рдХрд┐ рдирд┐рд░реНрднрд░рддрд╛ requirements.txt рдореЗрдВ requirements.txt ред рдореИрдВ рдирд┐рд░реНрдорд╛рдг рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬ рдЙрдкрд▓рдмреНрдз рд╣реЛ рдЧрдпрд╛ рд╣реИ ред


рдмреИрдЬ рдлрд┐рд░ рд╕реЗ рдЬреЛрдбрд╝реЗрдВ:


 |Docs| .. |Docs| image:: https://readthedocs.org/projects/numeral-system-py/badge/?version=latest&style=flat :target: https://numeral-system-py.readthedocs.io/en/latest/ 

рд▓рд╛рдЗрд╕реЗрдВрд╕


рдпрд╣ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрд╕реЗрдВрд╕ рдЪреБрдирдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред
рдпрд╣ рдПрдХ рдмрд╣реБрдд рд╡реНрдпрд╛рдкрдХ рд╡рд┐рд╖рдп рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рдкрдврд╝рд╛ред рдореВрд▓ рд░реВрдк рд╕реЗ, рд╡рд┐рдХрд▓реНрдк рдПрдордЖрдИрдЯреА рдФрд░ рдЕрдкрд╛рдЪреЗ 2.0 рдХреЗ рдмреАрдЪ рд╣реИред рдореБрдЭреЗ рд╡рд╣ рд╡рд╛рдХреНрдпрд╛рдВрд╢ рдкрд╕рдВрдж рдЖрдпрд╛ рдЬреЛ рд╕рдВрджрд░реНрдн рд╕реЗ рд╕рдлрд▓рддрд╛рдкреВрд░реНрд╡рдХ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:


 MIT       

рдореИрдВ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд╣рдордд рд╣реВрдВ, рдореИрдВ рдРрд╕рд╛ рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рдпреЛрдЬрдирд╛рдПрдВ рдмрджрд▓рддреА рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ (рд╣рд╛рд▓рд╛рдВрдХрд┐ рдкрд┐рдЫрд▓реЗ рд╕рдВрд╕реНрдХрд░рдг рдкреБрд░рд╛рдиреЗ рдХреЗ рддрд╣рдд рд╣реЛрдВрдЧреЗ)ред


рдлрд┐рд░, рдПрдХ рдмреИрдЬ рдЬреЛрдбрд╝реЗрдВ рдмрд┐рд▓реНрд▓рд╛ рднрдЧрд╡рд╛рди :


 |License| .. |License| image:: https://img.shields.io/badge/License-MIT-yellow.svg :target: https://opensource.org/licenses/MIT 

рдпрд╣рд╛рдВ рдЖрдк рд╕рднреА рд▓рд╛рдЗрд╕реЗрдВрд╕ рдХреЗ рд▓рд┐рдП рдмреИрдЬ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред


Pypi рдкрд░ рдХреИрд╕реЗ рдЕрдкрд▓реЛрдб рдХрд░реЗрдВ?


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдЖрдкрдХреЛ pypi.org рдкрд░ рдПрдХ рдЦрд╛рддрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛ ред рдлрд┐рд░ рдкреИрдХреЗрдЬ рдХреА рддреИрдпрд╛рд░реА рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдВред


рдореИрдВ setup.cfg рдмрдирд╛рддрд╛ рд╣реВрдВ


рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд / рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХрд╛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдореИрдВрдиреЗ рдирд┐рд░реНрджреЗрд╢реЛрдВ рдХрд╛ рдкрд╛рд▓рди тАЛтАЛрдХрд┐рдпрд╛ ред рдбреЗрдЯрд╛ рдХреЛ рд╕реЗрдЯрдЕрдк setup.py рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реЗрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдХрд▓реНрдк рдирд╣реАрдВ рд╣реИред рдЗрд╕рд▓рд┐рдП, setup.cfg рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рд╕рднреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХреИрд╕реЗ рднрд░реЗрдВ, рдЗрд╕рдХрд╛ рдПрдХ рдЫреЛрдЯрд╛ рд╕рд╛ рдЦрд╛рдХрд╛ рдорд┐рд▓рд╛ред рдирддреАрдЬрддрди, рдореИрдВ рдЙрд╕ рдФрд░ рдЙрд╕ рдлрд╝рд╛рдЗрд▓ рджреЛрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - рдпрд╣ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИред


рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ pylint , flake8 рдФрд░ рдЕрдиреНрдп рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдирд╣реАрдВ рдХрд┐рдпрд╛ред


рдкреИрдХреЗрдЬ рдХреИрд╕реЗ рдЗрдХрдЯреНрдард╛ рдХрд░реЗрдВ?


рдлрд┐рд░ рд╕реЗ рдореИрдВ рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рд▓рд┐рдЦ рд░рд╣рд╛ рд╣реВрдБ рдЬреЛ рдореБрдЭреЗ рдПрдХ рд╕рд╛рде рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рджреЗрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛:


 [testenv:build_wheel] skip_install = True deps = ;     wheel docutils pygments commands = python -c 'import shutil; (shutil.rmtree(p, ignore_errors=True) for p in ["build", "dist"]);' python setup.py sdist bdist_wheel 

рдореИрдВ рдЕрдЬрдЧрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝реЛрд▓реНрдбрд░реНрд╕ рдХреЛ рдХреНрдпреЛрдВ рд╣рдЯрд╛ рд░рд╣рд╛ рд╣реВрдВ? рдореИрдВ рдХреНрд░реЙрд╕-рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рд╡рд┐рдХрд╛рд╕ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдЕрдиреБрдкрд╛рд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд╡рд┐рдВрдбреЛрдЬ рдФрд░ рдпреВрдирд┐рдХреНрд╕ рдХреЗ рддрд╣рдд рдРрд╕рд╛ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИред


рдореИрдВ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реВрдВ:


 tox -e build_wheel 

рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдореБрдЭреЗ рдорд┐рд▓реЗ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ:


 dist/ numeral-system_py-0.1.0.tar.gz numeral_system-py-0.1.0-py2.py3-none-any.whl 

рдореИрдВ рднрд░рддрд╛ рд╣реВрдБ!


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВред


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдпреЛрдЧреНрдп рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдореИрдВ рдЗрд╕реЗ рдкрд░реАрдХреНрд╖рдг рдкреИрдХреЗрдЬ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░реВрдВрдЧрд╛ред рдЗрд╕рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рдЦрд╛рддрд╛ рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рд╕реЗ рд╣реА test.pypi.org рдкрд░ред


рдореИрдВ рдЗрд╕рдХреЗ рд▓рд┐рдП рд╕реБрддрд▓реА рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ - PyPi рдореЗрдВ рдХрд▓рд╛рдХреГрддрд┐рдпреЛрдВ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдХрд░рдгред


 [testenv:test_upload] skip_install = True deps = twine ;    commands = python -m twine upload --repository-url https://test.pypi.org/legacy/ dist/* 

рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ numsys рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдЗрд╕реЗ рднрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдЗрд╕ рддрдереНрдп рдореЗрдВ рднрд╛рдЧ рдЧрдпрд╛ рдХрд┐ рдПрдХ рд╣реА рдирд╛рдо рд╡рд╛рд▓рд╛ рдПрдХ рдкреИрдХреЗрдЬ рдкрд╣рд▓реЗ рд╕реЗ рдореМрдЬреВрдж рд╣реИ! рдФрд░ рдЬреЛ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИ - рд╡рд╣ рдпрд╣ рднреА рдЬрд╛рдирддрд╛ рд╣реИ рдХрд┐ рд░реЛрдорди рдЕрдВрдХреЛрдВ рдореЗрдВ рдХреИрд╕реЗ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП :) рд╡рд╣ рдмрд╣реБрдд рдкрд░реЗрд╢рд╛рди рдирд╣реАрдВ рд╣реБрдЖ рдФрд░ рдирд╛рдорд╛рдВрдХрд┐рдд рд╣реЛрдХрд░ numeral-system-py ред


рдЕрдм рдЖрдкрдХреЛ рдкрд░реАрдХреНрд╖рдг рд╡рд╛рддрд╛рд╡рд░рдг рд╕реЗ рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдорд╛рдиреНрдпрддрд╛ рднреА рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП:


 [testenv:test_venv] skip_install = True ;         deps = ;   commands = pip install -i https://test.pypi.org/simple/ numeral-system-py 

рдЕрдм рдЖрдкрдХреЛ рдмрд╕ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:


 tox -e test_venv ... test_venv: commands_succeeded congratulations :) 

рдпрд╣ рдХрд╛рдо рдХрд░рдиреЗ рд▓рдЧрддрд╛ рд╣реИ :)


рдЕрдм рдЬрд░реВрд░ рдбрд╛рд▓рдирд╛!


рд╣рд╛рдВред


рдореИрдВ рдЙрддреНрдкрд╛рджрди рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд╛рддрд╛рд╡рд░рдг рдмрдирд╛рддрд╛ рд╣реВрдВред


 [testenv:pypi_upload] skip_install = True deps = twine commands = python -m twine upload dist/* 

рдФрд░ рдЙрддреНрдкрд╛рджрди рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рд╡рд░рдгред


 [testenv:pypi_venv] skip_install = True deps = ;    commands = pip install numeral-system-py 

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рдореИрдВ рд╕рд╛рдзрд╛рд░рдг рдЖрджреЗрд╢реЛрдВ рдХреЗ рд╕рд╛рде рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реВрдБ:


 > virtualenv venv > source venv/bin/activate (venv) > pip install numeral-system-py (venv) > python >>> import numeral_system >>> numeral_system.roman.encode(7) 'VII' 

рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!


рдореИрдВрдиреЗ рдЬреАрдереВрдм рдкрд░ рд░рд┐рд▓реАрдЬ рдХреЛ рдХрд╛рдЯ рджрд┐рдпрд╛ , рдкреИрдХреЗрдЬ рдЗрдХрдЯреНрдард╛ рдХрд┐рдпрд╛ рдФрд░ рдЗрд╕реЗ рдкреНрд░реЛрдкреА рдкрд┐рдкреА рдореЗрдВ рднрд░ рджрд┐рдпрд╛ред


рдЯрд┐рдкреНрдкрдгреА


рдирд┐рд░реНрднрд░рддрд╛ рдЕрджреНрдпрддрди


рдЗрд╕ рд▓реЗрдЦ рдХреА рддреИрдпрд╛рд░реА рдХреЗ рджреМрд░рд╛рди, рдкрд╛рдЗрд╕реНрдЯреЗрд╕реНрдЯ рдХрд╛ рдПрдХ рдирдпрд╛ рд╕рдВрд╕реНрдХрд░рдг рдЬрд╛рд░реА рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдЬрд┐рд╕рдореЗрдВ, рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЕрдЬрдЧрд░ 3.4 рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЛ рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ ( рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд▓рд░рдорд╛ рдкреИрдХреЗрдЬ рдореЗрдВ)ред рджреЛ рд╡рд┐рдХрд▓реНрдк рдереЗ:


  1. 3.4 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд░рдВрдЧрд╛рдорд╛ рд╕рдВрд╕реНрдХрд░рдг;
  2. рдбреНрд░реЙрдк рд╕рдкреЛрд░реНрдЯ 3.4 :)

рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рдкрдХреНрд╖ рдореЗрдВ, рдЕрдВрддрд┐рдо рддрд░реНрдХ рдпрд╣ рдерд╛ рдХрд┐ 19.1 рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ pip рдиреЗ рд╕рдорд░реНрдерди 3.4 рдЧрд┐рд░рд╛ рджрд┐рдпрд╛ред


рд╡рд┐рд╢реНрд▓реЗрд╖рдХ, рдкреНрд░рд╛рд░реВрдкрдХрд░реНрддрд╛ рдФрд░ рдЕрдиреНрдп рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдирд┐рд╢реНрдЪрд┐рдд рдирд┐рд░реНрднрд░рддрд╛рдПрдВ рд╣реИрдВред рдпреЗ рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рдЙрд╕реА рд╕рдордп рдЕрдкрдбреЗрдЯ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВред рдпрджрд┐ рдЖрдк рднрд╛рдЧреНрдпрд╢рд╛рд▓реА рд╣реИрдВ, рддреЛ рдЖрдк рдХреЗрд╡рд▓ рдЕрдкрдЧреНрд░реЗрдб рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рдмрдВрдж рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ; рдпрджрд┐ рдирд╣реАрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЛрдб рдХреЛ рд╕рд╣реА рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдпрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рднреА рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред


TravisCI


MacOS рдФрд░ Windows рдХреЗ рд▓рд┐рдП рдЕрдЬрдЧрд░ рдХрд╛ рд╕рдорд░реНрдерди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдПрдХ рд╣реА рдХрд╛рдо рдХреЗ рднреАрддрд░ рдЕрдЬрдЧрд░ рдХреЗ рд╕рднреА рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП tox рдЪрд▓рд╛рдиреЗ рдХреЗ рд╕рд╛рде рдХрдард┐рдирд╛рдЗрдпрд╛рдБ рд╣реИрдВред


рдкреИрдХреЗрдЬ рд╕рдВрд╕реНрдХрд░рдг


рдпрд╣ рд╢рдмреНрджрд╛рд░реНрде рд╕рдВрд╕реНрдХрд░рдг рдХрд╛ рдкрд╛рд▓рди рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИ, рдЕрд░реНрдерд╛рддреН рдкреНрд░рд╛рд░реВрдк:


 MAJOR.MINOR.PATCH 

рдореЗрдЯрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рджреЛрд╣рд░рд╛рд╡


рдкреИрдХреЗрдЬ рдХрд╛ рд╕рдВрд╕реНрдХрд░рдг рдФрд░ рдХреБрдЫ рдЕрдиреНрдп рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкреИрдХреЗрдЬ ( setup.cfg рдпрд╛ setup.py ) рдФрд░ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рджреЛрд╣рд░рд╛рд╡ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреЗрд╡рд▓ рдкреИрдХреЗрдЬ numeral_system/__init__.py рдореЗрдВ рдПрдХ рд╕рдВрдХреЗрдд рджрд┐рдпрд╛:


 __version__ = '0.2.0' 

рдФрд░ рдлрд┐рд░ setup.py рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ setup.py


 setup(version=numeral_system.__version__) 

docs/source/conf.py


 release = numeral_system.__version__ 

рдЙрдкрд░реЛрдХреНрдд рдХрд┐рд╕реА рднреА рдореЗрдЯрд╛ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕рд╣реА рд╣реИ - REAMDE.rst , рдкрд░рд┐рдпреЛрдЬрдирд╛ рд╡рд┐рд╡рд░рдг, рд▓рд╛рдЗрд╕реЗрдВрд╕, рд▓реЗрдЦрдХ рдХреЗ рдирд╛рдо, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред


рд╕рдЪ рд╣реИ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреА рдУрд░ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рдкреИрдХреЗрдЬ рдХреЛ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдХреЗ рд╕рдордп рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ, рдЬреЛ рдЕрд╡рд╛рдВрдЫрдиреАрдп рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


рдирд┐рд░реНрднрд░рддрд╛ рджреЛрд╣рд░рд╛рд╡


рд╢реБрд░реБрдЖрдд рдореЗрдВ, рдореИрдВ рдЗрд╕ рддрдереНрдп рд╕реЗ рднреНрд░рдорд┐рдд рдерд╛ рдХрд┐ рдореБрдЭреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдореЗрдВ рдкреИрдХреЗрдЬ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрднрд░рддрд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА requirements.txt setup.cfg ред setup.cfg рдФрд░ setup.cfg ред setup.cfg ред
, тАФ setup.cfg .
. , requirements-dev.txt .



, src/ . :


  • ;
  • , , ;

:


  • PyCharm ( ?) тАФ src , .


тАФ .
, :


 Add badge with supported version Support for py38 

:


 Try fix py38 env creating Try fix py38 env creating Try fix py38 env creating Fix check 

, 3 ! Travis CI.


, . тАФ , .


, . CHANGELOG .



, Markdown . , rst .


рдмреИрдЬ


тАФ , , , . , .
coverage .


-


, , , . six , , type hint , asyncio тАФ .
python2.7 , . , python3.5+, . , , CI . .


?


, :



рдирд┐рд╖реНрдХрд░реНрд╖


open source , .
, python github , .
stackoverflow.com issues github .
. . ?..


, , .
, .


github .


рдзрдиреНрдпрд╡рд╛рдж!

Source: https://habr.com/ru/post/hi483512/


All Articles