gretard / sonar-ps-plugin Goto Github PK
View Code? Open in Web Editor NEWPowershell language plugin for SonarQube
License: GNU Lesser General Public License v3.0
Powershell language plugin for SonarQube
License: GNU Lesser General Public License v3.0
The tokenizer process does not correctly handle paths with one or more spaces.
The output of the process is:
INFO: Sensor TokenizerSensor [ps]
##[error]D:\4\_work\3\s\.scannerwork\.sonartmp\ps4136015749188592249parser.ps1 : Cannot process argument transformation on
parameter 'depth'. Cannot convert value "part-of-directory-after-space\file.ps1" to type "System.Int32". Error: "Input
D:\4\_work\3\s\.scannerwork\.sonartmp\ps4136015749188592249parser.ps1 : Cannot process argument transformation on
parameter 'depth'. Cannot convert value "part-of-directory-after-space\file.ps1" to type "System.Int32". Error: "Input
##[error]string was not in a correct format."
OS: Windows 2016 v1607
Packages and versions:
PowerShell 5.1.14393.2636
java C:\Program Files\Java\jre1.8.0_161
java_8_x64 C:\Program Files\Java\jre1.8.0_161
PSScriptAnalyzer 1.17.1
SonarQube 6.7.6
sonar-ps-plugin 0.3.2
We are seeing this message in our scans since upgrading to SonarQube 10.6:
WARN: Property 'sonar.ps.file.suffixes' is not declared as multi-values/property set
but was read using 'getStringArray' method. The SonarQube plugin declaring this
property should be updated.
It looks like this is the line that triggers the warning:
We are not sure if 10.6 introduced the problem; it could just be a coincidence that we noticed it after our upgrade.
This PR should fix the problem:
#33
Hi we have a following issue while script analyzer is working:
##[error]Invoke-ScriptAnalyzer : The following exception occurred while constructing the attribute "ProjectValidateAttribute":
##[error]"Value cannot be null.
Parameter name: key"
I think it was something about ps script analyzer version, but even update did not help.
Is it possible that there is some typo or issue in custom ps script analyzer rules? I was investigating the code from this repo and everything seems to be fine here.
The werid thing is that it was working without issue for whole year now it pops this error.
But after this weird error it analyses everything and send results to sonarqube.
Any suggestions how to get rid of this error?
The script analyzer process displays the following warning:
WARN: Unexpected exception while adding issue
org.sonar.api.utils.MessageException: The rule 'ps-psanalyzer:PSUseSingularNouns' does not exist.
It seems this rule is missing.
Running the script "regenerateRulesDefinition.ps1" adds this rule to the "powershell-rules.xml" and "powershell-profile.xml" on my environment.
OS: Windows 2016 v1607
Packages and versions:
PowerShell 5.1.14393.2636
java C:\Program Files\Java\jre1.8.0_161
java_8_x64 C:\Program Files\Java\jre1.8.0_161
PSScriptAnalyzer 1.17.1
SonarQube 6.7.6
sonar-ps-plugin 0.3.2
Hi
When running the analysis I get the following warning after analysis:
WARN: Unexpected exception while running analysis
javax.xml.bind.UnmarshalException: null
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:335)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.createUnmarshalException(UnmarshallerImpl.java:563)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:249)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal(UnmarshallerImpl.java:214)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:157)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:162)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:171)
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.unmarshal(AbstractUnmarshallerImpl.java:189)
at org.sonar.plugins.powershell.ScriptAnalyzerSensor.execute(ScriptAnalyzerSensor.java:72)
at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:53)
at org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:88)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:82)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:68)
at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:88)
at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:180)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:288)
at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:283)
at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:261)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:48)
at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:84)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:121)
at org.sonar.batch.bootstrapper.Batch.doExecuteTask(Batch.java:116)
at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:71)
at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
at com.sun.proxy.$Proxy0.execute(Unknown Source)
at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:171)
at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:128)
at org.sonarsource.scanner.cli.Main.execute(Main.java:111)
at org.sonarsource.scanner.cli.Main.execute(Main.java:75)
at org.sonarsource.scanner.cli.Main.main(Main.java:61)
Caused by: org.xml.sax.SAXParseException: Premature end of file.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:203)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:400)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:327)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1472)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl$PrologDriver.next(XMLDocumentScannerImpl.java:1014)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl.next(XMLDocumentScannerImpl.java:602)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.next(XMLNSDocumentScannerImpl.java:112)
at com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl.scanDocument(XMLDocumentFragmentScannerImpl.java:505)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:842)
at com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:771)
at com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
at com.sun.org.apache.xerces.internal.parsers.AbstractSAXParser.parse(AbstractSAXParser.java:1213)
at com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser.parse(SAXParserImpl.java:643)
at com.sun.xml.internal.bind.v2.runtime.unmarshaller.UnmarshallerImpl.unmarshal0(UnmarshallerImpl.java:243)
... 38 common frames omitted
What are we doing wrong?
Since PowerShell is largely cross-platform, are there any plans to help drive PS Script Analyzer for Linux?
Understand this is not core to this project--but additional pushing, might help.
Have this installed in SonarQube , plus have the PSScriptAnalyzer on the build machine. I know this works as I run it manually. How do I get SonarQube to do the scanning and create issues?
Hi, I've installed:
PS > Get-InstalledModule
Version Name Repository Description
1.17.1 PSScriptAnalyzer PSGallery PSScriptAnalyzer provides script analysis and checks for potential code defect...
I believe I'vet setup everything correctly, I run sonar-scanner with the key options as copied from the tutorial wizard which comes with SonarQube. I clicked Copy on the wizard and pasted the sonar-scanner command directly into my Terminal and within the Powershell project folder to perform the code analysis.
I keep getting no actual issues or count of any lines of code. As you can see below, it doesn't find any issue within my PS files, even though I intentionally changed a line like this:
if($something = "anything"){
This should've triggered the code smell:
'=' is not an assignment operator. Did you mean the equality operator '-eq'?
But as you can see, it doesn't appeared to have done anything?
I ran sonar-scanner in debug mode (sonar-scanner -X) and there is an error here:
20:00:39.583 WARN: Unexpected exception while running analysis
java.io.IOException: Cannot run program "powershell.exe": error=2, No such file or directory
Is it possible to point it to use "pwsh" which is the Mac equivalent?
Thanks
Powershell 5.1
Windows 10 Host
When calling the plugin as part of a Jenkins pipeline, we're experiencing this exception in some of our test scripts:
16:01:26.189 DEBUG: Exception while adding token
java.lang.IllegalArgumentException: Unable to register token in file Tests/Smoke/Test.Provision.ps1
at org.sonar.api.batch.sensor.cpd.internal.DefaultCpdTokens.addToken(DefaultCpdTokens.java:79)
at org.sonar.plugins.powershell.fillers.CpdFiller.tryAddToken(CpdFiller.java:38)
at org.sonar.plugins.powershell.fillers.CpdFiller.fill(CpdFiller.java:26)
at org.sonar.plugins.powershell.TokenizerSensor.execute(TokenizerSensor.java:101)
at org.sonar.scanner.sensor.SensorWrapper.analyse(SensorWrapper.java:53)
at org.sonar.scanner.phases.SensorsExecutor.executeSensor(SensorsExecutor.java:88)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:82)
at org.sonar.scanner.phases.SensorsExecutor.execute(SensorsExecutor.java:68)
at org.sonar.scanner.phases.AbstractPhaseExecutor.execute(AbstractPhaseExecutor.java:88)
at org.sonar.scanner.scan.ModuleScanContainer.doAfterStart(ModuleScanContainer.java:180)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.scan.ProjectScanContainer.scan(ProjectScanContainer.java:302)
at org.sonar.scanner.scan.ProjectScanContainer.scanRecursively(ProjectScanContainer.java:297)
at org.sonar.scanner.scan.ProjectScanContainer.doAfterStart(ProjectScanContainer.java:271)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.task.ScanTask.execute(ScanTask.java:48)
at org.sonar.scanner.task.TaskContainer.doAfterStart(TaskContainer.java:84)
at org.sonar.core.platform.ComponentContainer.startComponents(ComponentContainer.java:135)
at org.sonar.core.platform.ComponentContainer.execute(ComponentContainer.java:121)
at org.sonar.scanner.bootstrap.GlobalContainer.executeTask(GlobalContainer.java:121)
at org.sonar.batch.bootstrapper.Batch.doExecuteTask(Batch.java:116)
at org.sonar.batch.bootstrapper.Batch.execute(Batch.java:71)
at org.sonarsource.scanner.api.internal.batch.BatchIsolatedLauncher.execute(BatchIsolatedLauncher.java:46)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.sonarsource.scanner.api.internal.IsolatedLauncherProxy.invoke(IsolatedLauncherProxy.java:60)
at com.sun.proxy.$Proxy0.execute(Unknown Source)
at org.sonarsource.scanner.api.EmbeddedScanner.doExecute(EmbeddedScanner.java:171)
at org.sonarsource.scanner.api.EmbeddedScanner.execute(EmbeddedScanner.java:128)
at org.sonarsource.scanner.cli.Main.execute(Main.java:111)
at org.sonarsource.scanner.cli.Main.execute(Main.java:75)
at org.sonarsource.scanner.cli.Main.main(Main.java:61)
Caused by: java.lang.IllegalArgumentException: -127 is not a valid line for a file
at org.sonar.api.internal.google.common.base.Preconditions.checkArgument(Preconditions.java:145)
at org.sonar.api.batch.fs.internal.DefaultInputFile.checkValid(DefaultInputFile.java:308)
at org.sonar.api.batch.fs.internal.DefaultInputFile.newPointer(DefaultInputFile.java:246)
at org.sonar.api.batch.fs.internal.DefaultInputFile.newRange(DefaultInputFile.java:262)
at org.sonar.api.batch.sensor.cpd.internal.DefaultCpdTokens.addToken(DefaultCpdTokens.java:77)
... 35 common frames omitted
Hi @gretard
We're trying to import the Code Coverage of the Pester output test to the SonarQube dashboard. Do you have some experience to do it ? Or Do you know how we can do it ?
Best!
DIB
Hello!
Thank you for this nice plugin.
Would it be possible to add a couple of Rule Templates so we can add custom rules?
For reference : https://docs.sonarsource.com/sonarqube/latest/user-guide/rules/overview/#rule-templates-and-custom-rules
Thank you!
I am trying to analyze powershell scripts using the sonar-ps-plugin. When i run the analysis, the results are not updated in sonar server. Upon debug log i get the log like
File 'c:\xxx\xxx.ps1' not found in system to add issue ps-psanalyzer:PSAvoidUsingPlainTextForPassword
Any suggestion or is this an issue?
Hi
When I run the analysis from VSTS, most of it works fine but I get an error saying -
The rule 'ps-psanalyzer:PSAvoidTrailingWhitespace' does not exist.
Seems like this rule is missing in the sonarqube.
Thanks
Nikhil
The Script-Analyzer Powershell process does not complete when there is a significant amount of Script-Analyzer process output. The Script-Analyzer process that this sensor is failing on has about 500 lines of output. This is larger then other builds where this sensor does work.
This seems to be caused by the process output never being read in the ScriptAnalyzerSensor. Also see: https://stackoverflow.com/a/5483976
Run the ScriptAnalyzerSensor on a set of files that create several hundreds of lines of output (both standard output and error output). I have not tested where the actual limit is, 500 seems to be enough on my environment (see below).
Powershell analysis is executed and completes in about 7 minutes.
Powershell analysis is started, but never completes until the builds times out after 60 minutes.
2019-02-07T10:27:08.9714256Z INFO: Sensor ScriptAnalyzerSensor [ps]
2019-02-07T10:27:08.9991575Z INFO: Starting running powershell analysis: D:\4_work\3\s.scannerwork.sonartmp\ps387899190958008789scriptAnalyzer.ps1 -inputDir D:\4_work\3\s -output D:\4_work\3\s.scannerwork.sonartmp\2744577610841829641.tmp
..hangs..
OS: Windows 2016 v1607
Packages and versions:
PowerShell 5.1.14393.2636
java C:\Program Files\Java\jre1.8.0_161
java_8_x64 C:\Program Files\Java\jre1.8.0_161
PSScriptAnalyzer 1.17.1
Hello!
Happy New Year :)
We have installed the sonar-ps-plugin in our SonarQube server and tried running an analysis. The plugin detects the ps files and lines of code in it, but no analysis report like code smells, bugs etc. Then we realized that PSScriptAnalyzer is missing from the below steps and prompt note (as attached), but not sure how to make it work so that SonarQube can throw the analysis report as we expect.
Please advise! Thanks in Advance!
In the requirements there are mentions of which sonarqube version and such is required. But I am missing the java requirement. Because version 5.0.1 wont run on java 10.0.2 because it's build in newer version.
This work for sonarqube in linux? When i running i receive this error:
java.lang.IllegalStateException: Unrecoverable indexation failures: 1 errors among 1 requests
at org.sonar.server.es.IndexingListener$1.onFinish(IndexingListener.java:39)
at org.sonar.server.es.BulkIndexer.stop(BulkIndexer.java:131)
at org.sonar.server.measure.index.ProjectMeasuresIndexer.doIndex(ProjectMeasuresIndexer.java:162)
at org.sonar.server.measure.index.ProjectMeasuresIndexer.indexOnAnalysis(ProjectMeasuresIndexer.java:87)
at org.sonar.ce.task.projectanalysis.step.IndexAnalysisStep.execute(IndexAnalysisStep.java:45)
at org.sonar.ce.task.step.ComputationStepExecutor.executeStep(ComputationStepExecutor.java:81)
at org.sonar.ce.task.step.ComputationStepExecutor.executeSteps(ComputationStepExecutor.java:72)
at org.sonar.ce.task.step.ComputationStepExecutor.execute(ComputationStepExecutor.java:59)
at org.sonar.ce.task.projectanalysis.taskprocessor.ReportTaskProcessor.process(ReportTaskProcessor.java:81)
at org.sonar.ce.taskprocessor.CeWorkerImpl$ExecuteTask.executeTask(CeWorkerImpl.java:212)
at org.sonar.ce.taskprocessor.CeWorkerImpl$ExecuteTask.run(CeWorkerImpl.java:194)
at org.sonar.ce.taskprocessor.CeWorkerImpl.findAndProcessTask(CeWorkerImpl.java:160)
at org.sonar.ce.taskprocessor.CeWorkerImpl$TrackRunningState.get(CeWorkerImpl.java:135)
at org.sonar.ce.taskprocessor.CeWorkerImpl.call(CeWorkerImpl.java:87)
at org.sonar.ce.taskprocessor.CeWorkerImpl.call(CeWorkerImpl.java:53)
at com.google.common.util.concurrent.TrustedListenableFutureTask$TrustedFutureInterruptibleTask.runInterruptibly(TrustedListenableFutureTask.java:125)
at com.google.common.util.concurrent.InterruptibleTask.run(InterruptibleTask.java:69)
at com.google.common.util.concurrent.TrustedListenableFutureTask.run(TrustedListenableFutureTask.java:78)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.base/java.util.concurrent.FutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.base/java.lang.Thread.run(Unknown Source)
The newest version (9.0.1.46107) of Sonarqube cannot load the sonar-ps-plugin and aborts initialization with following error message
java.lang.IllegalStateException: Fail to load plugin Powershell Plugin for SonarQube [ps]
at org.sonar.server.plugins.ServerExtensionInstaller.installExtensions(ServerExtensionInstaller.java:77)
at org.sonar.server.platform.platformlevel.PlatformLevel4.start(PlatformLevel4.java:575)
at org.sonar.server.platform.PlatformImpl.start(PlatformImpl.java:213)
at org.sonar.server.platform.PlatformImpl.startLevel34Containers(PlatformImpl.java:187)
at org.sonar.server.platform.PlatformImpl$1.lambda$doRun$0(PlatformImpl.java:120)
at org.sonar.server.platform.PlatformImpl$AutoStarterRunnable.runIfNotAborted(PlatformImpl.java:370)
at org.sonar.server.platform.PlatformImpl$1.doRun(PlatformImpl.java:120)
at org.sonar.server.platform.PlatformImpl$AutoStarterRunnable.run(PlatformImpl.java:354)
at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.NoClassDefFoundError: org/sonar/api/profiles/ProfileDefinition
at java.base/java.lang.ClassLoader.defineClass1(Native Method)
at java.base/java.lang.ClassLoader.defineClass(ClassLoader.java:1017)
at java.base/java.security.SecureClassLoader.defineClass(SecureClassLoader.java:174)
at java.base/java.net.URLClassLoader.defineClass(URLClassLoader.java:550)
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:458)
at java.base/java.net.URLClassLoader$1.run(URLClassLoader.java:452)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:451)
at org.sonar.classloader.ClassRealm.loadClassFromSelf(ClassRealm.java:125)
at org.sonar.classloader.ParentFirstStrategy.loadClass(ParentFirstStrategy.java:37)
at org.sonar.classloader.ClassRealm.loadClass(ClassRealm.java:87)
at org.sonar.classloader.ClassRealm.loadClass(ClassRealm.java:76)
at org.sonar.plugins.powershell.PowershellPlugin.define(PowershellPlugin.java:35)
at org.sonar.server.plugins.ServerExtensionInstaller.installExtensions(ServerExtensionInstaller.java:67)
... 8 common frames omitted
Caused by: java.lang.ClassNotFoundException: org.sonar.api.profiles.ProfileDefinition
at org.sonar.classloader.ParentFirstStrategy.loadClass(ParentFirstStrategy.java:39)
at org.sonar.classloader.ClassRealm.loadClass(ClassRealm.java:87)
at org.sonar.classloader.ClassRealm.loadClass(ClassRealm.java:76)
... 22 common frames omitted
Any chance the plugin will be updated for compatibility with Sonarqube versions > 8.9.1?
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.