Added all project files

This commit is contained in:
Kingsley Hendrickse 2012-04-14 08:28:04 +01:00
parent fbfd055b7f
commit 9d23648c31
339 changed files with 8495 additions and 0 deletions

BIN
.README/feature-failed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 97 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

BIN
.README/feature-passed.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 93 KiB

BIN
.README/publish-box.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

4
.gitignore vendored Normal file
View File

@ -0,0 +1,4 @@
work
target
.DS_Store
.log

View File

@ -0,0 +1,59 @@
# Publish pretty [cucumber-jvm](https://github.com/cucumber/cucumber-jvm) reports on [Jenkins](http://jenkins-ci.org/)
This is a Java Jenkins plugin which publishes pretty html reports showing the results of cucumber-jvm runs.
## Background
Cucumber-JVM is a test automation tool following the principles of Behavioural Driven Design and living documentation. Specifications are written in a concise human readable form and executed in continuous integration.
This plugin allows Jenkins to publish the results as pretty html reports hosted by the Jenkins build server. In order for this plugin to work you must be using the JUnit runner and generating a json report. The plugin converts the json report into an overview html linking to separate feature file htmls with stats and results.
## Install
1. [Get](https://jenkins-ci.org/) Jenkins.
2. Install the [cucumber-jvm-reports-java]
(https://wiki.jenkins-ci.org/display/JENKINS) plugin.
3. Restart Jenkins.
## Use
With the cucumber-jvm-reports plugin installed in Jenkins, you simply check the "Publish cucumber results as a report" box in the
publish section of the build config and enter the path to the json reports relative to the workspace:
![check the publish cucumber-jvm-reports box]
(https://github.com/masterthought/jenkins-cucumber-jvm-reports-plugin/raw/master/.README/publish-box.png)
When a build runs that publishes cucumber-jvm results it will put a link in the sidepanel to the cucumber reports. There is a feature overview page:
![feature overview page]
(https://github.com/masterthought/jenkins-cucumber-jvm-reports-plugin/raw/master/.README/feature-overview.png)
And there are also feature specific results pages:
![feature specific page passing]
(https://github.com/masterthought/jenkins-cucumber-jvm-reports-plugin/raw/master/.README/feature-passed.png)
And useful information for failures:
![feature specific page passing]
(https://github.com/masterthought/jenkins-cucumber-jvm-reports-plugin/raw/master/.README/feature-failed.png)
Make sure you have configured cucumber-jvm to run with the JUnit runner and to generate a json report:
package net.masterthought.example;
import cucumber.junit.Cucumber;
import org.junit.runner.RunWith;
@RunWith(Cucumber.class)
@Cucumber.Options(format = {"pretty", "html:target/cucumber", "json:target/cucumber.json"})
public class ATMTest {
}
## Develop
Interested in contributing to the Jenkins cucumber-jvm-reports plugin? Great! Start [here]
(https://github.com/jenkinsci/jenkins.rb/wiki/Getting-Started-With-Ruby-Plugins).

198
cucumber-reports.iml Normal file
View File

@ -0,0 +1,198 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_5" inherit-compiler-output="false">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/target/generated-sources/localizer" isTestSource="false" />
<excludeFolder url="file://$MODULE_DIR$/target/classes" />
<excludeFolder url="file://$MODULE_DIR$/target/cucumber-reports" />
<excludeFolder url="file://$MODULE_DIR$/target/generated-sources/groovy-stubs" />
<excludeFolder url="file://$MODULE_DIR$/target/test-classes" />
<excludeFolder url="file://$MODULE_DIR$/target/work" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: com.google.code.gson:gson:1.7.1" level="project" />
<orderEntry type="library" name="Maven: maven:velocity:1.5-20060721.044818" level="project" />
<orderEntry type="library" name="Maven: ant:ant:1.6.2" level="project" />
<orderEntry type="library" name="Maven: commons-collections:commons-collections:3.1" level="project" />
<orderEntry type="library" name="Maven: commons-lang:commons-lang:2.1" level="project" />
<orderEntry type="library" name="Maven: jdom:jdom:1.0" level="project" />
<orderEntry type="library" name="Maven: log4j:log4j:1.2.12" level="project" />
<orderEntry type="library" name="Maven: avalon-logkit:avalon-logkit:2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:servlet-api:2.4" level="project" />
<orderEntry type="library" name="Maven: geronimo-spec:geronimo-spec-javamail:1.3.1-rc3" level="project" />
<orderEntry type="library" name="Maven: geronimo-spec:geronimo-spec-jms:1.1-rc4" level="project" />
<orderEntry type="library" name="Maven: oro:oro:2.0.8" level="project" />
<orderEntry type="library" name="Maven: werken-xpath:werken-xpath:0.9.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: junit:junit:4.8.2" level="project" />
<orderEntry type="library" name="Maven: antlr:antlr:2.7.5" level="project" />
<orderEntry type="library" name="Maven: com.jamesmurty.utils:java-xmlbuilder:0.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main:jenkins-war:war:1.424" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci.main:jenkins-core:1.424" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci.main:remoting:2.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-codec:commons-codec:1.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci.main:cli:1.424" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.localizer:localizer:1.10" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:trilead-ssh2:build212-hudson-5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci:crypto-util:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-io:commons-io:1.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:jtidy:4aug2000r7-dev-hudson-1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jruby.ext.posix:jna-posix:1.0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke:trilead-putty-extension:1.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.stapler:stapler-groovy:1.172" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.stapler:stapler-jelly:1.172" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.stapler:stapler:1.172" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-discovery:commons-discovery:0.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-logging:commons-logging:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-beanutils:commons-beanutils:1.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.stapler:json-lib:2.1-rev7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.sf.ezmorph:ezmorph:1.0.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet:tiger-types:1.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.google.guava:guava:r06" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-fileupload:commons-fileupload:1.2.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci:commons-jelly:1.1-jenkins-20110627" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:commons-jexl:1.1-hudson-20090508" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson.dom4j:dom4j:1.6.1-hudson-3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.stapler:stapler-jrebel:1.172" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.stapler:stapler-adjunct-timeline:1.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.stapler:stapler-adjunct-codemirror:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.infradna.tool:bridge-method-annotation:1.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:annotation-indexer:1.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci:htmlunit:2.6-jenkins-4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: xalan:xalan:2.7.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: xalan:serializer:2.7.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-httpclient:commons-httpclient:3.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:htmlunit-core-js:2.6-hudson-1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: xerces:xercesImpl:2.9.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.sourceforge.nekohtml:nekohtml:1.9.13" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.sourceforge.cssparser:cssparser:0.9.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.w3c.css:sac:1.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: args4j:args4j:2.0.16" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:task-reactor:1.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:xstream:1.3.1-hudson-8" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: xpp3:xpp3_min:1.1.4c" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: jfree:jfreechart:1.0.9" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: jfree:jcommon:1.0.12" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.ant:ant:1.8.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-digester:commons-digester:1.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.mail:mail:1.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:activation:1.1.1-hudson-1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: jaxen:jaxen:1.1-beta-11" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-jelly:commons-jelly-tags-fmt:1.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: commons-jelly:commons-jelly-tags-xml:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.hudson:commons-jelly-tags-define:1.0.1-hudson-20071021" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.acegisecurity:acegi-security:1.0.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-core:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-jdbc:1.2.9" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-beans:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-dao:1.2.9" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-context:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.codehaus.groovy:groovy-all:1.6.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.apache.ant:ant-launcher:1.7.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: jline:jline:0.9.94" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-web:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: aopalliance:aopalliance:1.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.springframework:spring-aop:2.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: xpp3:xpp3:1.1.4c" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: javax.servlet:jstl:1.1.0" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: logkit:logkit:1.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: avalon-framework:avalon-framework:4.1.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sun.xml.txw2:txw2:20070624" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.winp:winp:1.14" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci:memory-monitor:1.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.dev.jna:jna:3.3.0-jenkins-2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.codehaus.woodstox:wstx-asl:3.2.7" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: stax:stax-api:1.0.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci:jmdns:3.4.0-jenkins-2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sun.akuma:akuma:1.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.libpam4j:libpam4j:1.4" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.libzfs:libzfs:0.5" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: com.sun.solaris:embedded_su4j:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: net.java.sezpoz:sezpoz:1.9" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci:jinterop-wmi:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.jinterop:jinterop-proxy:1.1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.jinterop:j-interop:2.0.6-kohsuke-1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke.jinterop:j-interopdeps:2.0.6-kohsuke-1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.samba.jcifs:jcifs:1.3.14-kohsuke-1" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jenkins-ci:windows-remote-command:1.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.jvnet.robust-http-client:robust-http-client:1.2" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: asm:asm-commons:2.2.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: asm:asm-tree:2.2.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: asm:asm:2.2.3" level="project" />
<orderEntry type="library" scope="PROVIDED" name="Maven: org.kohsuke:access-modifier-annotation:1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main:jenkins-test-harness:1.424" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main:jenkins-war:war-for-test:1.424" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.modules:instance-identity:1.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: bouncycastle:bcprov-jdk15:140" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.modules:ssh-cli-auth:1.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main:maven-plugin:1.424" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main.maven:maven-agent:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main.maven:maven-interceptor:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jvnet.hudson:maven2.1-interceptor:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main.maven:maven3-agent:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-embedder:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-settings:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.plexus:plexus-utils:2.0.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-core:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-model:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-settings-builder:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.plexus:plexus-interpolation:1.14" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.plexus:plexus-component-annotations:1.5.5" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.plexus:plexus-sec-dispatcher:1.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.plexus:plexus-cipher:1.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-repository-metadata:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-artifact:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-plugin-api:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.sisu:sisu-inject-plexus:2.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.plexus:plexus-classworlds:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.sisu:sisu-inject-bean:2.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-model-builder:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-aether-provider:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.aether:aether-api:1.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.aether:aether-spi:1.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.aether:aether-util:1.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.aether:aether-impl:1.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven:maven-compat:3.0.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-provider-api:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: commons-cli:commons-cli:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main.maven:maven3-interceptor:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.aether:aether-connector-wagon:1.11" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.sonatype.sisu:sisu-guice:3.0.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: javax.inject:javax.inject:1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-http-lightweight:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-http-shared:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-file:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-ftp:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: commons-net:commons-net:2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-ssh:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jcraft:jsch:0.1.38" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-ssh-common:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.codehaus.plexus:plexus-interactivity-api:1.0-alpha-6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-ssh-external:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.reporting:maven-reporting-api:3.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.doxia:doxia-sink-api:1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.lib:lib-jenkins-maven-artifact-manager:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.lib:lib-jenkins-maven-embedder:3.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.maven.wagon:wagon-webdav-jackrabbit:1.0-beta-7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.jackrabbit:jackrabbit-webdav:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apache.jackrabbit:jackrabbit-jcr-commons:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.slf4j:slf4j-api:1.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.slf4j:slf4j-nop:1.5.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.plugins:subversion:1.25" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.svnkit:svnkit:1.3.4-jenkins-4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mortbay.jetty:jetty:6.1.26" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mortbay.jetty:jetty-util:6.1.26" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mortbay.jetty:servlet-api:2.5-20081211" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jvnet.hudson:test-annotations:1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jvnet.mock-javamail:mock-javamail:1.7" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jvnet.hudson:embedded-rhino-debugger:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jvnet.hudson:netx:0.5-hudson-2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.easymock:easymock:2.4" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.jenkins-ci.main:ui-samples-plugin:1.424" level="project" />
</component>
</module>

53
pom.xml Normal file
View File

@ -0,0 +1,53 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.jenkins-ci.plugins</groupId>
<artifactId>plugin</artifactId>
<version>1.424</version>
<!-- which version of Jenkins is this plugin built against? -->
</parent>
<groupId>net.masterthought.jenkins</groupId>
<artifactId>cucumber-reports</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>hpi</packaging>
<!-- get every artifact through repo.jenkins-ci.org, which proxies all the artifacts that we need -->
<repositories>
<repository>
<id>repo.jenkins-ci.org</id>
<url>http://repo.jenkins-ci.org/public/</url>
</repository>
<repository>
<id>sonatype-snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>repo.jenkins-ci.org</id>
<url>http://repo.jenkins-ci.org/public/</url>
</pluginRepository>
</pluginRepositories>
<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>1.7.1</version>
</dependency>
<dependency>
<groupId>maven</groupId>
<artifactId>velocity</artifactId>
<version>1.5-20060721.044818</version>
</dependency>
<dependency>
<groupId>com.jamesmurty.utils</groupId>
<artifactId>java-xmlbuilder</artifactId>
<version>0.4</version>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,48 @@
package net.masterthought.jenkins;
import hudson.FilePath;
import hudson.model.AbstractItem;
import hudson.model.Action;
import hudson.model.DirectoryBrowserSupport;
import hudson.model.ProminentProjectAction;
import org.kohsuke.stapler.StaplerRequest;
import org.kohsuke.stapler.StaplerResponse;
import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
public abstract class CucumberReportBaseAction implements Action {
public String getUrlName(){
return "cucumber-html-reports";
}
public String getDisplayName(){
return "Cucumber Reports";
}
public String getIconFileName(){
return dir().exists() ? "graph.gif" : null;
}
public void doDynamic(StaplerRequest req, StaplerResponse rsp) throws IOException, ServletException {
DirectoryBrowserSupport dbs = new DirectoryBrowserSupport(this, new FilePath(this.dir()), this.getTitle(), "graph.gif", false);
dbs.setIndexFileName("feature-overview.html");
dbs.generateResponse(req, rsp, this);
}
protected abstract String getTitle();
protected abstract File dir();
}

View File

@ -0,0 +1,26 @@
package net.masterthought.jenkins;
import hudson.model.AbstractBuild;
import hudson.model.Run;
import java.io.File;
public class CucumberReportBuildAction extends CucumberReportBaseAction {
private final AbstractBuild<?, ?> build;
public CucumberReportBuildAction(AbstractBuild<?, ?> build) {
super();
this.build = build;
}
@Override
protected String getTitle() {
return this.build.getDisplayName() + " html3";
}
@Override
protected File dir() {
return new File(build.getRootDir(), "cucumber-html-reports");
}
}

View File

@ -0,0 +1,40 @@
//package net.masterthought.jenkins;
//
//import hudson.model.AbstractItem;
//import hudson.model.AbstractProject;
//import hudson.model.ProminentProjectAction;
//import hudson.model.Run;
//
//import java.io.File;
//
//public class CucumberReportProjectAction extends CucumberReportBaseAction implements ProminentProjectAction {
// private final AbstractItem project;
//
// public CucumberReportProjectAction(AbstractItem project) {
// super();
// this.project = project;
// }
//
// @Override
// protected File dir() {
// if (this.project instanceof AbstractProject) {
// AbstractProject abstractProject = (AbstractProject) this.project;
//
// Run run = abstractProject.getLastSuccessfulBuild();
// if (run != null) {
// File javadocDir = getBuildArchiveDir(run);
//
// if (javadocDir.exists()) {
// return javadocDir;
// }
// }
// }
//
// return getProjectArchiveDir(this.project);
// }
//
// @Override
// protected String getTitle() {
// return this.project.getDisplayName() + " html2";
// }
//}

View File

@ -0,0 +1,108 @@
package net.masterthought.jenkins;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import hudson.model.BuildListener;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.BuildStepMonitor;
import hudson.tasks.Publisher;
import hudson.tasks.Recorder;
import hudson.util.FormValidation;
import org.apache.commons.io.FileUtils;
import org.apache.tools.ant.DirectoryScanner;
import org.kohsuke.stapler.AncestorInPath;
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.QueryParameter;
import javax.servlet.ServletException;
import java.io.File;
import java.io.IOException;
public class CucumberReportPublisher extends Recorder {
private final String jsonReportDirectory;
@DataBoundConstructor
public CucumberReportPublisher(String jsonReportDirectory) {
this.jsonReportDirectory = jsonReportDirectory;
}
private String[] findJsonFiles(File targetDirectory) {
DirectoryScanner scanner = new DirectoryScanner();
scanner.setIncludes(new String[]{"**/*.json"});
scanner.setBasedir(targetDirectory);
scanner.scan();
return scanner.getIncludedFiles();
}
@Override
public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, BuildListener listener)
throws InterruptedException, IOException {
listener.getLogger().println("[CucumberReportPublisher] Compiling Cucumber Html Reports ...");
File workspaceJsonReportDirectory = new File(build.getWorkspace().toURI().getPath(), jsonReportDirectory);
File targetBuildDirectory = new File(build.getRootDir(), "cucumber-html-reports");
String buildNumber = Integer.toString(build.getNumber());
String buildProject = build.getProject().getName();
if (!targetBuildDirectory.exists()) {
targetBuildDirectory.mkdirs();
}
String[] files = findJsonFiles(workspaceJsonReportDirectory);
if (files.length != 0) {
listener.getLogger().println("[CucumberReportPublisher] copying json to reports directory: " + targetBuildDirectory);
for (String file : files) {
FileUtils.copyFile(new File(workspaceJsonReportDirectory.getPath() + "/" + file), new File(targetBuildDirectory, file));
}
String[] jsonReportFiles = findJsonFiles(targetBuildDirectory);
for (String file : jsonReportFiles) {
listener.getLogger().println("[CucumberReportPublisher] Generating HTML reports based on: " + file);
SingleResultParser singleResultParser = new SingleResultParser(new File(targetBuildDirectory, file).getAbsolutePath(), targetBuildDirectory, buildNumber, buildProject);
try {
singleResultParser.generateReports();
} catch (Exception e) {
e.printStackTrace();
}
}
} else {
listener.getLogger().println("[CucumberReportPublisher] here were no json results found in: " + workspaceJsonReportDirectory);
}
build.addAction(new CucumberReportBuildAction(build));
return true;
}
@Extension
public static class DescriptorImpl extends BuildStepDescriptor<Publisher> {
@Override
public String getDisplayName() {
return "Publish cucumber results as a report";
}
// Performs on-the-fly validation on the file mask wildcard.
public FormValidation doCheck(@AncestorInPath AbstractProject project,
@QueryParameter String value) throws IOException, ServletException {
FilePath ws = project.getSomeWorkspace();
return ws != null ? ws.validateRelativeDirectory(value) : FormValidation.ok();
}
@Override
public boolean isApplicable(Class<? extends AbstractProject> jobType) {
return true;
}
}
public BuildStepMonitor getRequiredMonitorService() {
return BuildStepMonitor.NONE;
}
}

View File

@ -0,0 +1,15 @@
package net.masterthought.jenkins;
import java.io.File;
import java.io.IOException;
public class Runner {
public static void main(String[] args) throws Exception {
File rd = new File("/Users/kings/visa/jenkins-plugin-development/jenkins-java-plugin/cucumber-reports/work/jobs/ssss/builds/10/cucumber-html-reports");
SingleResultParser singleResultParser = new SingleResultParser("/Users/kings/visa/jenkins-plugin-development/jenkins-java-plugin/cucumber-reports/work/jobs/ssss/builds/10/cucumber-html-reports/cucumber.json",rd,"10","ssss");
singleResultParser.generateReports();
}
}

View File

@ -0,0 +1,141 @@
package net.masterthought.jenkins;
import com.google.gson.Gson;
import net.masterthought.jenkins.json.Element;
import net.masterthought.jenkins.json.Feature;
import net.masterthought.jenkins.json.Step;
import net.masterthought.jenkins.json.Util;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.VelocityEngine;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.*;
public class SingleResultParser {
private List<Feature> featureList;
private File reportDirectory;
private String buildNumber;
private String buildProject;
private List<Util.Status> totalSteps;
public SingleResultParser(String jsonResultFile, File reportDirectory, String buildNumber, String buildProject) throws IOException {
this.featureList = parseJson(jsonResultFile);
this.totalSteps = getAllStepStatuses();
this.reportDirectory = reportDirectory;
this.buildNumber = buildNumber;
this.buildProject = buildProject;
}
public void generateReports() throws Exception {
generateFeatureReports();
generateFeatureOverview();
}
public void generateFeatureOverview() throws Exception {
VelocityEngine ve = new VelocityEngine();
ve.init(getProperties());
Template featureOverview = ve.getTemplate("templates/featureOverview.vm");
VelocityContext context = new VelocityContext();
context.put("build_project", buildProject);
context.put("build_number", buildNumber);
context.put("features", featureList);
context.put("total_features", getTotalFeatures());
context.put("total_scenarios", getTotalScenarios());
context.put("total_steps", getTotalSteps());
context.put("total_passes", getTotalPasses());
context.put("total_fails", getTotalFails());
context.put("total_skipped", getTotalSkipped());
context.put("chart_data", XmlChartBuilder.donutChart(getTotalPasses(), getTotalFails(), getTotalSkipped()));
context.put("time_stamp", timeStamp());
generateReport("feature-overview.html", featureOverview, context);
}
private int getTotalSteps() {
return totalSteps.size();
}
private int getTotalPasses() {
return Util.findStatusCount(totalSteps, Util.Status.PASSED);
}
private int getTotalFails() {
return Util.findStatusCount(totalSteps, Util.Status.FAILED);
}
private int getTotalSkipped() {
return Util.findStatusCount(totalSteps, Util.Status.SKIPPED);
}
private List<Util.Status> getAllStepStatuses() {
List<Util.Status> steps = new ArrayList<Util.Status>();
for (Feature feature : featureList) {
for (Element scenario : feature.getElements()) {
for (Step step : scenario.getSteps()) {
steps.add(step.getStatus());
}
}
}
return steps;
}
private int getTotalFeatures() {
return featureList.size();
}
private int getTotalScenarios() {
int scenarios = 0;
for (Feature feature : featureList) {
scenarios = scenarios + feature.getNumberOfScenarios();
}
return scenarios;
}
public void generateFeatureReports() throws Exception {
for (Feature feature : featureList) {
VelocityEngine ve = new VelocityEngine();
ve.init(getProperties());
Template featureResult = ve.getTemplate("templates/featureReport.vm");
VelocityContext context = new VelocityContext();
context.put("feature", feature);
context.put("report_status_colour", getReportStatusColour(feature));
context.put("build_project", buildProject);
context.put("build_number", buildNumber);
context.put("scenarios", feature.getElements());
context.put("time_stamp", timeStamp());
generateReport(feature.getFileName(), featureResult, context);
}
}
private void generateReport(String fileName, Template featureResult, VelocityContext context) throws Exception {
Writer writer = new FileWriter(new File(reportDirectory, fileName));
featureResult.merge(context, writer);
writer.flush();
writer.close();
}
private Properties getProperties() {
Properties props = new Properties();
props.setProperty("resource.loader", "class");
props.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
return props;
}
private String getReportStatusColour(Feature feature) {
return feature.getStatus() == Util.Status.PASSED ? "#C5D88A" : "#D88A8A";
}
private List<Feature> parseJson(String jsonResultFile) throws FileNotFoundException {
FileReader reader = new FileReader(jsonResultFile);
return Arrays.asList(new Gson().fromJson(reader, Feature[].class));
}
private String timeStamp() {
return new SimpleDateFormat("dd-MM-yyyy HH:mm:ss").format(new Date());
}
}

View File

@ -0,0 +1,12 @@
package net.masterthought.jenkins;
public class XmlChartBuilder {
public static String donutChart(int total_passed, int total_failed, int total_skipped){
// I was going to use XMLBuilder to generate the chart - but it's so long and boring and I already have the xml so .....
return "<chart><chart_data><row><null/><string>Passed</string><string>Failed</string><string>Skipped</string></row><row><string></string><number shadow='high' bevel='data' line_color='FFFFFF' line_thickness='3' line_alpha='75'>" + total_passed + "</number><number shadow='high' bevel='data' line_color='FFFFFF' line_thickness='3' line_alpha='75'>" + total_failed + "</number><number shadow='high' bevel='data' line_color='FFFFFF' line_thickness='3' line_alpha='75'>" + total_skipped + "</number></row></chart_data><chart_label shadow='low' color='ffffff' alpha='95' size='10' position='inside' as_percentage='true' /><chart_pref select='true' /><chart_rect x='90' y='85' width='300' height='175' /><chart_transition type='scale' delay='1' duration='.5' order='category' /><chart_type>donut</chart_type><draw><rect transition='dissolve' layer='background' x='60' y='100' width='360' height='150' fill_alpha='0' line_color='ffffff' line_alpha='25' line_thickness='40' corner_tl='40' corner_tr='40' corner_br='40' corner_bl='40' /><circle transition='dissolve' layer='background' x='240' y='150' radius='150' fill_color='ccddff' fill_alpha='100' line_thickness='0' bevel='bg' blur='blur1' /><rect transition='dissolve' layer='background' shadow='soft' x='80' y='10' width='320' height='35' fill_color='ddeeff' fill_alpha='90' corner_tl='10' corner_tr='10' corner_br='10' corner_bl='10' /></draw><filter><shadow id='low' distance='2' angle='45' color='0' alpha='40' blurX='5' blurY='5' /><shadow id='high' distance='5' angle='45' color='0' alpha='40' blurX='10' blurY='10' /><shadow id='soft' distance='2' angle='45' color='0' alpha='20' blurX='5' blurY='5' /><bevel id='data' angle='45' blurX='5' blurY='5' distance='3' highlightAlpha='15' shadowAlpha='25' type='inner' /><bevel id='bg' angle='45' blurX='50' blurY='50' distance='10' highlightAlpha='35' shadowColor='0000ff' shadowAlpha='25' type='full' /><blur id='blur1' blurX='75' blurY='75' quality='1' /></filter><context_menu full_screen='false' /><legend transition='dissolve' x='90' width='300' bevel='low' fill_alpha='0' line_alpha='0' bullet='circle' size='12' color='000000' alpha='100' /><series_color><color>88dd11</color><color>cc1134</color><color>88aaff</color></series_color><series_explode><number>25</number><number>0</number><number>0</number></series_explode><series transfer='true' /></chart>";
}
}

View File

@ -0,0 +1,5 @@
package net.masterthought.jenkins.json;
public interface Closure<R, T> {
public Util.Status call(T t);
}

View File

@ -0,0 +1,67 @@
package net.masterthought.jenkins.json;
import org.apache.commons.lang.StringUtils;
import java.util.ArrayList;
import java.util.List;
public class Element {
private String name;
private String description;
private String keyword;
private Step[] steps;
private Tag[] tags;
public Element(String name, String description, String keyword) {
this.name = name;
this.description = description;
this.keyword = keyword;
}
public Step[] getSteps() {
return steps;
}
public Util.Status getStatus() {
Closure<String, Step> scenarioStatus = new Closure<String, Step>() {
public Util.Status call(Step step) {
return step.getStatus();
}
};
List<Util.Status> results = Util.collectSteps(steps, scenarioStatus);
return results.contains(Util.Status.FAILED) ? Util.Status.FAILED : Util.Status.PASSED;
}
public String getName() {
List<String> contentString = new ArrayList<String>();
if (Util.itemExists(keyword)) {
contentString.add("<span class=\"scenario-keyword\">" + keyword + ": </span>");
}
if (Util.itemExists(name)) {
contentString.add("<span class=\"scenario-name\">" + name + "</span>");
}
return Util.itemExists(contentString) ? Util.result(getStatus()) + StringUtils.join(contentString.toArray(), " ") + Util.closeDiv() : "";
}
public String getTags() {
String result = "<div class=\"feature-tags\"></div>";
if (Util.itemExists(tags)) {
StringClosure<String, Tag> scenarioTags = new StringClosure<String, Tag>() {
public String call(Tag tag) {
return tag.getName();
}
};
List<Util.Status> results = Util.collectTags(tags, scenarioTags);
String tagList = StringUtils.join(results.toArray(), ",");
result = "<div class=\"feature-tags\">" + tagList + "</div>";
}
return result;
}
}

View File

@ -0,0 +1,96 @@
package net.masterthought.jenkins.json;
import java.util.ArrayList;
import java.util.List;
public class Feature {
private String name;
private String uri;
private String description;
private String keyword;
private Element[] elements;
public Feature(String name, String uri, String description, String keyword) {
this.name = name;
this.uri = uri;
this.description = description;
this.keyword = keyword;
}
public Element[] getElements() {
return elements;
}
public Util.Status getStatus() {
Closure<String, Element> scenarioStatus = new Closure<String, Element>() {
public Util.Status call(Element step) {
return step.getStatus();
}
};
List<Util.Status> results = Util.collectScenarios(elements, scenarioStatus);
return results.contains(Util.Status.FAILED) ? Util.Status.FAILED : Util.Status.PASSED;
}
private List<Util.Status> lookUpSteps() {
List<Util.Status> stepStatuses = new ArrayList<Util.Status>();
for(Element element : elements){
for(Step step : element.getSteps()){
stepStatuses.add(step.getStatus());
}
}
return stepStatuses;
}
public String getName() {
return Util.itemExists(name) ? Util.result(getStatus()) + "<div class=\"feature-line\"><span class=\"feature-keyword\">Feature:</span> " + name + "</div>" + Util.closeDiv() : "";
}
public String getRawName() {
return Util.itemExists(name) ? name : "";
}
public String getDescription() {
String result = "";
if (Util.itemExists(description)) {
String content = description.replaceFirst("As an", "<span class=\"feature-role\">As an</span>");
content = content.replaceFirst("I want to", "<span class=\"feature-action\">I want to</span>");
content = content.replaceFirst("So that", "<span class=\"feature-value\">So that</span>");
content = content.replaceAll("\n", "<br/>");
result = "<div class=\"feature-description\">" + content + "</div>";
}
return result;
}
public String getFileName() {
return uri.replaceAll("/", "-") + ".html";
}
public int getNumberOfScenarios() {
return elements.length;
}
public int getNumberOfSteps() {
return lookUpSteps().size();
}
public int getNumberOfPasses() {
return Util.findStatusCount(lookUpSteps(), Util.Status.PASSED);
}
public int getNumberOfFailures() {
return Util.findStatusCount(lookUpSteps(), Util.Status.FAILED);
}
public int getNumberOfSkipped() {
return Util.findStatusCount(lookUpSteps(), Util.Status.SKIPPED);
}
public String getRawStatus() {
return getStatus().toString().toLowerCase();
}
}

View File

@ -0,0 +1,23 @@
package net.masterthought.jenkins.json;
public class Result {
private String status;
private String error_message;
private int duration;
public Result(String status, String error_message, int duration){
this.status = status;
this.error_message = error_message;
this.duration = duration;
}
public String getStatus(){
return status;
}
public String getErrorMessage(){
return error_message;
}
}

View File

@ -0,0 +1,29 @@
package net.masterthought.jenkins.json;
public class Step {
private String name;
private String keyword;
private Result result;
public Step(String name, String keyword) {
this.name = name;
this.keyword = keyword;
}
public Util.Status getStatus() {
return Util.resultMap.get(result.getStatus());
}
public String getName(){
String content = "";
if(getStatus() == Util.Status.FAILED){
content = Util.result(getStatus()) + "<span class=\"step-keyword\">" + keyword + " </span><span class=\"step-name\">" + name + "</span>" + "<div class=\"step-error-message\"><pre>" + result.getErrorMessage() + "</pre></div>" + Util.closeDiv();
} else {
content = Util.result(getStatus()) + "<span class=\"step-keyword\">" + keyword + " </span><span class=\"step-name\">" + name + "</span>" + Util.closeDiv();
}
return content;
}
}

View File

@ -0,0 +1,6 @@
package net.masterthought.jenkins.json;
public interface StringClosure<R, T> {
public R call(T t);
}

View File

@ -0,0 +1,14 @@
package net.masterthought.jenkins.json;
public class Tag {
private String name;
public Tag(String name){
this.name = name;
}
public String getName(){
return name;
}
}

View File

@ -0,0 +1,93 @@
package net.masterthought.jenkins.json;
import net.masterthought.jenkins.json.Closure;
import net.masterthought.jenkins.json.Element;
import net.masterthought.jenkins.json.Step;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Util {
public static boolean itemExists(List<String> listItem) {
return listItem.size() != 0;
}
public static boolean itemExists(Tag[] tags) {
boolean result = false;
if (tags != null) {
result = tags.length != 0;
}
return result;
}
public static String passed(boolean value) {
return value ? "<div class=\"passed\">" : "</div>";
}
public static String closeDiv() {
return "</div>";
}
public static Map<String, Status> resultMap = new HashMap<String, Status>() {{
put("passed", Util.Status.PASSED);
put("failed", Util.Status.FAILED);
put("skipped", Util.Status.SKIPPED);
}};
public static String result(Status status) {
String result = "";
if (status == Status.PASSED) {
result = "<div class=\"passed\">";
} else if (status == Status.FAILED) {
result = "<div class=\"failed\">";
} else if (status == Status.SKIPPED) {
result = "<div class=\"skipped\">";
}
return result;
}
public static enum Status {
PASSED, FAILED, SKIPPED
}
public static <T, R> List<R> collectScenarios(Element[] list, Closure<String, Element> clo) {
List<R> res = new ArrayList<R>();
for (final Element t : list) {
res.add((R) clo.call(t));
}
return res;
}
public static <T, R> List<R> collectSteps(Step[] list, Closure<String, Step> clo) {
List<R> res = new ArrayList<R>();
for (final Step t : list) {
res.add((R) clo.call(t));
}
return res;
}
public static <T, R> List<R> collectTags(Tag[] list, StringClosure<String, Tag> clo) {
List<R> res = new ArrayList<R>();
for (final Tag t : list) {
res.add((R) clo.call(t));
}
return res;
}
public static boolean itemExists(String item) {
return !(item.isEmpty() || item == null);
}
public static int findStatusCount(List<Util.Status> statuses, Status statusToFind) {
int occurrence = 0;
for(Util.Status status : statuses){
if(status == statusToFind){
occurrence++;
}
}
return occurrence;
}
}

View File

@ -0,0 +1,6 @@
<!--
This view is used to render the installed plugins page.
-->
<div>
This plugin is a sample to explain how to write a Jenkins plugin.
</div>

View File

@ -0,0 +1,16 @@
<j:jelly xmlns:j="jelly:core" xmlns:st="jelly:stapler" xmlns:d="jelly:define" xmlns:l="/lib/layout" xmlns:t="/lib/hudson" xmlns:f="/lib/form">
<!--
This jelly script is used for per-project configuration.
See global.jelly for a general discussion about jelly script.
-->
<!--
Creates a text field that shows the value of the "name" property.
When submitted, it will be passed to the corresponding constructor parameter.
-->
<f:entry title="Json Reports Path" field="jsonReportDirectory" description="The path relative to the workspace of the json reports generated by cucumber-jvm e.g. target/cucumber">
<f:textbox />
</f:entry>
</j:jelly>

View File

@ -0,0 +1,190 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<script language="javascript">AC_FL_RunContent = 0;</script>
<script language="javascript"> DetectFlashVer = 0; </script>
<script src="/plugin/cucumber-reports/charts/AC_RunActiveContent.js" language="javascript"></script>
<script language="JavaScript" type="text/javascript">
<!--
var requiredMajorVersion = 10;
var requiredMinorVersion = 0;
var requiredRevision = 45;
-->
</script>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Cucumber-JVM Html Reports - Feature Overview</title>
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/skin/style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/960.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/reset.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/text.css" type="text/css" media="screen" />
<link rel="shortcut icon" href="/plugin/cucumber-reports/blue/favicon.ico" />
<style>
.feature-keyword{font-weight:bold;}
.feature-description{padding-left:15px;font-style:italic;background-color:beige;}
.feature-role{font-weight:bold;}
.feature-action{font-weight:bold;}
.feature-value{font-weight:bold;}
.feature-tags{padding-top:10px;padding-left:15px;color:darkblue;}
.scenario-keyword{font-weight:bold;padding-left:15px;}
.scenario-scenario_name{padding-left:15px;}
.step-keyword{font-weight:bold;padding-left:50px;}
.step-error-message{background-color:#FFEEEE;padding-left:50px;border: 1px solid #D88A8A;}
.passed{background-color:#C5D88A;}
.failed{background-color:#D88A8A;}
.skipped{background-color:#2DEAEC;}
table.stats-table {
color:black;
border-width: 1px;
border-spacing: 2px;
border-style: outset;
border-color: gray;
border-collapse: collapse;
background-color: white;
}
table.stats-table th {
color:black;
border-width: 1px;
padding: 5px;
border-style: inset;
border-color: gray;
background-color: #66CCEE;
-moz-border-radius: ;
}
table.stats-table td {
color:black;
text-align: center;
border-width: 1px;
padding: 5px;
border-style: inset;
border-color: gray;
background-color: white;
-moz-border-radius: ;
}
</style>
</head>
<body id="top">
<div id="fullwidth_header">
<div class="container_12">
<h1 class="grid_4 logo"><a href="feature-overview.html" class='ie6fix'>Cucumber</a></h1>
<div class="grid_6" id="nav">
<ul>
<li><a href="/job/$build_project/$build_number">Back To Jenkins</a></li>
</ul>
</div>
</div>
</div>
<div id="fullwidth_gradient">
<div class="container_12">
<div class="grid_9 heading">
<h2>Feature Overview for Build: $build_number</h2>
<span class="subhead">The following graph shows number of steps passing, failing and skipped for this build:</span>
</div>
</div>
</div>
<div class="container_12">
<div class="grid_9">
<div style="text-align:center;"><script language="JavaScript" type="text/javascript">
<!--
if (AC_FL_RunContent == 0 || DetectFlashVer == 0) {
alert("This page requires AC_RunActiveContent.js.");
} else {
var hasRightVersion = DetectFlashVer(requiredMajorVersion, requiredMinorVersion, requiredRevision);
if(hasRightVersion) {
AC_FL_RunContent(
'codebase', 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=10,0,45,2',
'width', '480',
'height', '300',
'scale', 'noscale',
'salign', 'TL',
'bgcolor', '#bbccff',
'wmode', 'opaque',
'movie', '/plugin/cucumber-reports/charts/charts',
'src', '/plugin/cucumber-reports/charts/charts',
'FlashVars', "library_path=/plugin/cucumber-reports/charts/charts_library&xml_data=$chart_data",
'id', 'my_chart',
'name', 'my_chart',
'menu', 'true',
'allowFullScreen', 'true',
'allowScriptAccess','sameDomain',
'quality', 'high',
'align', 'middle',
'pluginspage', 'http://www.macromedia.com/go/getflashplayer',
'play', 'true',
'devicefont', 'false'
);
} else {
var alternateContent = 'This content requires the Adobe Flash Player. '
+ '<u><a href=http://www.macromedia.com/go/getflash/>Get Flash</a></u>.';
document.write(alternateContent);
}
}
// -->
</script>
<noscript>
<P>This content requires JavaScript.</P>
</noscript>
</div>
<br/>
<div class="grid_12 hr"></div>
<div>
<br/>
<h2>Feature Statistics</h2>
<table class="stats-table">
<tr>
<th>Feature</th>
<th>Scenarios</th>
<th>Steps</th>
<th>Passed</th>
<th>Failed</th>
<th>Skipped</th>
<th>Status</th>
</tr>
#foreach($feature in $features)
#if($feature.getStatus().toString() == "PASSED")
#set($bgcolour = "#C5D88A")
#else
#set($bgcolour = "#D88A8A")
#end
<tr>
<td><a href="$feature.getFileName()">$feature.getRawName()</a></td>
<td>$feature.getNumberOfScenarios()</td>
<td>$feature.getNumberOfSteps()</td>
<td>$feature.getNumberOfPasses()</td>
<td>$feature.getNumberOfFailures()</td>
<td>$feature.getNumberOfSkipped()</td>
<td style="background-color: $bgcolour;">$feature.getRawStatus()</td>
</tr>
#end
<tr>
<td style="background-color:lightgray;font-weight:bold;">$total_features</td>
<td style="background-color:lightgray;font-weight:bold;">$total_scenarios</td>
<td style="background-color:lightgray;font-weight:bold;">$total_steps</td>
<td style="background-color:lightgray;font-weight:bold;">$total_passes</td>
<td style="background-color:lightgray;font-weight:bold;">$total_fails</td>
<td style="background-color:lightgray;font-weight:bold;">$total_skipped</td>
<td style="background-color:lightgray;font-weight:bold;">Totals</td>
</tr></table>
</div>
</div>
</div>
<div class="container_12">
<div class="grid_12 hr"></div>
<div class="grid_12 footer">
<p style="text-align:center;">Cucumber-JVM Jenkins Report Plugin - $time_stamp</p>
</div>
</div>
<div class="clear"></div>
</body>
</html>

View File

@ -0,0 +1,135 @@
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Cucumber-JVM Html Reports - Feature: $feature.getRawName() </title>
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/skin/style.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/960.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/reset.css" type="text/css" media="screen" />
<link rel="stylesheet" href="/plugin/cucumber-reports/blue/css/text.css" type="text/css" media="screen" />
<link rel="shortcut icon" href="/plugin/cucumber-reports/blue/favicon.ico" />
<style>
.feature-keyword{font-weight:bold;}
.feature-description{padding-left:15px;font-style:italic;background-color:beige;}
.feature-role{font-weight:bold;}
.feature-action{font-weight:bold;}
.feature-value{font-weight:bold;}
.feature-tags{padding-top:10px;padding-left:15px;color:darkblue;}
.scenario-keyword{font-weight:bold;padding-left:15px;}
.scenario-scenario_name{padding-left:15px;}
.step-keyword{font-weight:bold;padding-left:50px;}
.step-error-message{background-color:#FFEEEE;padding-left:50px;border: 1px solid #D88A8A;}
.passed{background-color:#C5D88A;}
.failed{background-color:#D88A8A;}
.skipped{background-color:#2DEAEC;}
table.stats-table {
color:black;
border-width: 1px;
border-spacing: 2px;
border-style: outset;
border-color: gray;
border-collapse: collapse;
background-color: white;
}
table.stats-table th {
color:black;
border-width: 1px;
padding: 5px;
border-style: inset;
border-color: gray;
background-color: #66CCEE;
-moz-border-radius: ;
}
table.stats-table td {
color:black;
text-align: center;
border-width: 1px;
padding: 5px;
border-style: inset;
border-color: gray;
background-color: white;
-moz-border-radius: ;
}
</style>
</head>
<body id="top">
<div id="fullwidth_header">
<div class="container_12">
<h1 class="grid_4 logo"><a href="feature-overview.html" class='ie6fix'>Cucumber</a></h1>
<div class="grid_6" id="nav">
<ul>
<li><a href="/job/$build_project/$build_number">Back To Jenkins</a></li>
<li><a href="feature-overview.html">Back To Overview</a></li>
</ul>
</div>
</div>
</div>
<div id="fullwidth_gradient">
<div class="container_12">
<div class="grid_9 heading">
<h2>Feature Result for Build: $build_number</h2>
<span class="subhead">Below are the results for this feature:</span>
</div>
</div>
</div>
<div class="container_12">
<div class="grid_12">
<div style="color:black;">
$feature.getName()
$feature.getDescription()
#foreach($scenario in $scenarios)
$scenario.getTags()
$scenario.getName()
#foreach($step in $scenario.getSteps())
$step.getName()
#end
#end
<div>
<br/>
<h2>Feature Statistics</h2>
<table class="stats-table">
<tr>
<th>Feature</th>
<th>Scenarios</th>
<th>Steps</th>
<th>Passed</th>
<th>Failed</th>
<th>Skipped</th>
<th>Status</th>
</tr>
<tr>
<td><a href="$feature.getFileName()">$feature.getRawName()</a></td>
<td>$feature.getNumberOfScenarios()</td>
<td>$feature.getNumberOfSteps()</td>
<td>$feature.getNumberOfPasses()</td>
<td>$feature.getNumberOfFailures()</td>
<td>$feature.getNumberOfSkipped()</td>
<td style="background-color: $report_status_colour;">$feature.getRawStatus()</td></tr>
</table>
</div>
</div>
</div>
<div class="container_12">
<div class="grid_12 hr"></div>
<div class="grid_12 footer">
<p style="text-align:center;">Cucumber-JVM Jenkins Report Plugin - $time_stamp</p>
</div>
</div>
<div class="clear"></div>
</body>

View File

@ -0,0 +1,628 @@
/*
960 Grid System ~ Core CSS.
Learn more ~ http://960.gs/
Licensed under GPL and MIT.
*/
/* `Containers
----------------------------------------------------------------------------------------------------*/
.container_12,
.container_16 {
margin-left: auto;
margin-right: auto;
width: 960px;
}
/* `Grid >> Global
----------------------------------------------------------------------------------------------------*/
.grid_1,
.grid_2,
.grid_3,
.grid_4,
.grid_5,
.grid_6,
.grid_7,
.grid_8,
.grid_9,
.grid_10,
.grid_11,
.grid_12,
.grid_13,
.grid_14,
.grid_15,
.grid_16 {
display: inline;
float: left;
margin-left: 10px;
margin-right: 10px;
}
.push_1, .pull_1,
.push_2, .pull_2,
.push_3, .pull_3,
.push_4, .pull_4,
.push_5, .pull_5,
.push_6, .pull_6,
.push_7, .pull_7,
.push_8, .pull_8,
.push_9, .pull_9,
.push_10, .pull_10,
.push_11, .pull_11,
.push_12, .pull_12,
.push_13, .pull_13,
.push_14, .pull_14,
.push_15, .pull_15 {
position: relative;
}
.container_12 .grid_3,
.container_16 .grid_4 {
width: 220px;
}
.container_12 .grid_6,
.container_16 .grid_8 {
width: 460px;
}
.container_12 .grid_9,
.container_16 .grid_12 {
width: 700px;
}
.container_12 .grid_12,
.container_16 .grid_16 {
width: 940px;
}
/* `Grid >> Children (Alpha ~ First, Omega ~ Last)
----------------------------------------------------------------------------------------------------*/
.alpha {
margin-left: 0;
}
.omega {
margin-right: 0;
}
/* `Grid >> 12 Columns
----------------------------------------------------------------------------------------------------*/
.container_12 .grid_1 {
width: 60px;
}
.container_12 .grid_2 {
width: 140px;
}
.container_12 .grid_4 {
width: 300px;
}
.container_12 .grid_5 {
width: 380px;
}
.container_12 .grid_7 {
width: 540px;
}
.container_12 .grid_8 {
width: 620px;
}
.container_12 .grid_10 {
width: 780px;
}
.container_12 .grid_11 {
width: 860px;
}
/* `Grid >> 16 Columns
----------------------------------------------------------------------------------------------------*/
.container_16 .grid_1 {
width: 40px;
}
.container_16 .grid_2 {
width: 100px;
}
.container_16 .grid_3 {
width: 160px;
}
.container_16 .grid_5 {
width: 280px;
}
.container_16 .grid_6 {
width: 340px;
}
.container_16 .grid_7 {
width: 400px;
}
.container_16 .grid_9 {
width: 520px;
}
.container_16 .grid_10 {
width: 580px;
}
.container_16 .grid_11 {
width: 640px;
}
.container_16 .grid_13 {
width: 760px;
}
.container_16 .grid_14 {
width: 820px;
}
.container_16 .grid_15 {
width: 880px;
}
/* `Prefix Extra Space >> Global
----------------------------------------------------------------------------------------------------*/
.container_12 .prefix_3,
.container_16 .prefix_4 {
padding-left: 240px;
}
.container_12 .prefix_6,
.container_16 .prefix_8 {
padding-left: 480px;
}
.container_12 .prefix_9,
.container_16 .prefix_12 {
padding-left: 720px;
}
/* `Prefix Extra Space >> 12 Columns
----------------------------------------------------------------------------------------------------*/
.container_12 .prefix_1 {
padding-left: 80px;
}
.container_12 .prefix_2 {
padding-left: 160px;
}
.container_12 .prefix_4 {
padding-left: 320px;
}
.container_12 .prefix_5 {
padding-left: 400px;
}
.container_12 .prefix_7 {
padding-left: 560px;
}
.container_12 .prefix_8 {
padding-left: 640px;
}
.container_12 .prefix_10 {
padding-left: 800px;
}
.container_12 .prefix_11 {
padding-left: 880px;
}
/* `Prefix Extra Space >> 16 Columns
----------------------------------------------------------------------------------------------------*/
.container_16 .prefix_1 {
padding-left: 60px;
}
.container_16 .prefix_2 {
padding-left: 120px;
}
.container_16 .prefix_3 {
padding-left: 180px;
}
.container_16 .prefix_5 {
padding-left: 300px;
}
.container_16 .prefix_6 {
padding-left: 360px;
}
.container_16 .prefix_7 {
padding-left: 420px;
}
.container_16 .prefix_9 {
padding-left: 540px;
}
.container_16 .prefix_10 {
padding-left: 600px;
}
.container_16 .prefix_11 {
padding-left: 660px;
}
.container_16 .prefix_13 {
padding-left: 780px;
}
.container_16 .prefix_14 {
padding-left: 840px;
}
.container_16 .prefix_15 {
padding-left: 900px;
}
/* `Suffix Extra Space >> Global
----------------------------------------------------------------------------------------------------*/
.container_12 .suffix_3,
.container_16 .suffix_4 {
padding-right: 240px;
}
.container_12 .suffix_6,
.container_16 .suffix_8 {
padding-right: 480px;
}
.container_12 .suffix_9,
.container_16 .suffix_12 {
padding-right: 720px;
}
/* `Suffix Extra Space >> 12 Columns
----------------------------------------------------------------------------------------------------*/
.container_12 .suffix_1 {
padding-right: 80px;
}
.container_12 .suffix_2 {
padding-right: 160px;
}
.container_12 .suffix_4 {
padding-right: 320px;
}
.container_12 .suffix_5 {
padding-right: 400px;
}
.container_12 .suffix_7 {
padding-right: 560px;
}
.container_12 .suffix_8 {
padding-right: 640px;
}
.container_12 .suffix_10 {
padding-right: 800px;
}
.container_12 .suffix_11 {
padding-right: 880px;
}
/* `Suffix Extra Space >> 16 Columns
----------------------------------------------------------------------------------------------------*/
.container_16 .suffix_1 {
padding-right: 60px;
}
.container_16 .suffix_2 {
padding-right: 120px;
}
.container_16 .suffix_3 {
padding-right: 180px;
}
.container_16 .suffix_5 {
padding-right: 300px;
}
.container_16 .suffix_6 {
padding-right: 360px;
}
.container_16 .suffix_7 {
padding-right: 420px;
}
.container_16 .suffix_9 {
padding-right: 540px;
}
.container_16 .suffix_10 {
padding-right: 600px;
}
.container_16 .suffix_11 {
padding-right: 660px;
}
.container_16 .suffix_13 {
padding-right: 780px;
}
.container_16 .suffix_14 {
padding-right: 840px;
}
.container_16 .suffix_15 {
padding-right: 900px;
}
/* `Push Space >> Global
----------------------------------------------------------------------------------------------------*/
.container_12 .push_3,
.container_16 .push_4 {
left: 240px;
}
.container_12 .push_6,
.container_16 .push_8 {
left: 480px;
}
.container_12 .push_9,
.container_16 .push_12 {
left: 720px;
}
/* `Push Space >> 12 Columns
----------------------------------------------------------------------------------------------------*/
.container_12 .push_1 {
left: 80px;
}
.container_12 .push_2 {
left: 160px;
}
.container_12 .push_4 {
left: 320px;
}
.container_12 .push_5 {
left: 400px;
}
.container_12 .push_7 {
left: 560px;
}
.container_12 .push_8 {
left: 640px;
}
.container_12 .push_10 {
left: 800px;
}
.container_12 .push_11 {
left: 880px;
}
/* `Push Space >> 16 Columns
----------------------------------------------------------------------------------------------------*/
.container_16 .push_1 {
left: 60px;
}
.container_16 .push_2 {
left: 120px;
}
.container_16 .push_3 {
left: 180px;
}
.container_16 .push_5 {
left: 300px;
}
.container_16 .push_6 {
left: 360px;
}
.container_16 .push_7 {
left: 420px;
}
.container_16 .push_9 {
left: 540px;
}
.container_16 .push_10 {
left: 600px;
}
.container_16 .push_11 {
left: 660px;
}
.container_16 .push_13 {
left: 780px;
}
.container_16 .push_14 {
left: 840px;
}
.container_16 .push_15 {
left: 900px;
}
/* `Pull Space >> Global
----------------------------------------------------------------------------------------------------*/
.container_12 .pull_3,
.container_16 .pull_4 {
left: -240px;
}
.container_12 .pull_6,
.container_16 .pull_8 {
left: -480px;
}
.container_12 .pull_9,
.container_16 .pull_12 {
left: -720px;
}
/* `Pull Space >> 12 Columns
----------------------------------------------------------------------------------------------------*/
.container_12 .pull_1 {
left: -80px;
}
.container_12 .pull_2 {
left: -160px;
}
.container_12 .pull_4 {
left: -320px;
}
.container_12 .pull_5 {
left: -400px;
}
.container_12 .pull_7 {
left: -560px;
}
.container_12 .pull_8 {
left: -640px;
}
.container_12 .pull_10 {
left: -800px;
}
.container_12 .pull_11 {
left: -880px;
}
/* `Pull Space >> 16 Columns
----------------------------------------------------------------------------------------------------*/
.container_16 .pull_1 {
left: -60px;
}
.container_16 .pull_2 {
left: -120px;
}
.container_16 .pull_3 {
left: -180px;
}
.container_16 .pull_5 {
left: -300px;
}
.container_16 .pull_6 {
left: -360px;
}
.container_16 .pull_7 {
left: -420px;
}
.container_16 .pull_9 {
left: -540px;
}
.container_16 .pull_10 {
left: -600px;
}
.container_16 .pull_11 {
left: -660px;
}
.container_16 .pull_13 {
left: -780px;
}
.container_16 .pull_14 {
left: -840px;
}
.container_16 .pull_15 {
left: -900px;
}
/* `Clear Floated Elements
----------------------------------------------------------------------------------------------------*/
/* http://sonspring.com/journal/clearing-floats */
.clear {
clear: both;
display: block;
overflow: hidden;
visibility: hidden;
width: 0;
height: 0;
}
/* http://perishablepress.com/press/2009/12/06/new-clearfix-hack */
.clearfix:after {
clear: both;
content: ' ';
display: block;
font-size: 0;
line-height: 0;
visibility: hidden;
width: 0;
height: 0;
}
/*
The following zoom:1 rule is specifically for IE6 + IE7.
Move to separate stylesheet if invalid CSS is a problem.
*/
* html .clearfix,
*:first-child+html .clearfix {
zoom: 1;
}

View File

@ -0,0 +1,218 @@
.heading {
margin-top: 100px;
}
.slider {
margin-top: 100px;
}
.teaser {
margin-top: 180px;
}
.heading h1 {
margin-bottom: 20px;
}
.big_button {
min-height: 100px;
}
h1 {
font-size: 62px;
letter-spacing: -0.05em;
line-height: 70px;
color: #151515;
}
/************************************************************************
-) COIN SLIDER
*************************************************************************/
#coin_holder{
float:left;
width:925px;
height:280px;
background:#FFFFFF;
position:relative;
z-index:2;
margin-top:90px;
margin-bottom: 20px;
padding:7px;
}
.slide_bg {
background: transparent url(../images/bg_image_slider.png) bottom center no-repeat;
margin-bottom: 120px;
}
.cs-buttons {
font-size: 0px;
padding: 10px;
float: left;
margin-top: 7px;
margin-bottom: 20px;
}
/************************************************************************
-) BUTTONS
*************************************************************************/
a.btn-light {
margin-top: -23px;
}
a.btn-light-preview {
margin-top: 0px;
}
.next_button_first, .next_button_first a {
display:block;
height:50px;
width:50px;
position:relative;
left:50%;
top:-43px;
border: none;
padding: 0;
margin:0;
}
.next_button_first a, .next_button_first a:hover {
top:0;
left:0;
text-indent:-9999px;
outline:none;
border: none;
}
.next_button, .next_button a {
display:block;
height:50px;
width:50px;
position:relative;
left:50%;
top:-43px;
border: none;
padding: 0;
margin:0;
}
.next_button a, .next_button a:hover {
top:0;
left:0;
text-indent:-9999px;
outline:none;
border: none;
}
/************************************************************************
-) CONTACT
*************************************************************************/
#contact {
margin-bottom: 50px;
margin-top: -20px;
margin-left: 8px;
}
#message {
width: 480px;
margin: 10px 0 0 26px;
padding: 0;
}
.error_message {
display: block;
height: 22px;
line-height: 22px;
margin: 40px 0;
background: #FBE3E4 url('../images/assets/error.gif') no-repeat 10px center;
padding: 3px 10px 3px 35px;
color:#8a1f11;
border: 1px solid #FBC2C4;
-moz-border-radius: 3px;
-webkit-border-radius:3px;
border-radius:3px;
}
.social_bookmarks_footer {
float: left;
height: 32px;
list-style-type: none;
z-index: 6;
}
.social_bookmarks_footer li {
float:left;
margin:0;
width:32px;
padding:0 7px 0 0;
}
.social_bookmarks_footer li a {
height:32px;
width:32px;
display: block;
float:left;
text-indent: -9999px;
border:none;
padding:0;
outline: none;
}
.notice {
margin-top: -20px;
height: 30px;
line-height: 30px;
margin-left: 20px;
padding-left: 20px;
border-left: 1px solid #777777;
}
/************************************************************************
-) MISC
*************************************************************************/
.margin_footer_break {
margin: 15px 0 5px 0;
}
.margin_top {
margin-top: 10px;
}
.margin_bottom {
margin-bottom: 10px;
}
.margin_break {
margin-top: 80px;
}
.padding_item_first {
padding-top: 10px;
margin-bottom: 50px;
}
.padding_item {
padding-top: 150px;
margin-bottom: 80px;
}
.padding_service {
padding-top: 70px;
margin-bottom: 80px;
}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,53 @@
/* http://meyerweb.com/eric/tools/css/reset/ */
/* v1.0 | 20080212 */
html, body, div, span, object, iframe,
h1, h2, h3, h4, h5, h6, p, blockquote, pre,
a, abbr, acronym, address, big, cite, code,
del, dfn, em, font, img, ins, kbd, q, s, samp,
small, strike, strong, sub, sup, tt, var,
b, i, center,
dl, dt, dd, ol, ul, li,
fieldset, form, label, legend,
table, caption, tbody, tfoot, thead, tr, th, td {
margin: 0;
padding: 0;
border: 0;
outline: 0;
font-size: 100%;
vertical-align: baseline;
background: transparent;
}
body {
line-height: 1;
}
ol, ul {
list-style: none;
}
blockquote, q {
quotes: none;
}
blockquote:before, blockquote:after,
q:before, q:after {
content: '';
content: none;
}
/* remember to define focus styles! */
:focus {
outline: 0;
}
/* remember to highlight inserts somehow! */
ins {
text-decoration: none;
}
del {
text-decoration: line-through;
}
/* tables still need 'cellspacing="0"' in the markup */
table {
border-collapse: collapse;
border-spacing: 0;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@ -0,0 +1,152 @@
a {
color: #0097da;
}
a:hover {
color: #00587f;
}
.category {
background: transparent url(images/icon_tag.png) 0px 2px no-repeat;
}
.category a:hover {
color: #151515;
}
/************************************************************************
-) BUTTONS
*************************************************************************/
a.btn-light {
background: transparent url(images/btn-light-right.jpg) no-repeat scroll top right;
display: block;
float: right;
height: 28px;
margin-right: 6px;
margin-top: -5px;
padding-right: 18px;
text-decoration: none;
color: #fff;
font-family: Arial, Helvetica, sans-serif;
font-size:11px;
font-weight:normal;
}
a.btn-light span {
background: transparent url(images/btn-light-left.jpg) no-repeat;
display: block;
line-height: 28px;
padding: 0px 0 5px 18px;
text-align:center;
}
a.btn-light:hover {
background: transparent url(images/btn-light-righth.jpg) no-repeat scroll top right;
}
a.btn-light:hover span {
background: transparent url(images/btn-light-lefth.jpg) no-repeat;
color:#fff !important;
text-align:center;
}
a.btn-light-preview {
background: transparent url(images/btn-light-right.jpg) no-repeat scroll top right;
display: block;
float: right;
height: 28px;
margin-right: 6px;
margin-top: -5px;
padding-right: 18px;
text-decoration: none;
color: #fff;
font-family: Arial, Helvetica, sans-serif;
font-size:11px;
font-weight:normal;
}
a.btn-light-preview span {
background: transparent url(images/btn-light-left.jpg) no-repeat;
display: block;
line-height: 28px;
padding: 0px 0 5px 18px;
text-align:center;
}
a.btn-light-preview:hover {
background: transparent url(images/btn-light-righth.jpg) no-repeat scroll top right;
}
a.btn-light-preview:hover span {
background: transparent url(images/btn-light-lefth.jpg) no-repeat;
color:#fff !important;
text-align:center;
}
a.btn-medium {
background: transparent url(images/btn-medium-right.jpg) no-repeat scroll top right;
display: block;
float: left;
height: 39px;
margin-right: 6px;
padding-right: 18px;
text-decoration: none;
color: #fff;
font-family: Arial, Helvetica, sans-serif;
font-size:14px;
font-weight:bold;
}
a.btn-medium span {
background: transparent url(images/btn-medium-left.jpg) no-repeat;
display: block;
line-height: 39px;
padding: 0px 0 5px 18px;
text-align:center;
}
a.btn-medium:hover {
background: transparent url(images/btn-medium-righth.jpg) no-repeat scroll top right;
}
a.btn-medium:hover span {
background: transparent url(images/btn-medium-lefth.jpg) no-repeat;
color:#fff !important;
text-align:center;
}
a.btn-big {
background: transparent url(images/btn-big-right.jpg) no-repeat scroll top right;
display: block;
float: left;
height: 59px;
margin-right: 6px;
padding-right: 18px;
text-decoration: none;
color: #fff;
font-family: Arial, Helvetica, sans-serif;
font-size:18px;
font-weight:bold;
}
a.btn-big span {
background: transparent url(images/btn-big-left.jpg) no-repeat;
display: block;
line-height: 59px;
padding: 0px 0 5px 18px;
text-align:center;
}
a.btn-big:hover {
background: transparent url(images/btn-big-righth.jpg) no-repeat scroll top right;
}
a.btn-big:hover span {
background: transparent url(images/btn-big-lefth.jpg) no-repeat;
color:#fff !important;
text-align:center;
}

View File

@ -0,0 +1,912 @@
/************************************************************************
-) BASIC CONTAINERS
*************************************************************************/
body {
font-size:13px;
font-family: Arial, Helevtica, Verdana, san-serif;
color: #777777;
}
a {
text-decoration: none;
}
#fullwidth_header {
width: 100%;
height: 80px;
background: url(../images/header_bg.png) repeat-x;
position: fixed;
top: 0;
z-index: 9999;
}
#fullwidth_gradient {
width: 100%;
height: 180px;
background: url(../images/gradient_bg.png) repeat-x;
margin-top: 80px;
}
.iframe {
z-index: 1px;
}
/************************************************************************
-) HEADER
*************************************************************************/
.heading {
margin-top: 40px;
}
.heading h1 {
margin-bottom: 20px;
}
.subhead {
display: block;
font-family: Helvetica;
font-size: 14px;
font-weight: bold;
color: #555555;
}
.slider {
margin-top: 40px;
}
#monitor {
height: 298px;
background: url(../images/monitor.png) no-repeat;
}
#cycle {
width:322px;
height:185px;
position:absolute;
z-index:1;
margin:22px 0 0 45px;
}
.heading, .slider {
margin-bottom: 20px;
}
/*** LOGO ***/
.logo, .logo a {
display:block;
height:70px;
width:320px;
position:relative;
left:0px;
top:7px;
border: none;
padding: 0;
margin:0;
}
.logo a, .logo a:hover {
top:0;
left:0;
text-indent:-9999px;
outline:none;
border: none;
}
.logo a {
background: transparent url('../images/logo.png') no-repeat top left;
}
/************************************************************************
-) NAVIGATION
*************************************************************************/
#nav ul {
float:right;
margin:23px 0 0 0;
font-size:13px;
text-transform:none;
}
#nav li {
display:block;
float:left;
margin-left:5px;
}
#nav a {
display:block;
padding:8px 10px 8px 10px;
float:left;
color:#a5a5a5;
text-decoration:none;
}
#nav a:hover, #nav .current_page_item a {
text-decoration:none;
background: #777777;
color: #fff;
-moz-border-radius: 3px;
-webkit-border-radius:3px;
border-radius:3px;
}
#nav ul ul {
margin:20px 0 0 0;
width:180px;
text-transform:none;
}
#nav ul ul ul {
margin:-1px 0 0 40px;
text-transform:none;
border-bottom:none;
}
#nav ul ul li {
margin-left:0px;
}
#nav ul ul li a {
margin-left:0px;
background:none;
width:160px;
padding:10px 10px 8px 10px;
}
#nav ul ul li a:hover {
background:#e2e2e2;
}
#nav ul ul {
background:#161519;
border-left:1px solid #909090;
border-right:1px solid #909090;
}
#nav ul ul ul {
border:1px solid #909090;
}
#nav ul ul li {
border-bottom:1px solid #909090;
}
/*** SOCIAL BUTTONS ***/
.social_bookmarks {
float: right;
height: 24px;
list-style-type: none;
z-index: 6;
margin: 27px 0 0 0;
}
.social_bookmarks li {
float:right;
margin:0;
width:24px;
padding:0 0 0 7px;
}
.social_bookmarks li a {
height:24px;
width:24px;
display: block;
float:left;
text-indent: -9999px;
border:none;
padding:0;
outline: none;
}
.social_bookmarks .linkedin a {
background: transparent url(../images/linkedin.png) 0 0 no-repeat;
}
.social_bookmarks .facebook a {
background: transparent url(../images/facebook.png) 0 0 no-repeat;
}
.social_bookmarks .twitter a {
background: transparent url(../images/twitter.png) 0 0 no-repeat;
}
/************************************************************************
-) TEASER
*************************************************************************/
.teasertext {
font-family: Helvetica;
font-size: 24px;
font-weight: bold;
color: #555555;
}
.teasertext p {
line-height: 28px;
margin-bottom: 10px;
}
/************************************************************************
-) COIN SLIDER
*************************************************************************/
#coin_holder{
float:left;
width:925px;
height:280px;
background:#FFFFFF;
position:relative;
z-index:2;
margin-top:25px;
margin-bottom: 10px;
padding:7px;
}
#coin_holder .item{
width:925px;
height:280px;
background:#CCCCCC;
padding-bottom: 30px;
}
.coin-slider {
overflow: hidden;
zoom: 1;
position: relative;
margin-bottom: 50px;
}
.coin-slider a {
text-decoration: none;
outline: none;
border: none;
}
.slide_border {
background: #fff;
border:1px solid #d0d0d0;
padding: 0;
}
.slide_bg {
background: transparent url(../images/bg_image_slider.png) bottom center no-repeat;
margin-bottom: 40px;
}
.cs-buttons {
font-size: 0px;
padding: 10px;
float: left;
margin-top: 12px;
}
.cs-buttons a {
margin-left: 5px;
height: 10px;
width: 10px;
float: left;
color: #fff;
border: 1px solid #555555;
text-indent: -1000px;
-moz-border-radius: 100px;
-webkit-border-radius:100px;
border-radius:100px;
}
.cs-buttons a:hover {
background: #555555;
}
.cs-active {
background: #555555;
color: #fff;
}
.cs-title {
width: 920px;
padding: 10px;
background-color: #000000;
color: #FFFFFF;
}
.cs-prev, .cs-next {
background-color: #fff;
color: #555555;
padding: 0px 10px;
}
/************************************************************************
-) BUTTONS
*************************************************************************/
#call_to_action {
margin-top: 0px;
margin-bottom: 13px;
}
/************************************************************************
-) BOXES
*************************************************************************/
.box h3 {
font-family: Arial;
font-size: 14px;
font-weight: bold;
text-transform: uppercase;
color: #555555;
margin-bottom: -2px;
margin-top: 20px;
padding-top: 30px;
}
.box p {
font-family: Arial;
font-size: 13px;
color: #777777;
margin-bottom: 20px;
padding-top: 30px;
padding-right: 10px;
}
.box {
margin-top: 10px;
padding-bottom: 20px;
}
/************************************************************************
-) PORTFOLIO
*************************************************************************/
.portfolio_left h2 {
font-size: 36px;
letter-spacing: -0.05em;
color: #151515;
margin-bottom: 7px;
}
.item_border_big {
background: #fff;
border:1px solid #d0d0d0;
height: 482px;
}
.item_border_small {
background: #fff;
border:1px solid #d0d0d0;
height: 234px;
}
.item {
background: transparent url(../images/bg_image_big.png) bottom center no-repeat;
padding-bottom: 10px;
}
.item_small {
background: transparent url(../images/bg_image.png) bottom center no-repeat;
padding-bottom: 20px;
}
.portfolio_left, .portfolio_right {
max-height: 481px;
}
.next_button_first, .next_button_first a {
display:block;
height:50px;
width:50px;
position:relative;
left:50%;
top:500px;
border: none;
padding: 0;
margin:0;
}
.next_button_first a, .next_button_first a:hover {
top:0;
left:0;
text-indent:-9999px;
outline:none;
border: none;
}
.next_button_first a {
background: transparent url('../css/skin/images/icon_next.png') no-repeat;
}
.next_button_first a:hover {
background: transparent url('../css/skin/images/icon_next_hover.png') no-repeat;
}
.next_button, .next_button a {
display:block;
height:50px;
width:50px;
position:relative;
left:50%;
top:500px;
border: none;
padding: 0;
margin:0;
}
.next_button a, .next_button a:hover {
top:0;
left:0;
text-indent:-9999px;
outline:none;
border: none;
}
.next_button a {
background: transparent url('../css/skin/images/icon_next.png') no-repeat;
}
.next_button a:hover {
background: transparent url('../css/skin/images/icon_next_hover.png') no-repeat;
}
/************************************************************************
-) SERVICES
*************************************************************************/
.service_item {
margin-bottom: 20px;
}
.service_item h3 {
border-bottom: 1px solid #d0d0d0;
padding-bottom: 5px;
}
/************************************************************************
-) CONTACT
*************************************************************************/
.black {
background: #000;
margin-bottom: 50px;
-moz-border-radius: 3px;
-webkit-border-radius:3px;
border-radius:3px;
}
#contact {
margin-bottom: 50px;
margin-top: -20px;
margin-left: 12px;
}
/* Form style */
#contact label {
display: inline;
float: left;
color: #a5a5a5;
height: 26px;
line-height: 26px;
font-size: 14px;
margin: 6px 0;
-moz-border-radius: 3px;
-webkit-border-radius:3px;
border-radius:3px;
}
#contact input, textarea, select {
margin: 0;
padding: 5px;
color: #666;
font-size: 14px;
background: #f5f5f5;
border: 1px solid #ccc;
-moz-border-radius: 3px;
-webkit-border-radius:3px;
border-radius:3px;
}
#contact input, select {
height: 26px;
line-height: 26px;
font-size: 14px;
}
#contact textarea {
line-height: 26px;
font-size: 14px;
}
#contact select {
width: 482px;
}
#contact input:focus, textarea:focus, select:focus {
border: 1px solid #999;
background-color: #fff;
color:#333;
}
#contact input.submit {
font-size: 11px;
text-transform: uppercase;
font-weight: bold;
cursor: pointer;
border: 1px solid #dcff68;
background:#a6c71a;
color:#fff;
height: 35px;
padding: 5px 20px 5px 20px;
line-height: 15px;
}
#contact input.submit:hover {
background:#afcd22;
}
#contact input[type="submit"][disabled] {
background:#888;
}
#contact fieldset {
padding: 20px 0px 0px 15px;
}
#contact span.required {
font-size: 13px;
color: #ff0000;
} /* Select the colour of the * if the field is required. */
#message {
width: 480px;
margin: 10px 0 0 14px;
padding: 0;
}
.error_message {
display: block;
height: 22px;
line-height: 22px;
margin: 50px 0;
background: #FBE3E4 url('../images/assets/error.gif') no-repeat 10px center;
padding: 3px 10px 3px 35px;
color:#8a1f11;
border: 1px solid #FBC2C4;
-moz-border-radius: 3px;
-webkit-border-radius:3px;
border-radius:3px;
}
.loader {
padding: 0 10px;
}
#contact #success_page h3 {
background: url('../images/assets/success.gif') left no-repeat;
padding-left:22px;
color: #fff;
}
.notice {
height: 35px;
line-height: 35px;
margin-left: 20px;
padding-left: 20px;
border-left: 1px solid #777777;
}
/*** SOCIAL BUTTONS ***/
.social_bookmarks_footer {
float: left;
height: 32px;
list-style-type: none;
z-index: 6;
}
.social_bookmarks_footer li {
float:right;
margin:0;
width:32px;
padding:0 7px 0 0;
}
.social_bookmarks_footer li a {
height:32px;
width:32px;
display: block;
float:left;
text-indent: -9999px;
border:none;
padding:0;
outline: none;
}
.social_bookmarks_footer .linkedin a {
background: transparent url(../images/social/linkedin.png) 0 0 no-repeat;
}
.social_bookmarks_footer .facebook a {
background: transparent url(../images/social/facebook.png) 0 0 no-repeat;
}
.social_bookmarks_footer .twitter a {
background: transparent url(../images/social/twitter.png) 0 0 no-repeat;
}
.social_bookmarks_footer .delicious a {
background: transparent url(../images/social/delicious.png) 0 0 no-repeat;
}
.social_bookmarks_footer .vimeo a {
background: transparent url(../images/social/vimeo.png) 0 0 no-repeat;
}
.social_bookmarks_footer .flickr a {
background: transparent url(../images/social/flickr-2.png) 0 0 no-repeat;
}
.social_bookmarks_footer .deviantart a {
background: transparent url(../images/social/deviantart.png) 0 0 no-repeat;
}
/************************************************************************
-) FOOTER
*************************************************************************/
.footer {
margin-bottom: 80px;
}
/************************************************************************
-) MISC
*************************************************************************/
/*** CHECKLIST ***/
ul.checklist {
list-style:none !important;
margin-left:0px;
}
ul.checklist li {
background: url(../images/check.png) 0 1px no-repeat;
padding-left:30px;
line-height: 22px;
}
.left {
float: left;
}
.right {
float: right;
}
.bottom {
margin-top: 40px;
}
.category {
padding: 6px 7px 7px 35px;
}
.category a {
font-size: 11px;
font-weight: bold;
color: #555555;
text-decoration: none
}
.hire_me {
font-family: Arial;
font-size: 13px;
font-weight: bold;
color: #555555;
margin-top: 20px;
}
.rounded {
-moz-border-radius: 3px;
-webkit-border-radius:3px;
border-radius:3px;
}
.big_rounded {
-moz-border-radius: 5px;
-webkit-border-radius:5px;
border-radius:5px;
}
body .alignleft {
float:left;
margin:10px 20px 0 0;
display: block;
}
.alignleft img, .alignright img{
display:block;
}
.hr {
clear: both;
padding: 0;
margin: 0 0 1em;
height: 5px;
background: transparent url("../images/hr-bg.gif") repeat-x 0 0;
}
.padding_item_first {
padding-top: 30px;
margin-bottom: 80px;
}
.padding_item {
padding-top: 150px;
margin-bottom: 80px;
}
.padding_service {
padding-top: 95px;
margin-bottom: 80px;
}
.margin_top {
margin-top: 40px;
}
.margin_bottom {
margin-bottom: 40px;
}
.margin_break {
margin-top: 110px;
}
.margin_footer_break {
margin: 20px 0 20px 0;
}
/*
=======================================================================
Floating Box for color choices in live preview only
=======================================================================
*/
#box {
position: absolute;
right: 10px;
top: 80px;
}
#box div {
margin: 10px 0;
}
.highlight_box3 {
display: block;
float: left;
border: 1px solid #d0d0d0;
margin: 0px;
background-color: #fff;
-moz-border-radius: 3px;
-webkit-border-radius: 3px;
border-radius:3px;
}
.highlight_box3 p {
display: block;
font-size:12px;
padding: 10px 10px 10px 15px;
}
.highlight_box3 h4 {
display: block;
margin: 0px;
padding: 10px 10px 10px 10px;
color:#555555;
font-size:14px;
background: #f2f2f2;
}
.blue {
color: #0097da;
}
.blue:hover {
color: #00587f;
}
.green {
color: #2fae2b;
}
.green:hover {
color: #238020;
}
.orange {
color: #da6700;
}
.orange:hover {
color: #a64d00;
}
.yellow {
color: #dac100;
}
.yellow:hover {
color: #a59200;
}
.red {
color: #da0006;
}
.red:hover {
color: #a50005;
}
.brown {
color: #ae7e2b;
}
.brown:hover {
color: #815d20;
}
.cyan {
color: #10bfca;
}
.cyan:hover {
color: #0b848c;
}
.purple {
color: #8b00da;
}
.purple:hover {
color: #6900a6;
}
.pink {
color: #c100da;
}
.pink:hover {
color: #9200a6;
}
.oliv {
color: #92ae2b;
}
.oliv:hover {
color: #6b8020;
}

View File

@ -0,0 +1,94 @@
/*
960 Grid System ~ Text CSS.
Learn more ~ http://960.gs/
Licensed under GPL and MIT.
*/
/* `Basic HTML
----------------------------------------------------------------------------------------------------*/
body {
font: 13px/1.5 'Helvetica Neue', Arial, 'Liberation Sans', FreeSans, sans-serif;
}
a:focus {
outline: 1px dotted;
}
hr {
border: 0 #ccc solid;
border-top-width: 1px;
clear: both;
height: 0;
}
/* `Headings
----------------------------------------------------------------------------------------------------*/
h1 {
font-size: 70px;
letter-spacing: -0.05em;
line-height: 70px;
color: #151515;
}
h2 {
font-size: 36px;
letter-spacing: -0.05em;
color: #151515;
}
h3 {
font-size: 16px;
color: #555555;
text-transform: uppercase;
margin-bottom: 10px;
}
h4 {
font-size: 19px;
}
h5 {
font-size: 17px;
}
h6 {
font-size: 15px;
}
/* `Spacing
----------------------------------------------------------------------------------------------------*/
ol {
list-style: decimal;
}
ul {
list-style: disc;
}
li {
margin-left: 0px;
}
dl,
hr,
h1,
h2,
h4,
h5,
h6,
ol,
ul,
pre,
table,
address,
fieldset {
margin-bottom: 30px;
}
p {
margin-bottom: 15px;
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 847 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 560 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 989 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 452 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 755 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 819 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 821 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 110 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 36 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 130 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 121 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 845 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 828 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 142 B

Some files were not shown because too many files have changed in this diff Show More