leftovers...

about grails groovy

Grails 2.4.0 リリースきた!!!!

Grails 2.4.0 リリースです!!



例のコペンハーゲンで開催されるカンファレンスが、いよいよ、来週と迫ってまいりました!
行きたい!行きたい!行きたい!

そんな中の、Grails 2.4 リリース。もぅ、何だったら、今やってるプロジェクトを全部 2.4 にしてやりますっ!!





Grails 2.4 での更新内容!

Groovy 2.3に更新!!!

Spring 4 に更新

デフォルトのHibernateが4.3.5に変更。

スタンドアロンGORM

静的アセット管理はリソースプラグインから、アセットパイプラインに変更!

//= require jquery
//= require_self
//= require file_a
//= require_tree .
console.log('some javascript');
  • アセットをGSPで設定するには、以下のタグが提供されます。
<asset:javascript src="application.js"/>
<asset:stylesheet href="application.css"/>
<asset:image src="grails_logo.png" height="60" />


スタンドアロンGSP

スタティックコンパイル対応!

サンプルコードはこんな感じです。

import grails.compiler.GrailsCompileStatic
import groovy.transform.TypeCheckingMode
@GrailsCompileStatic
class SomeClass {

    def update() {
        // this method will be statically compiled
    }

    @GrailsCompileStatic(TypeCheckingMode.SKIP)
    def save() {
        // this method will not be statically compiled
    }

    def delete() {
        // this method will be statically compiled
    }
}

Ajaxタグが無くなります

  • formRemote, remoteField, remoteFunction, remoteLinkなどのAJAXタグが将来のバージョンで無くなります。

grails-debugとgrails-debug.batが削除されました

  • 今後はgrails -debugか、grails --debug-forkで実行しましょう。

コマンドオブジェクト関連

  • コマンドオブジェクトでの nullable:false 対応
  • コマンドオブジェクトデータバインダーで同じドメインで複数引数が可能に。

以下のように、Personが複数指定されている場合に、リクエストパラメータを、buyer.nameやseller.name等の指定をすると、それぞれのオブジェクトにバインドされます。

class StoreController {
    def buy(Person buyer, Person seller) {
        // …
    }
}
class Person {
    String name
}

GORMで、よりアドバンスドなサブクエリー
サブクエリーが拡張されました。ネストサブクエリで"in"が使用できます。

def results = Person.where {
    firstName in where { age < 18 }.firstName
}.list()

Criteriaとwhereクエリがシームレスに融合できます

def results = Person.withCriteria {
    notIn "firstName", Person.where { age < 18 }.firstName
}

サブクエリでプロジェクションを一緒に使用できます。

def results = Person.where {
    age > where { age > 18 }.avg('age')
}

2つのドメインクラスに別れた関連するクエリ実行:

def employees = Employee.where {
    region.continent in ['APAC', "EMEA"]
}.id()
def results = Sale.where {
    employee in employees && total > 100000
}.employee.list()

whereクエリでの簡単な変数宣言を使用したエイリアス(クロスクエリリファレンス)のサポート。

def query = Employee.where {
    def em1 = Employee
    exists Sale.where {
        def s1 = Sale
        def em2 = employee
        return em2.id == em1.id
    }.id()
}
def results = query.list()

ネームスペース付きのコントローラでのビューの選択

  • 新たにネームスペース付きコントローラ用のビューディレクトリが選択されるようになりました。

namespace指定があるコントローラのビューファイルは、grails-app/views///を最初に参照するようになります。ビューファイルが存在しない場合は、今まで同様にgrails-app/views//のビューファイルが参照されます。

class SomeController {
    static namespace = 'foo'
    def myaction(){
        //この場合は、 grails-app/views/foo/some/myaction.gspが最初に参照され
        //存在しない場合は grails-app/views/some/myaction.gsp が参照されます。
        [number:1]
    }
}

プログラマチックトランザクションの向上

// org.springframework.transaction.support.DefaultTransactionDefinition のプロパティに対応したMapキーで指定
Account.withTransaction([propagationBehavior: TransactionDefinition.PROPAGATION_REQUIRES_NEW,
                         isolationLevel: TransactionDefinition.ISOLATION_REPEATABLE_READ]) {
    // ...
}

Mavenプラグイン更新
Mavenプラグイン(2.4.0)は、Aetherベースで再構築されました。Aetherベースになった事で、今後のGrails 2.3.x , 2.4.xが更新されても、Mavenプラグインを更新する必要がなくなります。これにより、Mavenプラグインは、このバージョンが最後に!?


Unitテスト向上。
(意訳が変なので注意!しかも途中あきらめて(ry)
以前のTestMixinベースの方法で、Grails"unit testing runtime"があります。今回からTestMixinクラス関連とGrails"unit testing runtime"のライフサイクルをハンドルする実際のランタイムが切り分けられました。これによってランタイムのステートは、TestMixin関連クラスのスタティックフィールドに保持されません。TestMixinアノテーションの背後にあるGroovy AST変換は、JunitとSpockテストクラスへJUnitルールフィールドをクラスに追加します。
主な機能としては(間違ってたらゴメン):

  • GrailsアプリケーションのUnitテストのプログラミングモデルは変わりません
  • Setup/teardownメソッドの順番は決定的となります。理由としては新たな統合方法が単一のJUnit Ruleフィールドを使用しているのとテストランタイムが内部的イベントでリソースのsetupとteardownを行うため。
  • UnitテストにdoWithSpringとdoWithConfigのコールバックが存在します。これらのコールバックメソッドは、UnitテストランタイムがgrailsApplicationインスタンスを初期化する前に呼び出されます
  • GrailsUnitテストランタイムアプリケーションのアプリケーションコンテキストにBeanとしてSpockモックをレジスト可能。モックでコラボレータビーンの入替ができます。
  • いくつかのテストクラスに1つのアプリケーションコンテキストを再利用できます。
  • Grails Unitテストランタイムはイベントベースプラグインアーキテクチャを持っています。新たにテストランタイムプラグインクラスを提供することで、テストランタイム機能を追加することが可能です。テストランタイムプラグインAPIは、今後変更される予定です。変更内容はGrailsコミュニティのフィードバックをベースとします。メインとなるAPIインターフェイスのドキュメントはJava Docに有ります: TestPlugin, TestEventInterceptor, TestEvent。現在は使用可能なプラグインをスキャンする方法が無いため、カスタムテストプラグインは制限されています。現状ではテストクラスの初期化ブロックでTestRuntimeFactory.addPluginClassをコールすることでカスタムテストプラグインを追加できます。

詳しくは、更新されたUnitテストのドキュメントを参考にしましょう

allowedMethodsのUnitテスト対応向上
以下のようなコントローラがあるとして

package com.demo
class DemoController {

    static allowedMethods = [save: 'POST', update: 'PUT', delete: 'DELETE']

    def save() {
        render 'Save was successful!'
    }

    // …
}

以下のように記述します

package com.demo
import grails.test.mixin.TestFor
import spock.lang.Specification
import static javax.servlet.http.HttpServletResponse.*

@TestFor(DemoController)
class DemoControllerSpec extends Specification {

    void "test a valid request method"() {
        when:
        request.method = 'POST'
        controller.save()

        then:
        response.status == SC_OK
        response.text == 'Save was successful!'
    }

    void "test an invalid request method"() {
        when:
        request.method == 'DELETE'
        controller.save()

        then:
        response.status == SC_METHOD_NOT_ALLOWED
    }
}

GORM for Hibernate in Unit tests
HibernateTestMixinを使用する事で、今後Hibernateを使用したGORMのUnitテストはインテグレーションテストを書く必要が無くなります。

import grails.test.mixin.hibernate.*
@TestMixin(HibernateTestMixin)
class PersonSpec extends Specification{

    void setupSpec() {
        hibernateDomain([Person])
    }

    void "Test count people"() {
        expect:"Test execute Hibernate count query"
            Person.count() == 0
            sessionFactory != null
            transactionManager != null
            session != null
    }
}

Grails 2.3からの更新注意点。
(公式ドキュメント) http://grails.org/doc/2.4.x/guide/upgradingFrom23.html
一部を抜粋

  • upgradeコマンドはこのバージョンから無くなります。
  • set-grails-versionコマンド - application.propertiesのメタ情報としてのGrailsバージョンを変更
grails set-grails-version 2.4.0
  • スタティックHolderクラス - 以下のHolderクラスがGrails 2.4から無くなります。代わりにgrails.util.Holdersを使用しましょう。
  • applicationContex.xmlの内容変更
  • web.xmlの内容変更



ここまでとしておきます。





長かった。。






更新内容に関しては、ほぼ、ここの記事に書いています。間違いなどあったら、やさしく教えてください!
日本語ドキュメントは、頑張って更新します。それまでは、本家ドキュメントを!
http://grails.org/doc/2.4.x/





Grails 2.4.0 の公式リリースノートはこちら。
http://grails.org/2.4.0+Release+Notes
JIRA http://jira.grails.org/secure/ReleaseNote.jspa?projectId=10020&version=13803
ダウンロード http://grails.org/Download
直リン grails-2.4.0.zip
ドキュメント http://grails.org/doc/2.4.x




さて、いよいよ年末リリースの3.0に向けての開発が始まるみたいです!
Grails 3.0では、Spring Bootがベースになり、Gradleサポートとなり、さらには、数年前から目標となっていた、アプリケーションを、マイクロサービスから今までのようなWebアプリケーション形式までの幅広い形式に対応予定との事!


次も楽しみ!先ずは Grails 2.4 を楽しみましょう!