Since there is currently a proposal on the dev mailing list whether to include the design-by-contract GContracts library (https://github.com/andresteingress/gcontracts/) into Groovy,  for everyone who has never used GContracts (or design-by-contract), and since most of the "info"-links on the GitHub seem to be broken, here are some links on the topic:

https://jaxenter.com/tutorial-gcontracts-a-design-by-contract-extension-for-groovy-104751.html
https://en.wikipedia.org/wiki/Design_by_contract


The final example in the overview article gives a good idea on how the design-by-contract mechanisms of pre-/postconditions (@Requires/@Ensures) and invariants (@Invariant) works in GConract (Note: The RocketAPI interface is not necessary, annotations could also reside directly on Rocket class methods):

import org.gcontracts.annotations.*

interface RocketAPI {
  def start()
  boolean isStarted()
  int getSpeed()

  @Requires({ started })
  @Ensures({ result - old.speed == 5 })
  def accelerate()

  @Requires({ started })
  @Ensures({ old.speed - speed == 5 })
  def brake()
}

@Invariant({ speed >= 0 && speed <= Integer.MAX_VALUE - 5 })
class Rocket implements RocketAPI  {

    int speed
    private boolean started

    def start() { started = true }
    boolean isStarted() { started }

    def accelerate()  {
        speed = speed + 5
        return speed
    }

    def brake() {
        speed = speed - 5
    }
}

def rocket = new Rocket()
rocket.accelerate()


Cheers,
mg


On 03/08/2020 07:57, Paul King wrote:

Hi everyone,

The GContracts project (design-by-contract extension for Groovy) has been archived:

https://github.com/andresteingress/gcontracts/

I believe there is sufficient merit in the functionality it offers for us to consider taking up support of the codebase, and the project owner, Andre Steingress, is happy for that transition to take place.

We could try to re-invigorate GContracts outside the ASF but I think our community where a larger pool of folks can contribute when they have availability makes more sense than another single person trying to take it over and then potentially running out of steam down the track.

We could give it it's own repo and have it as a subproject but for now I think it is easiest just to have it as an optional module in the core repo (targeting Groovy 4). In the PR, I have marked the main annotations as @Incubating for the time being. For further details, see here:

https://github.com/apache/groovy/pull/1337
https://issues.apache.org/jira/browse/GROOVY-9671

Let me know if you have any objections or alternate thoughts.

Thanks, Paul.


Reply via email to