groovy and noteworthy - jug.uajug.ua/wp-content/uploads/2014/03/groovy-and-noteworthy.pdf · geb is...
TRANSCRIPT
Groovy and
Noteworthy
Izzet Mustafayev@EPAM Systems@webdizzhttp://webdizz.name
Agenda
● Groovy
○ Specials
○ Basics
○ Infrastructure
● Getting Started
GroovySpecials
Groovy is an agile dynamic language
println 'Hello World!'
Java is a Groovy but Groovy is not Java
Groovy supports DSL
Groovy supports DSL
● A flexible syntax
● Closures
● Meta-programming
● Operator overloading
● No dots and semicolons
● No parentheses, … well almost
Groovy provides statically type check
Groovy provides statically type check
@groovy.transform.TypeChecked void method() { // do nothing}
Groovy Basics
Groovy Shell
Groovy Console
Omission of get/set methodsclass Person { String name String email}
def person = new Person()person.email = '[email protected]'
println person.email //[email protected]
Initializing beans with named parametersclass Person { String name String email}
def person = new Person(name: 'me')
println person.name// me
Context operations using withclass Person { String name String email}def person = new Person(name: 'me', email: '[email protected]')person.with{ println name// me println email// [email protected]}
GStrings (interpolation, multiline)
def param = 'param'def groovyString = """
There is a ‘${param}’ param"""
println groovyString// There is a ‘param’ param
Native syntax for data structures : List
def list = [1, 4, 6, 9]
println list[-2] // 6
list << 10println list.size() // 5
list = list - 10println list // [1, 4, 6, 9]
def map = [UA: 'Ukraine', UK: 'United Kingdom']
println map.UA // Ukraineprintln map[‘UA’] // Ukraine
map << [US: 'United States']println map.US // United States
Native syntax for data structures : Map
Native syntax for data structures : Range
def range = 10..20println range[2] //12
def rangeAlpha = 'a’..'d’println rangeAlpha[2] //c
switch (weight) { case 1..10: shippingCost = 5; break case 11..25: shippingCost = 10; break default: shippingCost = 1; }
Elvis operator for default values
def name = null
println name != null ? name : ’Unknown’ // Unknown
println name ?: ’Unknown’ // Unknown
name = 'name'println name ?: ‘Unknown’ // name
Safe graph navigationif (order != null) { if (order.getCustomer() != null) { if (order.getCustomer().getAddress() != null) {
Address address;address = order.getCustomer().getAddress()System.out.println(address);
} } }
println order?.customer?.address
Closures
printSum = { a, b -> print a+b }
printSum(5, 7)// 12
Closures
upperCasedList = ['a','b','c','d']. collect { it.toUpperCase() }
println upperCasedList // A, B, C, D
MetaprogrammingString.metaClass.cons2var = { ->
String res = ''delegate.toLowerCase()
.tokenize('_')
.each{ s ->res += res ? s.capitalize() : s
} res}
println ’SAMPLE_VAR’.cons2var() //sampleVar
Groovy Infrastructure
Gradle - http://gradle.org/● Strong yet flexible conventions
● Manageable and understandable builds for anything
● Follows convention over configuration approach
● Great plug-ins ecosystem
Spock - https://github.com/spockframework/spock
● Testing and specification framework
● JUnit compatible
● Highly expressive specification language
Easyb - http://easyb.org/● Behavior driven development framework
● Specifications are written in Groovy and run via a Java runner,
command line, Maven or Ant
● Supports a few different styles of specifications ranging from
RSpec's it to a story based DSL with givens, whens, and
thens
Grails - http://grails.org/● Grails is an Open Source, full stack web application
framework for the JVM
● Based on Spring, Hibernate, Sitemesh, etc.
● There are a lot of plug-ins
Grape - http://groovy.codehaus.org/Grape● Grape lets you quickly add maven repository
dependencies to your classpath.
@Grab(group='org.codehaus.sonar', module='sonar-ws-client', version='4.0')@Grab(group='commons-httpclient', module='commons-httpclient', version='3.1')
import org.sonar.wsclient.SonarClient
SonarClient sonarClient = SonarClient.builder().url(URL).login(options.u).password(password).build()
Geb - http://www.gebish.org/● Geb is a browser automation solution
● brings together the power of WebDriver, the elegance of jQuery
content selection, the robustness of Page Object modelling and
the expressiveness of the Groovy
● Can be used for scripting, scraping and general automation — or
equally as a functional/web/acceptance testing solution via
integration with testing frameworks such as Spock, JUnit &
TestNG.
Griffon - http://griffon.codehaus.org● Desktop development framework inspired in Grails
● Primarily Swing based however supports SWT, Pivot,
GTK and JavaFX too
● Growing plugin system (80+ plugins)
Gaelyk - http://gaelyk.appspot.com● Google App Engine development framework based
on Groovy and Groovlets
● Emerging plugin system
GPars - http://gpars.codehaus.org/● Provides DSL and concurrent friendly methods for
collections
● Supports Actors and STM
● Dataflow concurrency model
CodeNarc - http://codenarc.sourceforge.net/● Static analysis for Groovy code
● Over 175 rules to detect defects, bad practices, style
issues etc.
● Build tools and Sonar integration
GVM - http://gvmtool.net/● Manages parallel Versions of multiple SDKs
● Convenient command line interface
● Inspired by RVM
● Supports Groovy, Grails, Gradle etc
● Unfortunately does not work for Win
GroovyServ - http://kobo.github.io/groovyserv/● Improves Groovy’s startup time
Getting Started
Groovy in Action*
by Dierk König
● Groovy committer since
2004
● Frequent conference
speaker
● Contributor to several agile
and testing books
Programming Groovy 2
by Venkat Subramaniam
● An award-winning author
● Famous Agile Guru
● Frequent conference
speaker
Thank You!
Groovy and
NoteworthyIzzet Mustafayev@EPAM Systems@webdizzhttp://webdizz.name