Skip to content
Browse files

cleanup

  • Loading branch information...
1 parent 0173a07 commit 65e07e51629069c1ce663f1bc2978638702f92e4 @burtbeckwith burtbeckwith committed Feb 20, 2013
View
4 .gitignore
@@ -5,5 +5,5 @@ target
*.log
*.zip
.DS_Store
-web-app/plugins
-web-app/WEB-INF/lib
+web-app
+plugin.xml
View
87 PlasticCriteriaGrailsPlugin.groovy
@@ -1,74 +1,19 @@
class PlasticCriteriaGrailsPlugin {
- // the plugin version
- def version = "0.6"
- // the version or versions of Grails the plugin is designed for
- def grailsVersion = "1.3 > *"
- // the other plugins this plugin depends on
- def dependsOn = [:]
- // resources that are excluded from plugin packaging
- def pluginExcludes = [
- 'grails-app/views/error.gsp',
- 'grails-app/domain/plastic/criteria/Artist.groovy',
- 'grails-app/domain/plastic/criteria/Portrait.groovy',
+ def version = "0.6"
+ def grailsVersion = "1.3 > *"
+ def pluginExcludes = [
+ 'grails-app/domain/**',
'src/groovy/plastic/criteria/CriteriaDocTests.groovy'
- ]
-
- // TODO Fill in these fields
- def title = "Plastic Criteria Plugin" // Headline display name of the plugin
- def author = "Fabio Issamu Oshiro"
- def authorEmail = ""
- def description = '''\
-Mock Grails Criteria for Unit Tests
-'''
-
- // URL to the plugin's documentation
- def documentation = "http://grails.org/plugin/plastic-criteria"
-
- // Extra (optional) plugin metadata
-
- // License: one of 'APACHE', 'GPL2', 'GPL3'
-// def license = "APACHE"
-
- // Details of company behind the plugin (if there is one)
- def organization = [ name: "Investtools", url: "http://www.investtools.com.br/" ]
-
- // Any additional developers beyond the author specified above.
-// def developers = [ [ name: "Joe Bloggs", email: "joe@bloggs.net" ]]
-
- // Location of the plugin's issue tracker.
-// def issueManagement = [ system: "JIRA", url: "http://jira.grails.org/browse/GPMYPLUGIN" ]
-
- // Online location of the plugin's browseable source code.
- def scm = [ url: "https://github.com/fabiooshiro/plastic-criteria" ]
-
- def doWithWebDescriptor = { xml ->
- // TODO Implement additions to web.xml (optional), this event occurs before
- }
-
- def doWithSpring = {
- // TODO Implement runtime spring config (optional)
- }
-
- def doWithDynamicMethods = { ctx ->
- // TODO Implement registering dynamic methods to classes (optional)
- }
-
- def doWithApplicationContext = { applicationContext ->
- // TODO Implement post initialization spring config (optional)
- }
-
- def onChange = { event ->
- // TODO Implement code that is executed when any artefact that this plugin is
- // watching is modified and reloaded. The event contains: event.source,
- // event.application, event.manager, event.ctx, and event.plugin.
- }
-
- def onConfigChange = { event ->
- // TODO Implement code that is executed when the project configuration changes.
- // The event is the same as for 'onChange'.
- }
-
- def onShutdown = { event ->
- // TODO Implement code that is executed when the application shuts down (optional)
- }
+ ]
+
+ def title = "Plastic Criteria Plugin"
+ def author = "Fabio Issamu Oshiro"
+ def authorEmail = ""
+ def description = 'Mock Grails Criteria for Unit Tests'
+ def documentation = "http://grails.org/plugin/plastic-criteria"
+
+// def license = "WTFPL"
+ def organization = [ name: "Investtools", url: "http://www.investtools.com.br/" ]
+ def issueManagement = [ system: "GitHub", url: "https://github.com/fabiooshiro/plastic-criteria/issues" ]
+ def scm = [ url: "https://github.com/fabiooshiro/plastic-criteria" ]
}
View
19 README.md
@@ -21,9 +21,9 @@ Grails 2.0.x edit your <your-project>/grails-app/conf/BuildConfig.groovy
// (...)
plugins {
// (...) another plugins
-
+
// add this line
- test ":plastic-criteria:0.4"
+ test ":plastic-criteria:0.6"
}
// (...)
```
@@ -36,27 +36,27 @@ package plastic.test
import grails.test.mixin.*
// import mockCriteria() static method
-import static plastic.criteria.PlasticCriteria.*
+import static plastic.criteria.PlasticCriteria.*
@TestFor(Product)
class ProductTests {
-
+
void testSomething() {
new Product(name: 'Foo', value: 10).save()
new Product(name: 'Foo', value: 20).save()
new Product(name: 'Bar', value: 200).save()
new Product(name: 'Bar', value: 100).save()
-
+
// replace default criteria mock
- mockCriteria([Product])
-
+ mockCriteria([Product])
+
def results = Product.withCriteria{
projections{
groupProperty('name') // now you have groupProperty
sum('value')
}
}
-
+
assert [['Foo', 30 ], ['Bar', 300]] == results
}
}
@@ -67,7 +67,7 @@ just
```
import static plastic.criteria.PlasticCriteria.*;
```
-and
+and
```
mockCriteria([Product])
```
@@ -76,4 +76,3 @@ mockCriteria([Product])
<a href="https://twitter.com/fabiooshiro">Sr. Oshiro</a>,
<a href="http://www.facebook.com/MaxMustang23">Max Mustang</a>,
<a href="https://twitter.com/dtuler">Danilo Tuler</a>
-
View
6 application.properties
@@ -1,7 +1 @@
-#Grails Metadata file
-#Mon Jan 21 11:35:17 BRST 2013
app.grails.version=2.1.3
-app.name=plastic-criteria
-plugins.hibernate=2.1.3
-plugins.rest-client-builder=1.0.2
-plugins.svn=1.0.1
View
49 grails-app/conf/BuildConfig.groovy
@@ -1,39 +1,24 @@
-grails.project.class.dir = "target/classes"
-grails.project.test.class.dir = "target/test-classes"
-grails.project.test.reports.dir = "target/test-reports"
+grails.project.work.dir = 'target'
grails.project.target.level = 1.6
-//grails.project.war.file = "target/${appName}-${appVersion}.war"
grails.project.dependency.resolution = {
- // inherit Grails' default dependencies
- inherits("global") {
- // uncomment to disable ehcache
- // excludes 'ehcache'
- }
- log "warn" // log level of Ivy resolver, either 'error', 'warn', 'info', 'debug' or 'verbose'
- repositories {
- grailsCentral()
- // uncomment the below to enable remote dependency resolution
- // from public Maven repositories
- mavenCentral()
- mavenLocal()
- //mavenRepo "http://snapshots.repository.codehaus.org"
- //mavenRepo "http://repository.codehaus.org"
- //mavenRepo "http://download.java.net/maven/2/"
- //mavenRepo "http://repository.jboss.com/maven2/"
- }
- dependencies {
- // specify dependencies here under either 'build', 'compile', 'runtime', 'test' or 'provided' scopes eg.
- // runtime 'mysql:mysql-connector-java:5.1.5'
- // build ":release:2.0.0"
+ inherits 'global'
+ log 'warn'
+
+ repositories {
+ grailsCentral()
+ mavenLocal()
+ mavenCentral()
+ }
+
+ dependencies {
compile 'javassist:javassist:3.12.1.GA'
- }
+ }
- plugins {
- build(":tomcat:$grailsVersion",
- ":release:2.0.0") {
- export = false
- }
- }
+ plugins {
+ build(":release:2.0.0") {
+ export = false
+ }
+ }
}
View
28 grails-app/conf/Config.groovy
@@ -1,26 +1,6 @@
-// configuration for plugin testing - will not be included in the plugin zip
-
log4j = {
- // Example of changing the log pattern for the default console
- // appender:
- //
- //appenders {
- // console name:'stdout', layout:pattern(conversionPattern: '%c{2} %m%n')
- //}
-
- error 'org.codehaus.groovy.grails.web.servlet', // controllers
- 'org.codehaus.groovy.grails.web.pages', // GSP
- 'org.codehaus.groovy.grails.web.sitemesh', // layouts
- 'org.codehaus.groovy.grails.web.mapping.filter', // URL mapping
- 'org.codehaus.groovy.grails.web.mapping', // URL mapping
- 'org.codehaus.groovy.grails.commons', // core / classloading
- 'org.codehaus.groovy.grails.plugins', // plugins
- 'org.codehaus.groovy.grails.orm.hibernate', // hibernate integration
- 'org.springframework',
- 'org.hibernate',
- 'net.sf.ehcache.hibernate'
-
- warn 'org.mortbay.log'
+ error 'org.codehaus.groovy.grails',
+ 'org.springframework',
+ 'org.hibernate',
+ 'net.sf.ehcache.hibernate'
}
-grails.views.default.codec="none" // none, html, base64
-grails.views.gsp.encoding="UTF-8"
View
49 grails-app/conf/DataSource.groovy
@@ -1,43 +1,14 @@
dataSource {
- pooled = true
- driverClassName = "org.h2.Driver"
- username = "sa"
- password = ""
+ pooled = true
+ driverClassName = 'org.h2.Driver'
+ username = 'sa'
+ password = ''
+ dbCreate = 'update'
+ url = 'jdbc:h2:mem:testDb'
}
+
hibernate {
- cache.use_second_level_cache = true
- cache.use_query_cache = true
- cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
-}
-// environment specific settings
-environments {
- development {
- dataSource {
- dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
- url = "jdbc:h2:mem:devDb;MVCC=TRUE"
- }
- }
- test {
- dataSource {
- dbCreate = "update"
- url = "jdbc:h2:mem:testDb;MVCC=TRUE"
- }
- }
- production {
- dataSource {
- dbCreate = "update"
- url = "jdbc:h2:prodDb;MVCC=TRUE"
- pooled = true
- properties {
- maxActive = -1
- minEvictableIdleTimeMillis=1800000
- timeBetweenEvictionRunsMillis=1800000
- numTestsPerEvictionRun=3
- testOnBorrow=true
- testWhileIdle=true
- testOnReturn=true
- validationQuery="SELECT 1"
- }
- }
- }
+ cache.use_second_level_cache = false
+ cache.use_query_cache = false
+ cache.provider_class = 'org.hibernate.cache.EhCacheProvider'
}
View
9 grails-app/domain/plastic/criteria/Artist.groovy
@@ -1,13 +1,12 @@
-package plastic.criteria;
+package plastic.criteria
-public class Artist {
+class Artist {
String name
-
+
String toString(){
name
}
-
+
static hasMany = [portraits: Portrait]
-
}
View
17 grails-app/domain/plastic/criteria/Portrait.groovy
@@ -1,25 +1,24 @@
-package plastic.criteria;
+package plastic.criteria
-public class Portrait {
+class Portrait {
static belongsTo = [artist: Artist]
-
+
String name
-
+
BigDecimal value
-
+
BigDecimal lastSoldPrice
-
+
String color
-
+
String toString(){
"${name} (id: ${id})"
}
-
+
static constraints = {
color nullable: true
value nullable: true
lastSoldPrice nullable: true
}
-
}
View
81 src/groovy/plastic/criteria/CriteriaDocTests.groovy
@@ -1,9 +1,10 @@
-package plastic.criteria;
+package plastic.criteria
+
+import static org.junit.Assert.*
-import static org.junit.Assert.*;
import org.hibernate.FetchMode
-public class CriteriaDocTests {
+class CriteriaDocTests {
void testGroupProperty() {
def pablo = new Artist(name: 'Pablo').save()
@@ -19,7 +20,7 @@ public class CriteriaDocTests {
}
assert [[32.00, pablo], [20.00, salvador]] == artistValue
}
-
+
void test2xGroupProperty(){
def pablo = new Artist(name: 'Pablo').save()
def salvador = new Artist(name: 'Salvador').save()
@@ -37,7 +38,7 @@ public class CriteriaDocTests {
}
assert [[10.00, pablo], [20.00, salvador]] == artistValue
}
-
+
void testAnd(){
def pablo = new Artist(name: 'Pablo').save()
new Portrait(artist: pablo, name: "Les Demoiselles d'Avignon", value: 10.00, color: 'orange').save()
@@ -49,11 +50,11 @@ public class CriteriaDocTests {
}
eq('color', 'blue')
}
-
+
assert 1 == portraits.size()
assert "Les Noces de Pierrette" == portraits[0].name
}
-
+
void testOr(){
def artitst = new Artist(name: 'Brilhante').save()
def plastic1 = new Portrait(artist: artitst, name: 'Soleil levant').save()
@@ -65,7 +66,7 @@ public class CriteriaDocTests {
eq('name', 'The Madonna of Port Lligat')
}
}
-
+
assert [plastic1, plastic2] == ls
}
@@ -81,7 +82,7 @@ public class CriteriaDocTests {
}
assert 2.0 == average
}
-
+
void testSum(){
def artitst = new Artist(name: 'Brilhante').save()
new Portrait(artist: artitst, name: 'Soleil levant', value: 1.0).save()
@@ -94,7 +95,7 @@ public class CriteriaDocTests {
}
assert 6.0 == total
}
-
+
void testMin(){
def artitst = new Artist(name: 'Brilhante').save()
new Portrait(artist: artitst, name: 'Soleil levant', value: 1.0).save()
@@ -107,7 +108,7 @@ public class CriteriaDocTests {
}
assert 1.0 == res
}
-
+
void testMax(){
def artitst = new Artist(name: 'Brilhante').save()
new Portrait(artist: artitst, name: 'Soleil levant', value: 1.0).save()
@@ -120,7 +121,7 @@ public class CriteriaDocTests {
}
assert 3.0 == res
}
-
+
void testIgnoreCase(){
def artitst = new Artist(name: 'Brilhante').save()
def a = new Portrait(artist: artitst, name: 'Soleil levant', value: 1.0).save()
@@ -129,10 +130,10 @@ public class CriteriaDocTests {
def results = Portrait.withCriteria{
eq('name', 'SOLEIL LEVANT', [ignoreCase: true])
}
-
+
assert [a, b] == results
}
-
+
void testLike(){
def artitst = new Artist(name: 'Brilhante').save()
def a = new Portrait(artist: artitst, name: 'Soleil levant', value: 1.0).save()
@@ -143,7 +144,7 @@ public class CriteriaDocTests {
}
assert [a, b] == results
}
-
+
void testNot(){
def artitst = new Artist(name: 'Brilhante').save()
def a = new Portrait(artist: artitst, name: 'Soleil levant', value: 1.0).save()
@@ -156,7 +157,7 @@ public class CriteriaDocTests {
}
assert [c] == results
}
-
+
void testMissingMethodException(){
try{
Portrait.withCriteria{
@@ -167,7 +168,7 @@ public class CriteriaDocTests {
assert e.message?.contains('.myMissingMethod()')
}
}
-
+
void testRowCount(){
def artitst = new Artist(name: 'Brilhante').save()
def a = new Portrait(artist: artitst, name: 'Soleil levant', value: 1.0).save()
@@ -180,7 +181,7 @@ public class CriteriaDocTests {
}
assert 3 == res[0]
}
-
+
// not working in H2
void xtestRowCountAndGroupProperty(){
def monet = new Artist(name: 'Monet').save()
@@ -210,7 +211,7 @@ public class CriteriaDocTests {
assert a == res[0]
assert c == res[1]
}
-
+
void testEqProperty(){
def artitst = new Artist(name: 'Brilhante').save()
def soleill = new Portrait(value: 20.0, lastSoldPrice: 10.0, name: 'Soleil levant',artist: artitst ).save()
@@ -287,67 +288,67 @@ public class CriteriaDocTests {
assert 1 == res.size()
assert soleill == res.first()
}
-
+
void testProjectionProperty(){
def monet = new Artist(name: 'Monet').save()
-
+
new Portrait(artist: monet, name: 'Soleil levant 1', value: 1.0).save()
new Portrait(artist: monet, name: 'Soleil levant 2', value: 1.0).save()
new Portrait(artist: monet, name: 'Soleil levant 3', value: 1.0).save()
-
+
def rs = Portrait.withCriteria {
projections {
property('artist')
}
}
-
+
assert 3 == rs.size()
rs.each{
assert it instanceof Artist
assert it.name == 'Monet'
}
}
-
+
void testProjectionProperties(){
def monet = new Artist(name: 'Monet').save()
-
+
new Portrait(artist: monet, name: 'Soleil levant 1', value: 1.0).save()
new Portrait(artist: monet, name: 'Soleil levant 2', value: 1.0).save()
new Portrait(artist: monet, name: 'Soleil levant 3', value: 1.0).save()
-
+
def rs = Portrait.withCriteria {
projections {
property('artist')
property('value')
}
}
-
+
assert 3 == rs.size()
rs.each{
assert it[0] instanceof Artist
assert it[0].name == 'Monet'
assert it[1] == 1.0
}
}
-
+
void testProjectionPropertyAndSum(){
def monet = new Artist(name: 'Monet').save()
-
+
new Portrait(artist: monet, name: 'Soleil levant 1', value: 1.0).save()
new Portrait(artist: monet, name: 'Soleil levant 2', value: 1.0).save()
new Portrait(artist: monet, name: 'Soleil levant 3', value: 1.0).save()
-
+
def rs = Portrait.withCriteria {
projections {
property('artist')
sum('value')
}
}
-
+
assert 1 == rs.size()
assert [[monet, 3.0]] == rs
}
-
+
void testOrderBy(){
def a = new Artist(name: 'Andreas Achenbach').save()
def c = new Artist(name: 'Constance Gordon-Cumming').save()
@@ -368,7 +369,7 @@ public class CriteriaDocTests {
}
assert ['Andreas Achenbach', 'Botero', 'Constance Gordon-Cumming'] == artistList
}
-
+
//next release 0.5
void testDistinctWithArrayParam(){
def b = new Artist(name: 'Tomie Oshiro').save()
@@ -390,36 +391,36 @@ public class CriteriaDocTests {
void test_sum_null(){
def monet = new Artist(name: 'Monet').save()
-
+
new Portrait(artist: monet, name: 'Soleil levant 1').save()
new Portrait(artist: monet, name: 'Soleil levant 2').save()
new Portrait(artist: monet, name: 'Soleil levant 3').save()
-
+
def rs = Portrait.withCriteria {
projections {
property('artist')
sum('value')
}
}
-
+
assert 1 == rs.size()
assert [[monet, null]] == rs
}
void test_sum_with_null(){
def monet = new Artist(name: 'Monet').save()
-
+
new Portrait(artist: monet, name: 'Soleil levant 1').save()
new Portrait(artist: monet, name: 'Soleil levant 2', value: 1.1).save()
new Portrait(artist: monet, name: 'Soleil levant 3').save()
-
+
def rs = Portrait.withCriteria {
projections {
property('artist')
sum('value')
}
}
-
+
assert 1 == rs.size()
assert [[monet, 1.1]] == rs
}
@@ -466,7 +467,7 @@ public class CriteriaDocTests {
eq('artist', monet)
uniqueResult = true
}
- assert res == null
+ assert res == null
}
void test_plastic_criteria_over_arrayList(){
View
80 src/groovy/plastic/criteria/PlasticCriteria.groovy
@@ -1,6 +1,6 @@
-package plastic.criteria;
+package plastic.criteria
-public class PlasticCriteria {
+class PlasticCriteria {
def _clazz
def _maxRes
def _props = []
@@ -10,7 +10,7 @@ public class PlasticCriteria {
def _distinctProp
def _leCriticalList = [tp: 'and', ls: []]
def _prefix = ''
-
+
def _instanceValue
def _criteriaValue
def _critOptions
@@ -36,25 +36,25 @@ public class PlasticCriteria {
"gtProperty":{ _instanceValue > _criteriaValue },
"ltProperty":{ _instanceValue < _criteriaValue }
]
-
- public PlasticCriteria(List list){
- this._clazz = [list: {list}]
+
+ PlasticCriteria(List list){
+ _clazz = [list: {list}]
}
- public PlasticCriteria(clazz){
- this._clazz = clazz
+ PlasticCriteria(clazz){
+ _clazz = clazz
}
-
- public PlasticCriteria(clazz, pref){
+
+ PlasticCriteria(clazz, pref){
_prefix = pref + '.'
}
-
+
static void mockCriteria(List clazzes){
clazzes.each{
mockCriteria(it)
- }
+ }
}
-
+
static void mockCriteria(Class clazz){
clazz.metaClass.'static'.withCriteria = { Closure cls ->
new PlasticCriteria(clazz).list(cls)
@@ -68,83 +68,83 @@ public class PlasticCriteria {
ge(prop, firstValue)
le(prop, secondValue)
}
-
+
def listDistinct(cls){
-
+
}
-
+
def maxResults(limit){
_maxRes = limit
}
-
+
def distinct(prop){
_distinctProp = prop
}
-
+
def property(prop){
_props.add(prop)
}
-
+
def min(prop){
_hasCalcProp = true
_props.add("min $prop")
}
-
+
def max(prop){
_hasCalcProp = true
_props.add("max $prop")
}
-
+
def sum(prop){
_hasCalcProp = true
_props.add("sum $prop")
}
-
+
def avg(prop){
_hasCalcProp = true
_props.add("avg $prop")
}
-
+
def groupProperty(prop){
_groupProps.add(prop)
_props.add(prop)
}
-
+
def rowCount(){
_hasCalcProp = true
_props.add("rowCount ")
}
-
+
def projections(clos){
clos.delegate = this
clos()
}
-
+
def order(prop, order){
_orders.add("${prop} ${order}")
}
-
+
def methodMissing(String name, args){
if(theImplementations.containsKey(name)){
_leCriticalList.ls.add([criteriaName: name, prop: _prefix + args[0], val: ((args.length > 1) ? args[1] : 'null'), opt: ((args.length > 2) ? args[2] : [:])])
}else{
if(!args || !(args[0] instanceof Closure)) throw new MissingMethodException(name, this.class, args)
- def fc = new PlasticCriteria(this._clazz, name)
+ def fc = new PlasticCriteria(_clazz, name)
args[0].resolveStrategy = Closure.DELEGATE_FIRST
args[0].delegate = fc
args[0]()
fc._leCriticalList.ls.each{ v ->
- this._leCriticalList.ls.add(v)
+ _leCriticalList.ls.add(v)
}
fc._orders.each{
- this._orders.add((name + '.' + it))
+ _orders.add((name + '.' + it))
}
if(fc._distinctProp){
- this._distinctProp = name + '.' + fc._distinctProp
+ _distinctProp = name + '.' + fc._distinctProp
}
}
}
-
+
def theAndOrNotPush(tp, clos){
def thePersistenceOfMemory = _leCriticalList
_leCriticalList = [tp: tp, ls: []]
@@ -153,19 +153,19 @@ public class PlasticCriteria {
clos()
_leCriticalList = thePersistenceOfMemory
}
-
+
def and(clos){
theAndOrNotPush('and', clos)
}
-
+
def or(clos){
theAndOrNotPush('or', clos)
}
-
+
def not(clos){
theAndOrNotPush('not', clos)
}
-
+
def list(clos){
clos.delegate = this
clos()
@@ -239,7 +239,7 @@ public class PlasticCriteria {
return ls
}
}
-
+
def _runCriteria(cri, obj){
if(cri.criteriaName.endsWith('Property')){
_criteriaValue = obj."${cri.val}"
@@ -250,7 +250,7 @@ public class PlasticCriteria {
_critOptions = cri.opt
return theImplementations[cri.criteriaName]()
}
-
+
def knokinOnHeavensDoor(criList, obj){
def gotoParadise
if(criList.tp == 'and'){
@@ -282,7 +282,7 @@ public class PlasticCriteria {
}
return res
}
-
+
def _filteredList(){
def r = []
_clazz.list().each{ obj ->
@@ -308,7 +308,7 @@ public class PlasticCriteria {
}
return r
}
-
+
def get(clos){
def ls = list(clos)
return ls ? ls.first() : null
View
12 test/unit/plastic/criteria/PlasticCriteriaTests.groovy
@@ -1,18 +1,14 @@
-package plastic.criteria;
+package plastic.criteria
-import static org.junit.Assert.*;
-import static plastic.criteria.PlasticCriteria.*;
-import grails.test.mixin.Mock;
+import static plastic.criteria.PlasticCriteria.*
-import org.junit.Before;
-import org.junit.Test;
+import org.junit.Before
@Mock([Artist, Portrait])
-public class PlasticCriteriaTests extends CriteriaDocTests{
+class PlasticCriteriaTests extends CriteriaDocTests{
@Before
void setUp(){
mockCriteria([Artist, Portrait])
}
-
}

0 comments on commit 65e07e5

Please sign in to comment.
Something went wrong with that request. Please try again.