mtrubs / intellibot Goto Github PK
View Code? Open in Web Editor NEWIntelliJ/PyCharm plugin for Robot Automation Framework
Home Page: https://github.com/millennialmedia/intellibot/wiki
License: MIT License
IntelliJ/PyCharm plugin for Robot Automation Framework
Home Page: https://github.com/millennialmedia/intellibot/wiki
License: MIT License
Hi,
We are using intellibot and would like to make advantage of the bugfixes that were introduced after 0.6.4. Of course, it's possible to compile intellibot ourselves, however previous attempts showed this does not simply 'work' (to add a change we made I resorted to editing the jar instead of compiling the project since I couldn't get it to work). Since you've already updated the version it would seem logical to either update the repository, or provide a new jarfile for manual install. At the moment the jar file is 7 months old.
Regards,
Ate
*** Settings ***
Resource EmsServer_Keywords.txt
Resource EmsClient_Keywords.txt
Test_Simple
${path} = Set variable path
${entitlement} = build entitlement with id "1" and pathCondition "${path}"
The 'build entitlement with id..' is defined in EmsClient_Keywords.txt, the plugin opens it by ctrl+click, but reports 'unused import statement' for this resource.
if variables are defined in resource file and that file file imported in suite, then variables are not getting resolved. below is example for the same.
resource.robot
*** Variables ***
${BROWSER} firefox
${URL} www.google.com
test.robot
*** Test Cases ***
Example
open browser ${URL} ${BROWSER}
Hello,
I installed the plugin from github and I found the problem with keywords discovery if after keyword are only spaces. The example will describe that more precisely:
*** Test Case ***
Working
Some keyword # is working
Not working
Some keyword<space>
Off-course is a normal space. This is for python and user keywords.
We have python files which define functions. If imported these functions are accessible as keywords. 'my_method' would be envokable as 'my_method' or 'my method'. Preferably only the later would be recommended as part of auto-completion but but would be desirable as jump-to-source recognition.
Hello,
Application crashes after installing plugin in Pycharm Community Edition 3.0.2.
Below is my log file:
2014-01-27 08:43:11,375 [ 0] INFO - #com.intellij.idea.Main - ------------------------------------------------------ IDE STARTED ------------------------------------------------------
2014-01-27 08:43:11,417 [ 42] INFO - #com.intellij.idea.Main - IDE: PyCharm Community Edition (build #PC-131.618, 29 Nov 2013 00:00)
2014-01-27 08:43:11,417 [ 42] INFO - #com.intellij.idea.Main - OS: Linux (3.2.0-4-amd64, amd64)
2014-01-27 08:43:11,417 [ 42] INFO - #com.intellij.idea.Main - JRE: 1.7.0_45-b18 (Oracle Corporation)
2014-01-27 08:43:11,417 [ 42] INFO - #com.intellij.idea.Main - JVM: 24.45-b08 (Java HotSpot(TM) 64-Bit Server VM)
2014-01-27 08:43:11,424 [ 49] INFO - #com.intellij.idea.Main - JVM Args: -Xms128m -Xmx750m -XX:MaxPermSize=350m -XX:ReservedCodeCacheSize=96m -ea -Dsun.io.useCanonCaches=false -Djava.net.preferIPv4Stack=true -XX:+UseCodeCacheFlushing -XX:+UseConcMarkSweepGC -XX:SoftRefLRUPolicyMSPerMB=50 -Dawt.useSystemAAFontSettings=lcd -Djb.vmOptionsFile=/home/ute/programs/pycharm-community-3.0.1/bin/pycharm64.vmoptions -Xbootclasspath/a:/home/ute/programs/pycharm-community-3.0.1/bin/../lib/boot.jar -Didea.paths.selector=PyCharm30 -Didea.platform.prefix=PyCharmCore -Didea.no.jre.check=true -Djb.restart.code=88 -Dawt.useSystemAAFontSettings=on -Dswing.aatext=true
2014-01-27 08:43:11,504 [ 129] INFO - #com.intellij.idea.Main - JNA library loaded (64-bit) in 80 ms
2014-01-27 08:43:11,626 [ 251] INFO - #com.intellij.idea.Main - Snappy library loaded (1.0.5) in 121 ms
2014-01-27 08:43:12,114 [ 739] INFO - .intellij.idea.IdeaApplication - WM detected: Xfwm4
2014-01-27 08:43:15,194 [ 3819] INFO - llij.ide.plugins.PluginManager - 15 plugins initialized in 2351 ms
2014-01-27 08:43:15,195 [ 3820] INFO - llij.ide.plugins.PluginManager - Loaded bundled plugins: CVS Integration (11), Git Integration (8.1), GitHub, IDEA CORE, Python ReStructureText Integration (VERSION), ReStructuredText Support (130.SNAPSHOT), Subversion Integration (1.1), Task Management (1.0), Terminal (0.1), hg4idea (10.0)
2014-01-27 08:43:15,195 [ 3820] INFO - llij.ide.plugins.PluginManager - Loaded custom plugins: BashSupport (1.1beta19-idea13), File Watchers (131.17), IntelliBot (0.2.1), Lua (1.0a61), TextMate bundles support (6.0.0.20130917)
2014-01-27 08:43:16,462 [ 5087] INFO - ellij.util.io.PagedFileStorage - lower=100; upper=200; buffer=10; max=748027904
2014-01-27 08:43:16,678 [ 5303] INFO - api.vfs.impl.local.FileWatcher - Starting file watcher: /home/ute/programs/pycharm-community-3.0.1/bin/fsnotifier64
2014-01-27 08:43:16,705 [ 5330] INFO - api.vfs.impl.local.FileWatcher - Native file watcher is operational.
2014-01-27 08:43:17,453 [ 6078] ERROR - llij.ide.plugins.PluginManager - com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.openapi.fileTypes.FileTypeManager'
java.lang.RuntimeException: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.openapi.fileTypes.FileTypeManager'
at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:258)
at com.intellij.idea.MainImpl$1$1.run(MainImpl.java:43)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$200(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:696)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:524)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:335)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
Caused by: com.intellij.ide.plugins.PluginManager$StartupAbortedException: Fatal error initializing 'com.intellij.openapi.fileTypes.FileTypeManager'
at com.intellij.ide.plugins.PluginManager.handleComponentError(PluginManager.java:215)
at com.intellij.openapi.application.impl.ApplicationImpl.handleInitComponentError(ApplicationImpl.java:366)
at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:570)
at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter.getComponentInstance(ComponentManagerImpl.java:590)
at com.intellij.util.pico.DefaultPicoContainer.getLocalInstance(DefaultPicoContainer.java:226)
at com.intellij.util.pico.DefaultPicoContainer.getInstance(DefaultPicoContainer.java:213)
at com.intellij.util.pico.DefaultPicoContainer.getComponentInstance(DefaultPicoContainer.java:200)
at org.picocontainer.alternatives.AbstractDelegatingMutablePicoContainer.getComponentInstance(AbstractDelegatingMutablePicoContainer.java:75)
at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponent(ComponentManagerImpl.java:121)
at com.intellij.openapi.application.impl.ApplicationImpl.createComponent(ApplicationImpl.java:386)
at com.intellij.openapi.components.impl.ComponentManagerImpl.createComponents(ComponentManagerImpl.java:112)
at com.intellij.openapi.components.impl.ComponentManagerImpl.init(ComponentManagerImpl.java:89)
at com.intellij.openapi.components.impl.stores.ApplicationStoreImpl.load(ApplicationStoreImpl.java:87)
at com.intellij.openapi.application.impl.ApplicationImpl.load(ApplicationImpl.java:525)
at com.intellij.idea.IdeaApplication.run(IdeaApplication.java:250)
... 18 more
Caused by: java.lang.RuntimeException: java.lang.ClassNotFoundException: com.millennialmedia.intellibot.psi.RobotFileTypeHandler PluginClassLoader[com.millennialmedia.intellibot, 0.2.1]
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.loadClass(ExtensionComponentAdapter.java:151)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.getComponentImplementation(ExtensionComponentAdapter.java:63)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.getComponentInstance(ExtensionComponentAdapter.java:70)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.getExtension(ExtensionComponentAdapter.java:111)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.processAdapters(ExtensionPointImpl.java:241)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.getExtensions(ExtensionPointImpl.java:185)
at com.intellij.openapi.extensions.Extensions.getExtensions(Extensions.java:111)
at com.intellij.openapi.extensions.Extensions.getExtensions(Extensions.java:98)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.initStandardFileTypes(FileTypeManagerImpl.java:153)
at com.intellij.openapi.fileTypes.impl.FileTypeManagerImpl.initComponent(FileTypeManagerImpl.java:284)
at com.intellij.openapi.components.impl.ComponentManagerImpl$ComponentConfigComponentAdapter$1.getComponentInstance(ComponentManagerImpl.java:548)
... 30 more
Caused by: java.lang.ClassNotFoundException: com.millennialmedia.intellibot.psi.RobotFileTypeHandler PluginClassLoader[com.millennialmedia.intellibot, 0.2.1]
at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.java:82)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.loadClass(ExtensionComponentAdapter.java:148)
... 40 more
2014-01-27 08:43:17,465 [ 6090] ERROR - llij.ide.plugins.PluginManager - PyCharm Community Edition 3.0.2 Build #PC-131.618
2014-01-27 08:43:17,465 [ 6090] ERROR - llij.ide.plugins.PluginManager - JDK: 1.7.0_45
2014-01-27 08:43:17,465 [ 6090] ERROR - llij.ide.plugins.PluginManager - VM: Java HotSpot(TM) 64-Bit Server VM
2014-01-27 08:43:17,465 [ 6090] ERROR - llij.ide.plugins.PluginManager - Vendor: Oracle Corporation
2014-01-27 08:43:17,465 [ 6090] ERROR - llij.ide.plugins.PluginManager - OS: Linux
2014-01-27 08:43:17,465 [ 6090] ERROR - llij.ide.plugins.PluginManager - Last Action:
2014-01-27 08:43:20,542 [ 9167] INFO - newvfs.persistent.PersistentFS - VFS dispose started
2014-01-27 08:43:20,551 [ 9176] INFO - #com.intellij.idea.Main - ------------------------------------------------------ IDE SHUTDOWN ------------------------------------------------------
2014-01-27 08:43:20,644 [ 9269] INFO - newvfs.persistent.PersistentFS - VFS dispose completed
Hi intellibot team !
According to the robot framework user guide, the ellipsis can be used to let a line span over multiple text line. This is especially useful the for documentation keywork.
Example:
*** Settings ***
Documentation
... First paragraph has only one line.
...
... Second paragraph, this time created
... with multiple lines.
However it seems that intellibot does not support a such construct since I get a red squiggle. Would it be possible to add support for the ellipsis ? It would make my documentation look a bit nicer ;)
Thanks.
I'm not sure if I described this properly in the title, but hopefully this example code snippet will help.
from robot.libraries.BuiltIn import BuiltIn
from Selenium2Library.keywords.keywordgroup import KeywordGroup
import logging
def get_current_browser():
browser = BuiltIn().get_library_instance('Selenium2Library')._current_browser()
return browser
class MyLibrary(KeywordGroup):
def get_title_via_python(self):
driver = get_current_browser()
title = driver.title
logging.warn("checking title %s" % title)
return title
In PyCharm, a Robot file that uses this python library file (import is successfully acknowledged by Intellibot) will show that 'Get Current Browser' resolves to the python code, but 'Get Title Via Python' does not, and is instead lined in red with a 'Keyword definition not found' error.
Consider a python library file written in class structure let say Library.py
Now if this file is in Pythonpath or in current directory the import works fine, i.e.
*** Settings ***
Library Library
if the same file is imported with relative path, i.e
*** Settings ***
Library Path1/Path2/Library
Library.py is detected, but the keywords present inside is not detected i.e. class search didn't worked.
If I create a Robot resource file called 'variables.txt' with variable ${xyz} defined within it, and then create another robot test case file which imports variables.txt as a Resource, ${xyz} will be marked as 'not found' if used in a test case in that 2nd file. Robot will see it and run accordingly, but intellibot won't.
Libraries imported from python keyword files are now being flagged in Pycharm as 'Import file not found'. This began to occur after upgrading to the latest Intellibot plugin.
Here's an example import line, in this case for a python keyword file which is in the same directory as the the Robot script that uses it:
Library ./performanceKeywords.py
The file is still there and the robot script runs fine, but intellibot appears to be missing it somehow.
Since the last update I constantly get many exception which are caused by the intellibot plugin. I tried to reinstall the plugin with no effect.
I am using intelliJ 12 under MacOSx 10.9
I'll get the following exceptions on editing *.robot files
com.intellij.reference.SoftReference.dereference(Ljava/lang/ref/Reference;)Ljava/lang/Object;: com.intellij.reference.SoftReference.dereference(Ljava/lang/ref/Reference;)Ljava/lang/Object;
java.lang.NoSuchMethodError: com.intellij.reference.SoftReference.dereference(Ljava/lang/ref/Reference;)Ljava/lang/Object;
at com.millennialmedia.intellibot.RobotBundle.getBundle(RobotBundle.java:32)
at com.millennialmedia.intellibot.RobotBundle.message(RobotBundle.java:27)
at com.millennialmedia.intellibot.ide.inspections.compilation.RobotKeywordNotFound.getMessage(RobotKeywordNotFound.java:50)
at com.millennialmedia.intellibot.ide.inspections.SimpleInspectionVisitor.visitElement(SimpleInspectionVisitor.java:31)
at com.intellij.psi.impl.source.tree.LeafPsiElement.accept(LeafPsiElement.java:213)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.a(LocalInspectionsPass.java:412)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.a(LocalInspectionsPass.java:370)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.a(LocalInspectionsPass.java:341)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.access$000(LocalInspectionsPass.java:78)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$2.process(LocalInspectionsPass.java:309)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$2.process(LocalInspectionsPass.java:306)
at com.intellij.concurrency.JobLauncherImpl$2$1.run(JobLauncherImpl.java:115)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:226)
at com.intellij.concurrency.JobLauncherImpl$2.process(JobLauncherImpl.java:113)
at com.intellij.concurrency.JobLauncherImpl$1.run(JobLauncherImpl.java:54)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:439)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at com.intellij.concurrency.PrioritizedFutureTask.access$101(PrioritizedFutureTask.java:31)
at com.intellij.concurrency.PrioritizedFutureTask$1.run(PrioritizedFutureTask.java:70)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1182)
at com.intellij.concurrency.PrioritizedFutureTask.run(PrioritizedFutureTask.java:97)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
Error during dispatching of java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=com.apple.eawt._AppEventHandler$_AppEventDispatcher$1@3eec3af5,notifier=null,catchExceptions=false,when=1404983177652] on apple.awt.CToolkit@712cb19: com.intellij.reference.SoftReference.dereference(Ljava/lang/ref/Reference;)Ljava/lang/Object;
java.lang.NoSuchMethodError: com.intellij.reference.SoftReference.dereference(Ljava/lang/ref/Reference;)Ljava/lang/Object;
at com.millennialmedia.intellibot.RobotBundle.getBundle(RobotBundle.java:32)
at com.millennialmedia.intellibot.RobotBundle.message(RobotBundle.java:27)
at com.millennialmedia.intellibot.ide.config.RobotColorsPage.<clinit>(RobotColorsPage.java:60)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.loadClass(ExtensionComponentAdapter.java:148)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.getComponentImplementation(ExtensionComponentAdapter.java:63)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.getComponentInstance(ExtensionComponentAdapter.java:70)
at com.intellij.openapi.extensions.impl.ExtensionComponentAdapter.getExtension(ExtensionComponentAdapter.java:111)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.processAdapters(ExtensionPointImpl.java:241)
at com.intellij.openapi.extensions.impl.ExtensionPointImpl.getExtensions(ExtensionPointImpl.java:185)
at com.intellij.openapi.extensions.Extensions.getExtensions(Extensions.java:111)
at com.intellij.openapi.extensions.Extensions.getExtensions(Extensions.java:98)
at com.intellij.openapi.options.colors.pages.ColorSettingsPagesImpl.getRegisteredPages(ColorSettingsPagesImpl.java:43)
at com.intellij.application.options.colors.ColorAndFontOptions.a(ColorAndFontOptions.java:513)
at com.intellij.application.options.colors.ColorAndFontOptions.a(ColorAndFontOptions.java:504)
at com.intellij.application.options.colors.ColorAndFontOptions.e(ColorAndFontOptions.java:494)
at com.intellij.application.options.colors.ColorAndFontOptions.buildConfigurables(ColorAndFontOptions.java:318)
at com.intellij.openapi.options.SearchableConfigurable$Parent$Abstract.getConfigurables(SearchableConfigurable.java:76)
at com.intellij.openapi.options.newEditor.OptionsTree.a(OptionsTree.java:502)
at com.intellij.openapi.options.newEditor.OptionsTree.access$500(OptionsTree.java:56)
at com.intellij.openapi.options.newEditor.OptionsTree$EditorNode.buildChildren(OptionsTree.java:532)
at com.intellij.openapi.options.newEditor.OptionsTree$EditorNode.buildChildren(OptionsTree.java:519)
at com.intellij.ui.treeStructure.CachingSimpleNode.getChildren(CachingSimpleNode.java:36)
at com.intellij.ui.treeStructure.SimpleTreeStructure.getChildElements(SimpleTreeStructure.java:25)
at com.intellij.ui.treeStructure.filtered.FilteringTreeStructure.addToCache(FilteringTreeStructure.java:67)
at com.intellij.ui.treeStructure.filtered.FilteringTreeStructure.addToCache(FilteringTreeStructure.java:82)
at com.intellij.ui.treeStructure.filtered.FilteringTreeStructure.addToCache(FilteringTreeStructure.java:82)
at com.intellij.ui.treeStructure.filtered.FilteringTreeStructure.rebuild(FilteringTreeStructure.java:62)
at com.intellij.ui.treeStructure.filtered.FilteringTreeStructure.<init>(FilteringTreeStructure.java:54)
at com.intellij.ui.treeStructure.filtered.FilteringTreeStructure.<init>(FilteringTreeStructure.java:45)
at com.intellij.ui.treeStructure.filtered.FilteringTreeBuilder.<init>(FilteringTreeBuilder.java:52)
at com.intellij.openapi.options.newEditor.OptionsTree$MyBuilder.<init>(OptionsTree.java:757)
at com.intellij.openapi.options.newEditor.OptionsTree.<init>(OptionsTree.java:92)
at com.intellij.openapi.options.newEditor.OptionsEditor$3.<init>(OptionsEditor.java:144)
at com.intellij.openapi.options.newEditor.OptionsEditor.<init>(OptionsEditor.java:144)
at com.intellij.openapi.options.newEditor.OptionsEditorDialog.createCenterPanel(OptionsEditorDialog.java:89)
at com.intellij.openapi.ui.DialogWrapper.init(DialogWrapper.java:1116)
at com.intellij.openapi.options.newEditor.OptionsEditorDialog.a(OptionsEditorDialog.java:72)
at com.intellij.openapi.options.newEditor.OptionsEditorDialog.<init>(OptionsEditorDialog.java:57)
at com.intellij.ide.actions.ShowSettingsUtilImpl.a(ShowSettingsUtilImpl.java:64)
at com.intellij.ide.actions.ShowSettingsUtilImpl.showSettingsDialog(ShowSettingsUtilImpl.java:51)
at com.intellij.ide.MacOSApplicationProvider$Worker$1.handlePreferences(MacOSApplicationProvider.java:101)
at com.apple.eawt._AppEventLegacyHandler$2.dispatchEvent(_AppEventLegacyHandler.java:90)
at com.apple.eawt._AppEventLegacyHandler.sendEventToEachListenerUntilHandled(_AppEventLegacyHandler.java:168)
at com.apple.eawt._AppEventLegacyHandler.handlePreferences(_AppEventLegacyHandler.java:88)
at com.apple.eawt._AppEventHandler$_PreferencesDispatcher.performUsing(_AppEventHandler.java:253)
at com.apple.eawt._AppEventHandler$_PreferencesDispatcher.performUsing(_AppEventHandler.java:244)
at com.apple.eawt._AppEventHandler$_AppEventDispatcher$1.run(_AppEventHandler.java:489)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:715)
at java.awt.EventQueue.access$400(EventQueue.java:82)
at java.awt.EventQueue$2.run(EventQueue.java:676)
at java.awt.EventQueue$2.run(EventQueue.java:674)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:86)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:685)
at com.intellij.ide.IdeEventQueue.d(IdeEventQueue.java:700)
at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:525)
at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:348)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:296)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:201)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:196)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:188)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
See #26
Things like show a warning if someone has *** Setting *** or WHEN or when. The parser currently supports them but these types of code standards are better forced via warnings.
This is an enhancement.
Content assist suggestions for keywords could be sorted in the following order for convenience:
It would be probably even better if the user could switch between resource/library keywords with additional CTRL+Space like in java suggestions in eclipse (don't know if it is possible in idea).
Also it would be great if keywords from libraries were spelled in the suggestions in the standard way like this Run Keyword If
instead of run keyword if
.
I have a robot framework/java integration and it would be great if I could click in a Java defined keyword and jump to source and if the auto complete includes that keywords to.
Hello,
New auto-complete functionality is able to show keywords from python libraries but functionality is case sensitive (it should not be). If keyword definition is:
def setup_something(self):
then auto-complete will show up for:
setup so
but not for
Setup so
Hey,
Thanks a lot for your efforts in this plugin!!!
I am using IntelliJ IDEA build 135.690 community edition and IntelliBot version 0.3.
If I try to control + mouse-over in a test case of a .robot file, nothing happens in the editor, and I get an error in the Event Log:
IllegalArgumentException: Argument 0 for @NotNull parameter of com/intellij/CommonBundle.message must not be null: Argument 0 for @NotNull parameter of com/intellij/CommonBundle.message must not be null
(The error indeed exists twice in the same line; don't know if that is helpful or not)
If I control + mouse-over in some resources of a .robot file, it works as expected, and if you control+click on a resource, it opens it.
Hello,
Plugin is not able to display help window and recognize keyword if keyword is used after assignment. The simple example is:
${result}= Some keyword
It should be possible to get help window also for that case. Not all keywords are used in first column of test definition.
It would be a good idea to add few words about installation to the README. At least for me it it took me some time to figure out I can do it directly from my PyCharm. That's obviously obvious for anyone who has installed such plugins earlier, but I'm sure there are other first-timers than I.
It also took a little time before I got the message that *.robot files are recognized and the plugin really started to work. I was already worried the installation didn't actually work.
Now that I have the plugin running I have to say I'm impressed. Syntax highlight alone would have been great, but having also cool features such as keyword and setting completion is awesome. Thanks guys!
Hello,
Plugin installed in Pycharm cannot recognize python files what is mentioned in README file. Do you have any plans to add it soon ? Is it possible to recognize python files installed in python (virtualenv)?
I reported this issue to start discussion about Pycharm support and get status of plugin development.
This one is easy to fix. You check python pluginid in PythonResolver.detectPython:
if (PYTHON_ID.equals(pluginId)) {
return true;
}
and
private static final String PYTHON_ID = "Pythonid";
but this is correct for ultimate only. For community python pluginid is PythonCore
. I believe if you allow this too your plugin should work fine in community edition.
BTW, should you really check the pluginid? Maybe trial and error method is OK? There are some instanceof checks for PyFile, PyClass, etc...
like explained in the user doc (http://robotframework.org/robotframework/latest/RobotFrameworkUserGuide.html#plain-text-format), a plain text test can start with a block of free text. The plugin currently underline this block in red like if it was an error. This should not be the case.
things like *** keywords *** should generate 0 spaces.
Keywords should generate 2 spaces.
Gherkin should generate 1 space.
Keyword arguments should either be 0 or 2; once we get variables working.
Hello,
I noticed that latest plugin version shows protected methods. From Robot Framework perspective protected methods are not keywords. The difference between normal keyword and keyword from protected method is one additional space from the begining.
Variable settings in Editor Color & Text is not working. Variable used in the test body has color of argument.
Consider a python library written in class structure, the folder structure is as such:
Project
---- Lib
------ Keyword
--------- init.py
--------- CustomKeywords2.py
--------- CustomKeywords1.py
Where Project is in Python path and init.py have Keyword class inheriting CustomKeywords1 and CustomKeywords2
Now if we try to import Keyword as
*** Settings ***
Library Lib/Keyword
The plugin searches Keyword.py file and couldn't find it
It works, if we put Lib in python path and import it like
*** Settings ***
Library Keyword
Hello,
I'm using Pycharm Community Edition 3.0.2 and I'm not able to enable intellibot plugin because Pythonid plugin is missing. I cannot install Pythonid plugin because is not compatible with Pycharm.
Thanks for support.
Please provide auto complete support for user defined variables.
We have some legacy robot code using ${/} in the relative paths, and Intellibot fails to locate those keyword sources on click through unless the path separators are changed to /.
Hi
Test case color disappears if line above test case definition has only spaces. Is ok if line above contains spaces and keywords.
Keywords from the standard Robot Libraries are incorrectly being identified with "Keyword definition not found" errors. For example:
*** Settings ***
Library Process*** Test Cases ***
Simple Check
${result} = Run Process date
Should Not Be Empty ${result.stdout}
will show that "Run Process" has the error "Keyword definition not found." I'm using PyCharm Community Edition 4.0.3 and have tried IntelliBot 0.6.4 & 0.6.5.
a robot keyword can be defined as:
0. click on ${link_name} link
and then be invoked as:
We do not currently do the regex type checking. We might have to require the definition variable define the regex. I think the robot framework supports that.
Hello,
Keyword color after assignment is displayed as parameter, what is not true. This issue is connected with #34 issue. The sample is:
${result}= Some keyword
"Some keyword" is displayed as parameter, not keyword execution.
Best Regards
Pawel
If keyword Get Var Value
is used in the following way:
${var}= Get Var Value
this keyword is not clickable even when its definition is available.
currently robot keywords only match for jump to source if they do not have a name space. Things like the below do not work.
my_file.my keyword
Hello,
From user perspective it will be very good to highlight unknown variables. It will help to identify problems faster.
Firstly, I love this plugin. Well done! Jumping to source in a large project is a real sweat-saver. ;)
I've run into a difficulty with jump-to-source (in PyCharm) in which some of the basic Selenium2Library keywords do not resolve successfully to source. 'Click Element' for example, should resolve to the source in the _element.py file. There is a .pyc file generated for this file and others on my Mac in /Library/Python/2.7/site-packages/Selenium2Library/keywords folder but I get a 'Cannot find declaration to go to' message in PyCharm when I try to jump to source. Some of the Selenium2Library keywords, such as 'Open Browser' resolve just fine, so it seems strange that some work and some don't. Permissions are identical across all files. Thanks in advance for any help you can offer on this.
Robot framework allows transitive imports, i.e. if there are three files:
k1.robot:
*** Keywords ***
K one
Do stuff
k2.robot:
*** Settings ***
Resource k1.robot
*** Keywords ***
K two
Do stuff
k3.robot:
*** Settings ***
Resource k2.robot
*** Keywords ***
K three
K two
K one
this situation is valid and keyword K one
is imported to k3.robot. However, Intellibot plugin doesn't scan transitive imports.
It would be nice if you could let me know if you have any plans on fixing this and if possible - when. Our project currently is full of such transitive imports, unfortunately.
Completing table headers and settings is a really convenient feature, but showing all aliases there makes it a bit harder to use. For example, if I hit control space on an empty line, I get *** Settings ***
, *** Setting ***
and *** Metadata ***
along with all other table names and their aliases. There are several reasons I think this is not a good idea:
*** Metadata ***
instead of *** Settings ***
or [Precondition]
instead of [Setup]
). I actually consider it a mistake to add them to Robot Framework in the first place.*** Settings ***
) work better than singular (e.g. *** Setting ***
) in the plain text format because the header applies to the whole table. Singular names work well in HTML or TSV where the name is the header of the first column and subsequent columns typically have their own headers.My proposal is that completion shows following table names and settings. Notice that Robot Framework User Guide lists all all available table names and settings.
Tables:
*** Settings ***
*** Variables ***
*** Test Cases ***
*** Keywords ***
Settings in the settings table:
Library
Resource
Variables
Documentation
Metadata
Suite Setup
Suite Teardown
Force Tags
Default Tags
Test Setup
Test Teardown
Test Template
Test Timeout
Settings in the test case table:
[Documentation]
[Tags]
[Setup]
[Teardown]
[Template]
[Timeout]
Settings in the keyword table:
[Documentation]
[Arguments]
[Return]
[Teardown]
[Timeout]
I understand that others may have different preferences for table/setting names. If that is considered a big problem, the setting names to use could be made configurable later. Even in that case the completion should only show one alternative per table/setting, though.
Pycharm: 4.0.4
Plugin version: 0.6.4
Everyday Pycharm show many notification that plugin raise exception. Could you look what is going on?
Already disposed
java.lang.AssertionError: Already disposed
at com.intellij.openapi.components.impl.ComponentManagerImpl.getPicoContainer(ComponentManagerImpl.java:281)
at com.intellij.openapi.components.impl.ComponentManagerImpl.getPicoContainer(ComponentManagerImpl.java:53)
at com.intellij.openapi.components.ServiceManager.getService(ServiceManager.java:40)
at com.intellij.psi.util.PsiModificationTracker$SERVICE.getInstance(PsiModificationTracker.java:57)
at com.jetbrains.python.psi.types.TypeEvalContextCache.getContext(TypeEvalContextCache.java:65)
at com.jetbrains.python.psi.types.TypeEvalContext.codeInsightFallback(TypeEvalContext.java:121)
at com.jetbrains.python.psi.impl.PyClassImpl.getAncestorClasses(PyClassImpl.java:233)
at com.jetbrains.python.psi.impl.PyClassImpl.visitMethods(PyClassImpl.java:893)
at com.jetbrains.python.psi.impl.PyClassImpl.visitMethods(PyClassImpl.java:884)
at com.millennialmedia.intellibot.psi.ref.RobotPythonClass.getDefinedKeywords(RobotPythonClass.java:39)
at com.millennialmedia.intellibot.psi.ref.ResolverUtils.resolveKeywordFromFile(ResolverUtils.java:37)
at com.millennialmedia.intellibot.psi.ref.RobotKeywordReference.resolve(RobotKeywordReference.java:32)
at com.millennialmedia.intellibot.ide.inspections.compilation.RobotKeywordNotFound.skip(RobotKeywordNotFound.java:42)
at com.millennialmedia.intellibot.ide.inspections.SimpleInspectionVisitor.visitElement(SimpleInspectionVisitor.java:26)
at com.intellij.psi.impl.source.tree.LeafPsiElement.accept(LeafPsiElement.java:213)
at com.intellij.codeInspection.InspectionEngine.acceptElements(InspectionEngine.java:80)
at com.intellij.codeInspection.InspectionEngine.createVisitorAndAcceptElements(InspectionEngine.java:69)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.runToolOnElements(LocalInspectionsPass.java:289)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.access$000(LocalInspectionsPass.java:75)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$2.process(LocalInspectionsPass.java:258)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass$2.process(LocalInspectionsPass.java:255)
at com.intellij.concurrency.ApplierCompleter.execAndForkSubTasks(ApplierCompleter.java:122)
at com.intellij.concurrency.ApplierCompleter.access$000(ApplierCompleter.java:44)
at com.intellij.concurrency.ApplierCompleter$1.run(ApplierCompleter.java:85)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1146)
at com.intellij.concurrency.ApplierCompleter$2.run(ApplierCompleter.java:94)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.registerIndicatorAndRun(ProgressManagerImpl.java:281)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.registerIndicatorAndRun(ProgressManagerImpl.java:278)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:233)
at com.intellij.concurrency.ApplierCompleter.wrapInReadActionAndIndicator(ApplierCompleter.java:106)
at com.intellij.concurrency.ApplierCompleter.compute(ApplierCompleter.java:82)
at jsr166e.CountedCompleter.exec(CountedCompleter.java:684)
at jsr166e.ForkJoinTask.doExec(ForkJoinTask.java:260)
at jsr166e.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:858)
at jsr166e.ForkJoinPool.scan(ForkJoinPool.java:1687)
at jsr166e.ForkJoinPool.runWorker(ForkJoinPool.java:1642)
at jsr166e.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:109)
currently when you command mouse over a python lib it shows you some documentation for that method. The defined robot keywords currently have nothing. It would be nice if we could add their documentation and argument info to the tooltip.
com/millennialmedia/intellibot/ide/inspections/cleanup/RobotImportNotUsed : Unsupported major.minor version 51.0 [Plugin: com.millennialmedia.intellibot]: com/millennialmedia/intellibot/ide/inspections/cleanup/RobotImportNotUsed : Unsupported major.minor version 51.0 [Plugin: com.millennialmedia.intellibot]
com.intellij.diagnostic.PluginException: com/millennialmedia/intellibot/ide/inspections/cleanup/RobotImportNotUsed : Unsupported major.minor version 51.0 [Plugin: com.millennialmedia.intellibot]
at com.intellij.ide.plugins.cl.PluginClassLoader.b(PluginClassLoader.java:108)
at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.java:63)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at com.intellij.openapi.extensions.AbstractExtensionPointBean.findClass(AbstractExtensionPointBean.java:42)
at com.intellij.openapi.extensions.AbstractExtensionPointBean.instantiate(AbstractExtensionPointBean.java:62)
at com.intellij.codeInspection.InspectionEP.instantiateTool(InspectionEP.java:141)
at com.intellij.codeInspection.ex.InspectionToolWrapper.getTool(InspectionToolWrapper.java:72)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.getInspectionTools(LocalInspectionsPass.java:743)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPassFactory$MyLocalInspectionsPass.getInspectionTools(LocalInspectionsPassFactory.java:84)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.collectInformationWithProgress(LocalInspectionsPass.java:136)
at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:58)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:62)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1$1.run(PassExecutorService.java:357)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1182)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1.run(PassExecutorService.java:348)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:226)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.doRun(PassExecutorService.java:345)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:321)
at com.intellij.concurrency.JobLauncherImpl$3.call(JobLauncherImpl.java:145)
at com.intellij.concurrency.JobLauncherImpl$3.call(JobLauncherImpl.java:142)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at com.intellij.concurrency.PrioritizedFutureTask.access$101(PrioritizedFutureTask.java:31)
at com.intellij.concurrency.PrioritizedFutureTask$1.run(PrioritizedFutureTask.java:70)
at com.intellij.concurrency.PrioritizedFutureTask.run(PrioritizedFutureTask.java:113)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
Caused by: java.lang.UnsupportedClassVersionError: com/millennialmedia/intellibot/ide/inspections/cleanup/RobotImportNotUsed : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.lang.ClassLoader.defineClass(ClassLoader.java:471)
at com.intellij.util.lang.UrlClassLoader._defineClass(UrlClassLoader.java:153)
at com.intellij.util.lang.UrlClassLoader.defineClass(UrlClassLoader.java:149)
at com.intellij.util.lang.UrlClassLoader._findClass(UrlClassLoader.java:125)
at com.intellij.ide.plugins.cl.PluginClassLoader.b(PluginClassLoader.java:102)
... 29 more
com.intellij.diagnostic.PluginException: com/millennialmedia/intellibot/ide/inspections/cleanup/RobotImportNotUsed : Unsupported major.minor version 51.0 [Plugin: com.millennialmedia.intellibot]
at com.intellij.ide.plugins.cl.PluginClassLoader.b(PluginClassLoader.java:108)
at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.java:63)
at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:249)
at com.intellij.openapi.extensions.AbstractExtensionPointBean.findClass(AbstractExtensionPointBean.java:42)
at com.intellij.openapi.extensions.AbstractExtensionPointBean.instantiate(AbstractExtensionPointBean.java:62)
at com.intellij.codeInspection.InspectionEP.instantiateTool(InspectionEP.java:141)
at com.intellij.codeInspection.ex.InspectionToolWrapper.getTool(InspectionToolWrapper.java:72)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.getInspectionTools(LocalInspectionsPass.java:743)
at com.intellij.codeInsight.daemon.impl.WholeFileLocalInspectionsPassFactory$3.getInspectionTools(WholeFileLocalInspectionsPassFactory.java:106)
at com.intellij.codeInsight.daemon.impl.LocalInspectionsPass.collectInformationWithProgress(LocalInspectionsPass.java:136)
at com.intellij.codeInsight.daemon.impl.ProgressableTextEditorHighlightingPass.doCollectInformation(ProgressableTextEditorHighlightingPass.java:58)
at com.intellij.codeHighlighting.TextEditorHighlightingPass.collectInformation(TextEditorHighlightingPass.java:62)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1$1.run(PassExecutorService.java:357)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1182)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass$1.run(PassExecutorService.java:348)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:226)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.doRun(PassExecutorService.java:345)
at com.intellij.codeInsight.daemon.impl.PassExecutorService$ScheduledPass.run(PassExecutorService.java:321)
at com.intellij.concurrency.JobLauncherImpl$3.call(JobLauncherImpl.java:145)
at com.intellij.concurrency.JobLauncherImpl$3.call(JobLauncherImpl.java:142)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
at java.util.concurrent.FutureTask.run(FutureTask.java:138)
at com.intellij.concurrency.PrioritizedFutureTask.access$101(PrioritizedFutureTask.java:31)
at com.intellij.concurrency.PrioritizedFutureTask$1.run(PrioritizedFutureTask.java:70)
at com.intellij.concurrency.PrioritizedFutureTask.run(PrioritizedFutureTask.java:113)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:895)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:918)
at java.lang.Thread.run(Thread.java:695)
Caused by: java.lang.UnsupportedClassVersionError: com/millennialmedia/intellibot/ide/inspections/cleanup/RobotImportNotUsed : Unsupported major.minor version 51.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(ClassLoader.java:637)
at java.lang.ClassLoader.defineClass(ClassLoader.java:621)
at java.lang.ClassLoader.defineClass(ClassLoader.java:471)
at com.intellij.util.lang.UrlClassLoader._defineClass(UrlClassLoader.java:153)
at com.intellij.util.lang.UrlClassLoader.defineClass(UrlClassLoader.java:149)
at com.intellij.util.lang.UrlClassLoader._findClass(UrlClassLoader.java:125)
at com.intellij.ide.plugins.cl.PluginClassLoader.b(PluginClassLoader.java:102)
... 29 more
This issue appeared when I updated to Intellibot 0.6.4 (i'm using IntelliJ).
Intellibot finds correctly python resources, but not resources from other robot files.
Example: Resource ../crt_rest_resource.robot
Debug log:
11:59:17 AM Debug: [RobotFileManager][../crt_rest_resource.robot] Attempting global search
11:59:17 AM Debug: [RobotFileManager][../crt_rest_resource.robot] path::../
11:59:17 AM Debug: [RobotFileManager][../crt_rest_resource.robot] file::crt_rest_resource.robot
11:59:17 AM Debug: [RobotFileManager][../crt_rest_resource.robot] matching: [/home/stef/projects/sp12/uat/src/robot/suite/Client_Review_Tool/crt_rest_resource.robot;]
11:59:17 AM Debug: [RobotFileManager][../crt_rest_resource.robot] no acceptable matches
Of course the file exists.
Is it possible that trailing ";" causing the problem ?
The ";" doesn't exist in the filesystem.
${TEMPDIR}
${EXECDIR}
${/}
${:}
${\n}
${SPACE}
${EMPTY}
@{EMPTY}
${True}
${False}
${None}
${null}
${OUTPUT_DIR}
${OUTPUT_FILE}
${REPORT_FILE}
${LOG_FILE}
${DEBUG_FILE}
${PREV_TEST_NAME}
${PREV_TEST_STATUS}
${PREV_TEST_MESSAGE}
Hi,
I have test case example.robot like below:
*** Settings ***
Library some_lib
Test Setup Setup some lib
*** Test Cases ***
Test example
Setup some lib
Jump and help operation is working for "Setup some lib" inside of "Test example" but not for "Test Setup".
Hello,
As you know, RF supports not only *.robot files extension. Could you please add support for *.txt and/or *.html files?
This update is needed because many of test cases are written in *.txt files, so it will be a good enhancement for your plugin.
Thanks
It would be great if auto complete could manage keywords form Libraries such as Selenium2Library, String ,...
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.