Repository: Pyomo/pyomo

Issue:
Consistent semantic versioning
## Summary

The most recent version of Pyomo released was 6.2, as opposed to 6.2.0. It seems inconsistent with the way many other packages are versioned (e.g. NumFocus packages), although I am unaware if there is a standard specified anywhere. Is there a benefit to the former as opposed to the latter? 

## Context

Managing our dependencies, we automate pulling in new versions of packages, running them through our CI prior to upgrading. We run this in two ways - one allowing all upgrades and one allowing only compatible upgrades (PEP 440). This always requires manual review because not all packages use semantic versioning (or the same semantic versioning). One manual override we had to apply this time was pinning `Pyomo ~= 6.2.0` instead of what our script automatically pulled in `Pyomo ~= 6.2`.
Consistent semantic versioning
## Summary

The most recent version of Pyomo released was 6.2, as opposed to 6.2.0. It seems inconsistent with the way many other packages are versioned (e.g. NumFocus packages), although I am unaware if there is a standard specified anywhere. Is there a benefit to the former as opposed to the latter? 

## Context

Managing our dependencies, we automate pulling in new versions of packages, running them through our CI prior to upgrading. We run this in two ways - one allowing all upgrades and one allowing only compatible upgrades (PEP 440). This always requires manual review because not all packages use semantic versioning (or the same semantic versioning). One manual override we had to apply this time was pinning `Pyomo ~= 6.2.0` instead of what our script automatically pulled in `Pyomo ~= 6.2`.


Discussion:
@rhshadrach-8451, Pyomo generally does follow a form of semantic versioning.  Major releases are all backwards compatible with the examples from the Pyomo Book (the examples from the 3rd edition of the Book should run on all 6.x releases).  Minor and micro releases are more subjective, generally depending on the length of time and amount of "new functionality" added to Pyomo since the previous release.

As for the mixed *major.minor* and *major.minor.micro* numbering, there isn't a strong justification for the current practice (although it is permissible under PEP440).  I believe that it is mostly historical: in the early Coopr days the releases (and version numbering) were handled manually -- and trailing zeros were generally omitted.  When we codified the version handling infrastructure to follow PEP440, we preserved the previous behavior as a form of backward compatibility.  We can bring this up with the Dev Team and see what they think about changing the current practice.
@rhshadrach-8451 we discussed this at the developers call this week and have decided to include the trailing zero in our version numbers moving forward. 
@rhshadrach-8451, Pyomo generally does follow a form of semantic versioning.  Major releases are all backwards compatible with the examples from the Pyomo Book (the examples from the 3rd edition of the Book should run on all 6.x releases).  Minor and micro releases are more subjective, generally depending on the length of time and amount of "new functionality" added to Pyomo since the previous release.

As for the mixed *major.minor* and *major.minor.micro* numbering, there isn't a strong justification for the current practice (although it is permissible under PEP440).  I believe that it is mostly historical: in the early Coopr days the releases (and version numbering) were handled manually -- and trailing zeros were generally omitted.  When we codified the version handling infrastructure to follow PEP440, we preserved the previous behavior as a form of backward compatibility.  We can bring this up with the Dev Team and see what they think about changing the current practice.
@rhshadrach-8451 we discussed this at the developers call this week and have decided to include the trailing zero in our version numbers moving forward. 

Resolving patch:
diff --git a/pyomo/version/info.py b/pyomo/version/info.py
--- a/pyomo/version/info.py
+++ b/pyomo/version/info.py
@@ -66,7 +66,7 @@
 
 version_info = (major, minor, micro, releaselevel, serial)
 
-version = '.'.join(str(x) for x in version_info[:(3 if micro else 2)])
+version = '.'.join(str(x) for x in version_info[:3])
 __version__ = version
 if releaselevel != 'final':
     version += ' ('+releaselevel+')'


Test patch: