Wednesday, April 16, 2014

Spock - BDD

@Grapes([
  @Grab(group='org.spockframework', module='spock-core', version='0.7-groovy-2.0')
])
import spock.lang.*

// see: http://meetspock.appspot.com/
// https://github.com/spockframework/spock

class MyFirstSpec extends Specification {
  def "test min"() {
    given: "min of a&b"

    expect:
    Math.min(a, b) == c

    where:
    a << [1,2]
    b << [4,3]
    c << [1,2]
  }
  
  def "test string length"() {
    given: "length of name"

    expect:
    name.size() == length

    where:
    name << ["Sally","Bill"]
    length << [5,4]
  }
}

Thursday, January 16, 2014

dotPath

int item = Math.random() * 100000

def doCode = { return 'hi' }
Map $_ = [a: 1, b: ['c d': [z: item, doit: doCode]]]

use (UtilCategory) {

    assert $_.dotPath() == [a: 1, b: ['c d': [z: item, doit: doCode]]]
    assert $_.dotPath('') == [a: 1, b: ['c d': [z: item, doit: doCode]]]
    assert $_.dotPath(null) == [a: 1, b: ['c d': [z: item, doit: doCode]]]
    
    assert $_.dotPath('a') == 1
    assert $_.dotPath('b.c d.z') == item
    assert $_.dotPath('b/c d/z', '/') == item
    
    assert $_.dotPath('b.c d.doit')() == 'hi'
    
    assert $_.dotPath('b.c d.y') == null
    assert $_.dotPath('b.c d.z.z') == null
    assert $_.dotPath('b.c d.z.z.') == null
    assert 1.dotPath('toString') == null

}

//========================================

@Category(Object)
class UtilCategory {
    def dotPath(String path = '', String delimiter = /\./) {
        Object self = this
        
        if (!path) return self
    
        try {
            return path.split(/$delimiter/).inject(self) { x, i->
               x = x[i]
            }
        }
        catch (Exception ex) { return null }
    }
}

Wednesday, January 15, 2014

collectEntries - List to Map

List a = (1..50).toList()

Closure remainder = { return (it % 8) }

Map b = a.collectEntries{ i-> [(i.toString()) : remainder(i)]}

assert b['5'] == 5
assert b['7'] == 7
assert b['8'] == 0
assert b['17'] == 1
String last = b.keySet()[-1]
assert b[last] == 2 // [50:2]



a = ('a'..'z').toList()

Closure mult = { return (it * 8) }

b = a.collectEntries{ i-> [(i.toString()) : mult(i)]}

assert b['a'] == 'a'*8
last = b.keySet()[-1]
assert b[last] == 'z'*8 // [z:zzzzzzzz]

csv-2-List for groovycsv

@Grab('com.xlson.groovycsv:groovycsv:1.0')
import com.xlson.groovycsv.CsvParser
 
// a normally parsed csv can only be searched through ONCE
// this is used to create a "re-searchable" object (List of Maps)
List csv2List( String filePath, boolean shouldTrim = true ) {
    new File( filePath ).withReader { r ->
        new CsvParser().parse( r ).with { csv ->
            return csv.collect { line ->
                line.columns.collectEntries { c, v ->
                    [ c, (shouldTrim ? line[ c ].trim() : line[ c ]) ]
                }
            }
        }
    }
}

Tuesday, September 17, 2013

Embedding groovy with groovyShell

//see: http://groovy.codehaus.org/Embedding+Groovy

Binding binding = new Binding();
binding.setVariable("foo", 2);
GroovyShell shell = new GroovyShell(binding);

Object value = shell.evaluate("println 'Hello World!'; x = 123; return foo * 10");
assert value.equals(20);
assert binding.getVariable("x").equals(123);

Monday, September 16, 2013

SwingX with MiGLayout - sample

package groovy.swingx.demo

@Grapes( 
    @Grab(group='com.miglayout', module='miglayout-swing', version='4.2') 
)
import groovy.swing.SwingXBuilder
import java.awt.Color
import java.awt.Font
import javax.imageio.ImageIO
import javax.swing.BorderFactory
import javax.swing.ImageIcon
import javax.swing.SwingConstants
import javax.swing.WindowConstants
import net.miginfocom.swing.MigLayout
import org.jdesktop.swingx.painter.GlossPainter
import org.jdesktop.swingx.painter.MattePainter


def swing = new SwingXBuilder()

// Text strings
def purchaseText = "Tried Catalog? Liked it? Now that you're convinced \
that living without Catalog would be horrible, purchase it for \
yourself and use it forever!"
def downloadText = "If you have Mac OS X 10.3 or later, you can grab a \
copy of Catalog right now and take it for a spin. At 816KB it's not \
only the best way to index your discs, but the most lightweight way."
def screenshotsText = "View a high quality, detailed screenshot of \
Catalog. Once you start drooling, click the button above and download."
def coolProduct  = "Introducing: Our Cool Product"
def coolProduct2 = "Having a bit of trouble shuffling through a ton of \
disks, trying to find the one that had that one document from way \
back when? Catalog allows you to find the file you're looking for \
without wearing out your disc drive (or your arm). Simply pop in a \
disk, drop it onto Catalog, and watch as it is indexed \u2013 \
virtually representing every file and tons of information about it. \
Then, when you want to find the file, search for it in Catalog and \
you find out exactly where it is, even if the disc isn't in your drive."
def dude  = "But Dude! The Disc Isn't In The Drive!"
def dude2 = "Catalog isn't supposed to feel like an extension of your disc \
browsing needs \u2013 rather it seamlessly blends offline disc \
browsing into your work environment. Browsing in Catalog feels just \
like browsing in the Finder \u2013 your files are right there in \
front of you. Once you find the file you want, just look to see where \
it is, pop in that disk, and open it up. Whether you are cataloging \
your backup, your music collection, family recipes, or your super \
secret world domination plans, Catalog will work exactly how it should."

def compoundPaint = swing.compoundPainter() {
        mattePainter(fillPaint:new Color(51,51,51))
        pinstripePainter(paint:new Color(1.0f,1.0f,1.0f,0.17f),
            spacing:5.0f)
        glossPainter(paint:new Color(1.0f,1.0f,1.0f,0.2f),
            position:GlossPainter.GlossPosition.TOP)
    }

swing.frame(title:"Groovy SwingXBuilder Painter Demo",
    background:Color.WHITE, resizable:false,
    layout:new MigLayout("insets 0 0 0 0"),
    defaultCloseOperation:WindowConstants.DISPOSE_ON_CLOSE,
    show:true,
    pack:true,
) {
    panel( backgroundPainter:compoundPaint, background:new Color(51,51,51), layout:new MigLayout(), constraints:"north, w 522") {
        //label(name:'shield',icon:new ImageIcon(ImageIO.read(new File("shield.png"))))
        label()
        label(font:new Font("Tahoma", 1,18), foreground:Color.WHITE, text:"UTAH BOY SOFTWARE", constraints:"x 80, y 20")
        label(font:new Font("Tahoma",0,14), foreground:Color.WHITE, text:"Better tools.", constraints:"x 80, y 50")
    }
    panel(backgroundPainter:new MattePainter(new Color(51,51,51)), layout:new MigLayout(), border:BorderFactory.createLineBorder(new Color(102,102,102)), constraints:"newline, north") {
        label(font:new Font("Lucinda Grande",0,9), text:"PRODUCTS", foreground:Color.WHITE, horizontalAlignment:SwingConstants.CENTER, constraints:"gapleft 9")
        label(font:new Font("Lucinda Grande",0,9), text:"STORE", foreground:Color.WHITE, horizontalAlignment:SwingConstants.CENTER, constraints: "gapleft 23")
        label(font:new Font("Lucinda Grande",0,9), text:"ABOUT", foreground:Color.WHITE, horizontalAlignment:SwingConstants.CENTER ,constraints: "gapleft 29")
        label(font:new Font("Lucinda Grande",0,9), text:"NEWS", foreground:Color.WHITE, horizontalAlignment:SwingConstants.CENTER ,constraints: "gapleft 33")
        label(font:new Font("Lucinda Grande",0,9), text:"SUPPORT", foreground:Color.WHITE, horizontalAlignment:SwingConstants.CENTER, constraints: "gapleft 28")
        label(font:new Font("Lucinda Grande",0,9), text:"GOODIES", foreground:Color.WHITE, horizontalAlignment:SwingConstants.CENTER, constraints: "gapleft 27")
    }
    //label(icon:new ImageIcon(ImageIO.read(new File("title.png"))), constraints:"north")
    label(font:new Font("Lucinda Grande",0,9), text:"TITLE IMAGE", foreground:Color.BLACK, horizontalAlignment:SwingConstants.CENTER, constraints:"north")
    separator(constraints:"w 2, h 500, gap 0", background:new Color(99,130,191), orientation:SwingConstants.VERTICAL)
    panel(layout:new MigLayout("insets 0 0 0 0")) {
        // Purchase Panel
        panel(backgroundPainter:new MattePainter(new Color(240,239,239)), layout:new MigLayout(), constraints:"gap 0, wrap") {
            label(font:new Font("Tahoma",1,11), foreground:new Color(51,102,255), text:"Purchase", constraints:"wrap")
            textArea(columns:20, constraints:"align left", font:new Font("Tahoma",0,11), lineWrap:true, rows:5, text:purchaseText, wrapStyleWord:true, border:null,
                disabledTextColor:new Color(0,0,0), opaque:false, enabled:false, selectedTextColor:Color.WHITE, selectionColor:Color.BLACK)
        }

        // Download panel
        panel(backgroundPainter:new MattePainter(Color.WHITE), layout:new MigLayout(), constraints:"gap 0, wrap") {
            label(font:new Font("Tahoma",1,11), foreground:new Color(51,102,255), text:"Download", constraints:"wrap")
            textArea(columns:20, constraints:"align left", font:new Font("Tahoma",0,11), lineWrap:true, rows:5, text:downloadText, wrapStyleWord:true, border:null,
                disabledTextColor:Color.BLACK, opaque:false, enabled:false, selectedTextColor:Color.WHITE, selectionColor:Color.BLACK)
        }

        // Screenshots panel
        panel(backgroundPainter:new MattePainter(new Color(240,239,239)), layout:new MigLayout(), constraints:"gap 0,wrap") {
            label(font:new Font("Tahoma",1,11), foreground:new Color(51,102,255), text:"Screenshots", constraints:"wrap")
            textArea(columns:20, constraints:"align left", font:new Font("Tahoma",0,11), lineWrap:true, rows:5, text:screenshotsText, wrapStyleWord:true, border:null,
                disabledTextColor:Color.BLACK, opaque:false, enabled:false, selectedTextColor:Color.WHITE, selectionColor:Color.BLACK)
        }
   }

   // western panel - cool product and dude
   panel(backgroundPainter:new MattePainter(Color.WHITE), layout:new MigLayout(), constraints:"west") {
        label(font:new Font("Tahoma",1,11), text:coolProduct)
        textArea(columns:28, constraints:"newline, gaptop 10, gapbottom 10", font:new Font("Tahoma",0,11), lineWrap:true, rows:5, text:coolProduct2, wrapStyleWord:true, disabledTextColor:Color.BLACK,
            enabled:false, selectedTextColor:Color.BLACK, border:null, selectionColor:Color.WHITE)
        label(font:new Font("Tahoma",1,11), text:dude, constraints:"newline")
        textArea(columns:28, constraints:"newline",font:new Font("Tahoma",0,11), lineWrap:true, rows:5, text:dude2, wrapStyleWord:true, disabledTextColor:Color.BLACK,
            enabled:false, selectedTextColor:Color.BLACK, border:null, selectionColor:Color.WHITE)
    }
}

Friday, August 23, 2013

MySQL Connect and Query bootstrap

//see: http://groovy.codehaus.org/Tutorial+6+-+Groovy+SQL
@Grapes(
 @Grab(group='mysql', module='mysql-connector-java', version='5.1.26')
)
@GrabConfig(systemClassLoader=true)
import groovy.sql.Sql
String user = "root"
String pwd = "1234"

String fileTable = "mcScrap";
List fileCols = ['col1','test1col'];

def sql = Sql.newInstance("jdbc:mysql://localhost:3306/onix21", user, pwd, "com.mysql.jdbc.Driver")

println "Connected!\n"

println "Found $fileTable ?: " + !!(sql.rows("SHOW TABLES LIKE ${fileTable}").size())

String command = """
CREATE TABLE IF NOT EXISTS `$fileTable` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
`${fileCols[0]}` VARCHAR(45) NULL ,
`${fileCols[1]}` VARCHAR(45) NULL ,
PRIMARY KEY (`id`) ,
UNIQUE INDEX `id_UNIQUE` (`id` ASC) );
"""
println command
println sql.execute(command)

command = "SELECT * FROM `$fileTable`"
println command
sql.eachRow(command) { println "$it.id -- ${it[fileCols[0]]} -- ${it[fileCols[1]]} --" }

println sql.execute("INSERT INTO `$fileTable` (${fileCols.join(',')}) VALUES (?,?);", ['1','1'])

command = "SELECT * FROM `$fileTable`"
println command
sql.eachRow(command) { println "$it.id -- ${it.col1} -- ${it.test1col} --" }

println sql.executeUpdate("UPDATE `$fileTable` SET ${fileCols[0]} = ? WHERE ${fileCols[1]}=1", [Math.random()])

List rows = []
sql.eachRow(command) { rows << (it.toRowResult() as HashMap) }
println "rows: " + rows.size()
println "type: " + rows[0].getClass().name
println "1st: " + rows[0]
println "all: " + rows