Code Monkey home page Code Monkey logo

codiga / jetbrains-plugin Goto Github PK

View Code? Open in Web Editor NEW
21.0 3.0 10.0 11.72 MB

Jetbrains plugin for Codiga. Coding Assistant and Code Analysis in all JetBrains products. Codiga supports more than 10+ languages, try it for free on https://www.codiga.io

Home Page: https://www.codiga.io/get-codiga/jetbrains/

License: GNU General Public License v3.0

Java 98.66% Kotlin 0.85% Rust 0.09% Python 0.36% HTML 0.05%
intellij complexity-analysis jetbrains python java c cpp javascript intellij-plugin phpstorm

jetbrains-plugin's Introduction

Datadog acquired Codiga. This repository is no longer active.

JetBrains Plugins Download JetBrains Plugins Ratings JetBrains Plugins

Codiga for Jetbrains

Codiga is a static code analyzer on steroids.

Codiga is compatible with all JetBrains products: IntelliJ, AppCode, PHPStorm, DataDrip, GoLand, RubyMine, PyCharm, CLion (and many more).

Code Analysis

Installation

Codiga is available on the Jetbrains marketplace and you can install it directly within any Jetbrains product (IntelliJ, PHPStorm, PYCharm, etc).

Codiga Jetbrains plugin

Static Code Analysis

The static code analysis works for Python in Beta.

With Codiga, you can:

  • Use Code Analysis rules from the Codiga Hub
  • Create your own Code Analysis rules

Getting Started

Automatically

At the root of your project, invoke the following command

npx @codiga/cli@latest ruleset-add

Note: you must have npx installed (available with npm)

Manually

Visit the Codiga Hub and select the rulesets to use for your project.

Then, create a codiga.yml at the root of your project with the list of rulesets you want to use.

Example of codiga.yml for Python:

rulesets:
  - python-security
  - python-best-practices

Code Snippets

Quick Start

Open a file, make a one-line comment to see all suggestions from the Codiga API.

By default, Codiga searches all public snippet. If you want Codiga to also look for your own snippets, add your API keys (see configuration below).

Using shortcuts in the IDE

Install the extension and type . in your IDE to list all available snippets for your current environment (language, file, libraries).

Accept a snippet using either Enter ↩ or Tab ↹. Go through the snippet variables using the Tab key.

Using Code Snippet Shortcut

Snippet Search

Use the Codiga Snippets panel on the right to find code snippets that match your environment.

Syntax highlighting is available for Python and Java snippets.

Code Snippet Search

Semantic Search

Press CTRL + ALT + C (or choose the menu option "Tools" → "Coding Assistant") to launch a request to Codiga and find snippets based on your keywords.

Code Snippet Semantic Search

List all shortcuts

Press CTRL + ALT + S (or choose the menu option "Tools" → "Shortcuts") to list all keywords for your environment.

List all snippet shortcuts

Creating and sharing snippets

Create Code Snippet

  1. Select the code in your editor
  2. Right click on Create Codiga Snippet

Connecting your Codiga Account

You can connect your Codiga account and benefit from all the Codiga features:

  1. use the code snippets and cookbooks you define and subscribe to
  2. use all your code analysis preferences on Codiga

In order to link your Codiga account, you need to add your API token to your preferences. First, go on our application and generate an API token as shown below.

API Token Creation

Then, enter your API token in the Jetbrains plugin configuration, as shown below.

Project Configuration

Once the token is added, click on "Apply" and then "Test API connection".

Support

You can use the current issue tracker or report the issue on our Slack channel.

Implementation Details

Dependencies

License

This project is under the GPL-3. See the LICENSE file for more information.

Contact

To report a bug, submit an issue directly on the GitHub issue tracker.

jetbrains-plugin's People

Contributors

actions-user avatar dastrong-codiga avatar dependabot[bot] avatar gioyik avatar gpitois avatar juli1 avatar mesour avatar picimako avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

jetbrains-plugin's Issues

After installing this plugin, pressing [Esc] to remove a multicarat created inside the editor will not remove it.

Describe the bug
In IntelliJ 2022.3.2, after selecting simple Multi caret instead of Multicaret mode, pressing the [Esc] key to cancel does not work.

To Reproduce
Steps to reproduce the behavior:

  1. set multiple carets with keyboard or mouse.
  2. cancel with the Esc key

Expected behavior
Multiple carets are set with the Esc key, and all but one are removed.

Desktop (please complete the following information):

  • OS: W11 (10.0.22621.1265)
  • Browser: Chrome
  • Version [e.g., 22].

Additional context
When I noticed the error: After disabling this plugin, the Esc key worked fine.

Handle API issues

Describe the bug
We received the following stack trace.

Version: 1.7.22
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:395)
	at com.google.gson.Gson.fromJson(Gson.java:1214)
	at com.google.gson.Gson.fromJson(Gson.java:1124)
	at com.google.gson.Gson.fromJson(Gson.java:1034)
	at com.google.gson.Gson.fromJson(Gson.java:969)
	at io.codiga.plugins.jetbrains.services.RosieImpl.getAnnotations(RosieImpl.java:99)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotator.doAnnotate(RosieAnnotator.java:99)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotator.doAnnotate(RosieAnnotator.java:59)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:218)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:212)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$0(ExternalToolPass.java:190)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.runChangeAware(ExternalToolPass.java:287)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$2(ExternalToolPass.java:190)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:188)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:608)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:683)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:639)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:607)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:60)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:175)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:365)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:343)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.run(ExternalToolPass.java:189)
	at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:332)
	at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:322)
	at com.intellij.util.ui.update.MergingUpdateQueue.lambda$flush$1(MergingUpdateQueue.java:271)
	at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:285)
	at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:240)
	at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:241)
	at com.intellij.util.Alarm$Request.runSafely(Alarm.java:388)
	at com.intellij.util.Alarm$Request.run(Alarm.java:377)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:223)
	at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:241)
	at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:31)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:214)
	at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:212)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:203)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
	at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was STRING at line 1 column 1 path $
	at com.google.gson.stream.JsonReader.beginObject(JsonReader.java:393)
	at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:384)
	... 45 more

Remove project analysis code path

As we rely solely on the real-time feedback path to analyze files, we need to deprecate all the code for the traditional analysis path.

Investigate crash from client

Crash reported from a user. Pined on Code Inspector version 1.0.3

ExternalToolPass:

com.intellij.diagnostic.PluginException: annotator: com.code_inspector.plugins.intellij.annotators.CodeInspectorExternalAnnotator@1d445605 (class com.code_inspector.plugins.intellij.annotators.CodeInspectorExternalAnnotator) [Plugin: com.code-inspector.plugins.intellij-plugin]
        at com.intellij.ide.plugins.PluginManagerCore.createPluginException(PluginManagerCore.java:300)
        at com.intellij.diagnostic.PluginProblemReporterImpl.createPluginExceptionByClass(PluginProblemReporterImpl.java:12)
        at com.intellij.diagnostic.PluginException.createByClass(PluginException.java:81)
        at com.intellij.codeInsight.daemon.impl.ExternalToolPass.process(ExternalToolPass.java:255)
        at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:207)
        at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$0(ExternalToolPass.java:180)
        at com.intellij.codeInsight.daemon.impl.ExternalToolPass.runChangeAware(ExternalToolPass.java:270)
        at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$2(ExternalToolPass.java:180)
        at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:178)
        at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:688)
        at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:634)
        at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:64)
        at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:165)
        at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:254)
        at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.run(ExternalToolPass.java:179)
        at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:333)
        at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:323)
        at com.intellij.util.ui.update.MergingUpdateQueue.lambda$flush$1(MergingUpdateQueue.java:273)
        at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:287)
        at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:242)
        at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:238)
        at com.intellij.util.Alarm$Request.runSafely(Alarm.java:369)
        at com.intellij.util.Alarm$Request.run(Alarm.java:355)
        at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
        at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
        at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:220)
        at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:216)
        at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:27)
        at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:195)
        at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:213)
        at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:184)
        at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
        at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
        at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:668)
        at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:665)
        at java.base/java.security.AccessController.doPrivileged(Native Method)
        at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:665)
        at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: java.lang.ClassCastException: class com.intellij.openapi.project.impl.ProjectExImpl cannot be cast to class java.lang.Comparable (com.intellij.openapi.project.impl.ProjectExImpl is in unnamed module of loader com.intellij.util.lang.PathClassLoader @77cd7a0; java.lang.Comparable is in module java.base of loader 'bootstrap')
        at org.apache.commons.lang3.builder.CompareToBuilder.append(CompareToBuilder.java:426)
        at org.apache.commons.lang3.builder.CompareToBuilder.append(CompareToBuilder.java:377)
        at org.apache.commons.lang3.tuple.Pair.compareTo(Pair.java:133)
        at org.apache.commons.lang3.tuple.Pair.compareTo(Pair.java:41)
        at java.base/java.util.concurrent.ConcurrentSkipListMap.cpr(ConcurrentSkipListMap.java:392)
        at java.base/java.util.concurrent.ConcurrentSkipListMap.doGet(ConcurrentSkipListMap.java:568)
        at java.base/java.util.concurrent.ConcurrentSkipListMap.containsKey(ConcurrentSkipListMap.java:1293)
        at java.base/java.util.concurrent.ConcurrentSkipListSet.contains(ConcurrentSkipListSet.java:224)
        at com.code_inspector.plugins.intellij.ui.NotificationUtils.notififyProjectOnce(NotificationUtils.java:50)
        at com.code_inspector.plugins.intellij.annotators.CodeInspectorExternalAnnotator.getAnnotationFromFileAnalysis(CodeInspectorExternalAnnotator.java:86)
        at com.code_inspector.plugins.intellij.annotators.CodeInspectorExternalAnnotator.doAnnotate(CodeInspectorExternalAnnotator.java:193)
        at com.code_inspector.plugins.intellij.annotators.CodeInspectorExternalAnnotator.doAnnotate(CodeInspectorExternalAnnotator.java:39)
        at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:204)
        ... 33 more

Get rules from the cache to call Rosie

In RosieServiceImpl, we get the rules from a debug file. This was done for debugging purposes and try rosie.

Now that we have the rules cache per project, we should get the list of rules from the cache. In RosieServiceImpl, we should get the list of rules from the cache. Then, take only the rules that apply to the language being edited and use these rules to call Rosie.

The type to send to the server is in RosieRule. Instances of this type are then created from the rules cache.

(⚠️ filter the rules and select the rules that only apply to the language being edited).

Then the request is being sent to the server and issue should be surfaced in the IDE

URL template: https://app.codiga.io/hub/ruleset/<ruleset-name>/<rule-name>

Add tests for Snippet Search

Describe the bug
Recently, a lot of bugs came because of some exceptions we did not catch in the snippet search.
We want to add tests for the following code.

The text should:

  • Open a project
  • Open the snippet search
  • Change files
  • Look for a snippet in the search
  • Insert the snippet
  • Check the snippet is inserted
  • Change file

No exception should be caught in this test.

Duplicated entries

Describe the bug

We are seeing duplicated entries being shown in Code Inspector.

To Reproduce
Steps to reproduce the behavior:

  1. Edit a file
  2. Save
  3. Some issues are reported twice

Expected behavior

One issue with one description should only appear once.

Add JS Support for Rules

Rosie now supports rules for Javascript, so we need to ensure that this plugin supports it as well.

The JavaScript rules should run on these file extensions (.js, .jsx, .ts, .tsx).

When you send the request to Rosie, ensure the language is lowercase: javascript.

When sending the content, send the content of the file and send all rules for JavaScript.

here's a ruleset you can test the integration with: https://app.codiga.io/hub/ruleset/javascript-templates

Issue with multiple violations

Describe the bug

Open the IDE and put the following codiga.yml file

rulesets:
  - python-security
  - python-code-style
  - python-inclusive
  - python-best-practices

Then, put the following file

def set_running_time_sec(db, id, nsec):
    """
    Set the running time of an analysis
    :param db: the database object
    :param id: identifier of the analysis identifier
    :param nsec: the number of seconds it took
    :return: nothing - if you do not have an exception, you are good
    """
    cursor = db.cursor()
    stmt = "UPDATE analysis_results SET running_time_sec='{0}' WHERE id={1}".format(nsec, id)
    cursor.execute(stmt)
    cursor.close()
    db.commit()

Problems

  1. At the line stmt = "UPDATE ... we have two issues. Only one is being reported
  2. We do not distinguish the quick fix/action for each rule: See on Codiga Hub or Remove error if the same. We should make it specify and put Remove error ${errorIdentifier} or See rule ${errorIdentifier} on the Codiga Hub

Add Two Metrics

Two things for this PR.

  1. We want to know when users have applied a Rosie rule fix. To do this, send a mutation against the Codiga API, when the user clicks to apply a fix, as follows:
mutation recordAccess($ruleId: Long, $fingerprint: String) {
  recordAccess(
    accessType: VisualStudio
    actionType: RuleFix
    userFingerprint: $fingerprint
    ruleId: $ruleId
  )
}
  1. We want to know when users have used the create a suggested codiga.yml file. To do this, send a mutation against the Codiga API when the user clicks to create a codiga.yml file as follows:
mutation recordAccess($fingerprint: String) {
  recordAccess(
    accessType: VisualStudio
    actionType: CreateCodigaYaml
    userFingerprint: $fingerprint
  )
}

Implement rules cache for the JetBrains plugin

Describe the bug

We want to implement the rules cache for our new code analysis service. Similar to what we do for caching the snippets, analysis rules should be cached for each file. The specifications are given in this document.

You can try to test your software using the following .codiga file:

rulesets:
  - python-security

Add AST types

Is your feature request related to a problem? Please describe.

This plugin doesn't support all AST types associated with Codiga Custom Rules.

Describe the solution you'd like

Please add the following AST type to the ElementChecked -> Rosie mapper.

From Graphql : For Rosie
VariableDeclaration : variabledeclaration
Any : any

You can use this staging ruleset to test the new AST types:

Describe alternatives you've considered
n/a

Additional context
I'm not sure, but check if the Graphql Schema will need to be updated as well

Switch back password to preferences

Describe the bug

Using password managers raised a lot of issues and the JetBrains security manager does not seem to work.

Solutions:

  1. Find a solution to current issues
  2. Use the preferences to store the API key

Add fix to ignore a rule from rosie

When Rosie surfaces an issue in the code, we should have a quick fix to disable/silence the violation. This is done by adding a comment above with the content codiga-disable.

When this quick fix is applied, it adds the line with # codiga-disable

We should make sure we respect indentation for all developers.

For example, if we have the following code and Rosie reports an error on assert:

def bla():
  assert foo

applying the quick fix should then apply

def bla():
  #codiga-disable
  assert foo

Add tests for the inline completion

Is your feature request related to a problem? Please describe.

Add integration tests for the inline completion (see here. We want to start having tests for the inline completion feature

The test should open a file, write a comment that has some matching snippets and check they are inserted in the code.

Describe the solution you'd like
Add integration tests

Issue with credentials logger

Describe the bug

There is an issue with the code that stores the user credentials. See below.

java.lang.Throwable: find: An invalid record was encountered. (-67701)
	at com.intellij.openapi.diagnostic.Logger.error(Logger.java:184)
	at com.intellij.credentialStore.KeyChainCredentialStore$Companion.checkForError(macOsKeychainLibrary.kt:86)
	at com.intellij.credentialStore.KeyChainCredentialStore$Companion.findGenericPassword(macOsKeychainLibrary.kt:35)
	at com.intellij.credentialStore.KeyChainCredentialStore$Companion.access$findGenericPassword(macOsKeychainLibrary.kt:27)
	at com.intellij.credentialStore.KeyChainCredentialStore.get(macOsKeychainLibrary.kt:94)
	at com.intellij.credentialStore.NativeCredentialStoreWrapper.get(NativeCredentialStoreWrapper.kt:46)
	at com.intellij.ide.passwordSafe.impl.BasePasswordSafe.get(PasswordSafeImpl.kt:90)
	at io.codiga.plugins.jetbrains.settings.application.AppSettingsState.getApiToken(AppSettingsState.java:96)
	at io.codiga.plugins.jetbrains.graphql.CodigaApiImpl.getHeaders(CodigaApiImpl.java:56)
	at io.codiga.plugins.jetbrains.graphql.CodigaApiImpl.getRecipesForClientByShotcurtLastTimestmap(CodigaApiImpl.java:203)
	at io.codiga.plugins.jetbrains.cache.ShortcutCache.updateKey(ShortcutCache.java:73)
	at io.codiga.plugins.jetbrains.cache.ShortcutCache.refreshCacheKey(ShortcutCache.java:127)
	at io.codiga.plugins.jetbrains.cache.CacheRefreshEditorListener.refreshCache(CacheRefreshEditorListener.java:63)
	at io.codiga.plugins.jetbrains.cache.CacheRefreshEditorListener.lambda$runBackgroundProcess$1(CacheRefreshEditorListener.java:50)
	at com.intellij.openapi.project.DumbService.lambda$runReadActionInSmartMode$1(DumbService.java:157)
	at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:941)
	at com.intellij.openapi.application.ReadAction.compute(ReadAction.java:68)
	at com.intellij.openapi.project.DumbService.runReadActionInSmartMode(DumbService.java:150)
	at io.codiga.plugins.jetbrains.cache.CacheRefreshEditorListener.runBackgroundProcess(CacheRefreshEditorListener.java:50)
	at io.codiga.plugins.jetbrains.cache.CacheRefreshEditorListener.lambda$selectionChanged$0(CacheRefreshEditorListener.java:38)
	at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:297)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
	at java.base/java.lang.Thread.run(Thread.java:833)

Issue when starting the plugin

Describe the bug

When the plugin starts, some users experience the following issue.

Version: 1.7.15
com.intellij.diagnostic.PluginException: annotator: io.codiga.plugins.jetbrains.annotators.RosieAnnotator@2be1c818 (class io.codiga.plugins.jetbrains.annotators.RosieAnnotator) [Plugin: io.codiga.plugins.jetbrains-plugin]
	at com.intellij.diagnostic.PluginProblemReporterImpl.createPluginExceptionByClass(PluginProblemReporterImpl.java:23)
	at com.intellij.diagnostic.PluginException.createByClass(PluginException.java:83)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.processError(ExternalToolPass.java:272)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:221)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:212)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$0(ExternalToolPass.java:190)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.runChangeAware(ExternalToolPass.java:287)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$2(ExternalToolPass.java:190)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:188)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:608)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:683)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:639)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:607)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:60)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:175)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:365)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:343)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.run(ExternalToolPass.java:189)
	at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:332)
	at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:322)
	at com.intellij.util.ui.update.MergingUpdateQueue.lambda$flush$1(MergingUpdateQueue.java:271)
	at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:285)
	at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:240)
	at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:241)
	at com.intellij.util.Alarm$Request.runSafely(Alarm.java:388)
	at com.intellij.util.Alarm$Request.run(Alarm.java:377)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:223)
	at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:241)
	at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:31)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:214)
	at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:212)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:203)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
	at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.lang.NoClassDefFoundError: org/apache/commons/io/FilenameUtils
	at io.codiga.plugins.jetbrains.graphql.LanguageUtils.getLanguageFromFilename(LanguageUtils.java:68)
	at io.codiga.plugins.jetbrains.services.RosieImpl.getAnnotations(RosieImpl.java:113)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotator.doAnnotate(RosieAnnotator.java:83)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotator.doAnnotate(RosieAnnotator.java:40)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:218)
	... 37 more
Caused by: java.lang.ClassNotFoundException: org.apache.commons.io.FilenameUtils PluginClassLoader(plugin=PluginDescriptor(name=Codiga - Smart Code Snippets, id=io.codiga.plugins.jetbrains-plugin, descriptorPath=plugin.xml, path=~/Library/Application Support/JetBrains/PyCharmEdu2022.2/plugins/codiga-jetbrains-plugin, version=1.7.15, package=null, isBundled=false), packagePrefix=null, instanceId=17, state=active)
	... 42 more

Passing project for real-time feedback

When sending a file with the real-time feedback pipeline, we need to send the project identifier in the parameters to be able to load the project parameters from code inspector.

Refresh file when a violation is ignored

When the user ignores a violation, we should refresh the file in order to remove the annotation.

Similarly, when we remove an ignored violation in the editor, we should also reload the files to make sure violations are being surfaced again.

Open ruleset from codiga.yml file

Is your feature request related to a problem? Please describe.

When the user is browsing the codiga.yml file, they can open the ruleset in their browser. They need to go to the ruleset and right click.

URL to open:
https://app.codiga.io/hub/ruleset/<RULESET-NAME>

Encoding issue

Describe the bug
The plugin crashes when using different encoding. See the following stack trace.

java.lang.StringIndexOutOfBoundsException: String index out of range: 4
at java.base/java.lang.StringLatin1.charAt(StringLatin1.java:47)
at java.base/java.lang.String.charAt(String.java:693)
at io.codiga.plugins.jetbrains.completion.CodigaCompletionProvider.addCompletions(CodigaCompletionProvider.java:186)
at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:34)
at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:156)
at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:77)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:154)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:146)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
at com.goide.completion.GoAutoImportCompletionContributor.runRemainingContributors(GoAutoImportCompletionContributor.java:148)
at com.goide.completion.GoAutoImportCompletionContributor$1.addCompletions(GoAutoImportCompletionContributor.java:77)
at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:34)
at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:156)
at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:77)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:154)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:146)
at com.intellij.codeInsight.completion.CompletionResultSet.runRemainingContributors(CompletionResultSet.java:142)
at com.intellij.codeInsight.template.impl.LiveTemplateCompletionContributor$1.addCompletions(LiveTemplateCompletionContributor.java:89)
at com.intellij.codeInsight.completion.CompletionProvider.addCompletionVariants(CompletionProvider.java:34)
at com.intellij.codeInsight.completion.CompletionContributor.fillCompletionVariants(CompletionContributor.java:156)
at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:77)
at com.intellij.codeInsight.completion.CompletionService.getVariantsFromContributors(CompletionService.java:60)
at com.intellij.codeInsight.completion.CompletionService.performCompletion(CompletionService.java:133)
at com.intellij.codeInsight.completion.BaseCompletionService.performCompletion(BaseCompletionService.java:41)
at com.intellij.codeInsight.completion.CompletionProgressIndicator.lambda$calculateItems$12(CompletionProgressIndicator.java:863)
at com.intellij.util.indexing.FileBasedIndex.lambda$ignoreDumbMode$0(FileBasedIndex.java:163)
at com.intellij.openapi.util.RecursionManager$1.computePreventingRecursion(RecursionManager.java:114)
at com.intellij.util.indexing.FileBasedIndexEx.ignoreDumbMode(FileBasedIndexEx.java:588)
at com.intellij.util.indexing.FileBasedIndex.ignoreDumbMode(FileBasedIndex.java:162)
at com.intellij.util.indexing.DumbModeAccessType.ignoreDumbMode(DumbModeAccessType.java:43)
at com.intellij.codeInsight.completion.CompletionProgressIndicator.calculateItems(CompletionProgressIndicator.java:859)
at com.intellij.codeInsight.completion.CompletionProgressIndicator.runContributors(CompletionProgressIndicator.java:847)
at com.intellij.codeInsight.completion.CodeCompletionHandlerBase.lambda$startContributorThread$6(CodeCompletionHandlerBase.java:353)
at com.intellij.codeInsight.completion.AsyncCompletion.lambda$tryReadOrCancel$5(CompletionThreading.java:172)
at com.intellij.openapi.application.impl.ApplicationImpl.tryRunReadAction(ApplicationImpl.java:1078)
at com.intellij.codeInsight.completion.AsyncCompletion.tryReadOrCancel(CompletionThreading.java:170)
at com.intellij.codeInsight.completion.CodeCompletionHandlerBase.lambda$startContributorThread$7(CodeCompletionHandlerBase.java:345)
at com.intellij.codeInsight.completion.AsyncCompletion.lambda$startThread$0(CompletionThreading.java:95)
at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:183)
at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:705)
at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:647)
at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:63)
at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:170)
at com.intellij.codeInsight.completion.AsyncCompletion.lambda$startThread$1(CompletionThreading.java:91)
at com.intellij.openapi.application.impl.ApplicationImpl$1.run(ApplicationImpl.java:265)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:668)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:665)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:665)
at java.base/java.lang.Thread.run(Thread.java:829)

Add supported extensions

Describe the bug
We're missing some supported extensions in this plugin.

You can review all the extensions in our VSCode plugin and add the missing ones to this plugin, please.

The missing ones are: .ipynb and .dockerfile

Recipe Insertion problem

java.lang.Throwable: Write-unsafe context! Model changes are allowed from write-safe contexts only. Please ensure you're using invokeLater/invokeAndWait with a correct modality state (not "any"). See TransactionGuard documentation for details.
  current modality=ModalityState.NON_MODAL
	at com.intellij.openapi.diagnostic.Logger.error(Logger.java:182)
	at com.intellij.openapi.application.TransactionGuardImpl.assertWriteActionAllowed(TransactionGuardImpl.java:140)
	at com.intellij.openapi.editor.impl.DocumentImpl.assertWriteAccess(DocumentImpl.java:692)
	at com.intellij.openapi.editor.impl.DocumentImpl.insertString(DocumentImpl.java:541)
	at com.intellij.codeInsight.template.impl.TemplateState.lambda$processAllExpressions$1(TemplateState.java:351)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:947)
	at com.intellij.codeInsight.template.impl.TemplateState.processAllExpressions(TemplateState.java:350)
	at com.intellij.codeInsight.template.impl.TemplateState.start(TemplateState.java:335)
	at com.intellij.codeInsight.template.impl.TemplateState.start(TemplateState.java:299)
	at com.intellij.codeInsight.template.impl.TemplateManagerImpl.lambda$startTemplate$2(TemplateManagerImpl.java:169)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:219)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:174)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:164)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:150)
	at com.intellij.codeInsight.template.impl.TemplateManagerImpl.startTemplate(TemplateManagerImpl.java:172)
	at com.intellij.codeInsight.template.impl.TemplateManagerImpl.runTemplate(TemplateManagerImpl.java:114)
	at io.codiga.plugins.jetbrains.utils.RecipeUtils.lambda$addRecipeInEditor$1(RecipeUtils.java:82)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:84)
	at org.jetbrains.concurrency.AsyncPromise$onSuccess$1.accept(AsyncPromise.kt:16)
	at java.base/java.util.concurrent.CompletableFuture.uniWhenComplete(CompletableFuture.java:859)
	at java.base/java.util.concurrent.CompletableFuture$UniWhenComplete.tryFire(CompletableFuture.java:837)
	at java.base/java.util.concurrent.CompletableFuture.postComplete(CompletableFuture.java:506)
	at java.base/java.util.concurrent.CompletableFuture.complete(CompletableFuture.java:2073)
	at org.jetbrains.concurrency.AsyncPromise.setResult(AsyncPromise.kt:149)
	at com.intellij.ide.impl.DataManagerImpl.lambda$getDataContextFromFocusAsync$5(DataManagerImpl.java:206)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.lambda$doWhenFocusSettlesDown$3(FocusManagerImpl.java:184)
	at com.intellij.util.ui.EdtInvocationManager.invokeLaterIfNeeded(EdtInvocationManager.java:101)
	at com.intellij.ide.IdeEventQueue.ifFocusEventsInTheQueue(IdeEventQueue.java:186)
	at com.intellij.ide.IdeEventQueue.executeWhenAllFocusEventsLeftTheQueue(IdeEventQueue.java:140)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.doWhenFocusSettlesDown(FocusManagerImpl.java:175)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.doWhenFocusSettlesDown(FocusManagerImpl.java:181)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.lambda$doWhenFocusSettlesDown$2(FocusManagerImpl.java:189)
	at com.intellij.openapi.application.TransactionGuardImpl$2.run(TransactionGuardImpl.java:199)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
	at com.intellij.openapi.application.impl.ApplicationImpl.lambda$invokeLater$4(ApplicationImpl.java:348)
	at com.intellij.openapi.application.impl.FlushQueue.doRun(FlushQueue.java:82)
	at com.intellij.openapi.application.impl.FlushQueue.runNextEvent(FlushQueue.java:131)
	at com.intellij.openapi.application.impl.FlushQueue.flushNow(FlushQueue.java:47)
	at com.intellij.openapi.application.impl.FlushQueue$FlushNow.run(FlushQueue.java:187)
	at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:313)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:776)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:746)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:891)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:760)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:447)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:818)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:446)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:492)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Invalid DNS resolver

Describe the bug

Version: 1.8.1
java.net.UnknownHostException: analysis.codiga.io: Temporary failure in name resolution
	at java.base/java.net.Inet6AddressImpl.lookupAllHostAddr(Native Method)
	at java.base/java.net.InetAddress$PlatformNameService.lookupAllHostAddr(InetAddress.java:933)
	at java.base/java.net.InetAddress.getAddressesFromNameService(InetAddress.java:1529)
	at java.base/java.net.InetAddress$NameServiceAddresses.get(InetAddress.java:852)
	at java.base/java.net.InetAddress.getAllByName0(InetAddress.java:1519)
	at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1377)
	at java.base/java.net.InetAddress.getAllByName(InetAddress.java:1305)
	at org.apache.http.impl.conn.SystemDefaultDnsResolver.resolve(SystemDefaultDnsResolver.java:45)
	at org.apache.http.impl.conn.DefaultHttpClientConnectionOperator.connect(DefaultHttpClientConnectionOperator.java:112)
	at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.connect(PoolingHttpClientConnectionManager.java:376)
	at org.apache.http.impl.execchain.MainClientExec.establishRoute(MainClientExec.java:393)
	at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:236)
	at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
	at org.apache.http.impl.execchain.RetryExec.execute(RetryExec.java:89)
	at org.apache.http.impl.execchain.RedirectExec.execute(RedirectExec.java:110)
	at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
	at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:108)
	at io.codiga.plugins.jetbrains.rosie.RosieApiImpl.getAnnotations(RosieApiImpl.java:96)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotator.doAnnotate(RosieAnnotator.java:99)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotator.doAnnotate(RosieAnnotator.java:59)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:220)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.doAnnotate(ExternalToolPass.java:214)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$0(ExternalToolPass.java:192)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass.runChangeAware(ExternalToolPass.java:289)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.lambda$run$2(ExternalToolPass.java:192)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$runProcess$2(CoreProgressManager.java:188)
	at com.intellij.openapi.progress.impl.CoreProgressManager.lambda$executeProcessUnderProgress$12(CoreProgressManager.java:608)
	at com.intellij.openapi.progress.impl.CoreProgressManager.registerIndicatorAndRun(CoreProgressManager.java:683)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computeUnderProgress(CoreProgressManager.java:639)
	at com.intellij.openapi.progress.impl.CoreProgressManager.executeProcessUnderProgress(CoreProgressManager.java:607)
	at com.intellij.openapi.progress.impl.ProgressManagerImpl.executeProcessUnderProgress(ProgressManagerImpl.java:60)
	at com.intellij.openapi.progress.impl.CoreProgressManager.runProcess(CoreProgressManager.java:175)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:365)
	at com.intellij.openapi.progress.util.BackgroundTaskUtil.runUnderDisposeAwareIndicator(BackgroundTaskUtil.java:343)
	at com.intellij.codeInsight.daemon.impl.ExternalToolPass$1.run(ExternalToolPass.java:191)
	at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:332)
	at com.intellij.util.ui.update.MergingUpdateQueue.execute(MergingUpdateQueue.java:322)
	at com.intellij.util.ui.update.MergingUpdateQueue.lambda$flush$1(MergingUpdateQueue.java:271)
	at com.intellij.util.ui.update.MergingUpdateQueue.flush(MergingUpdateQueue.java:285)
	at com.intellij.util.ui.update.MergingUpdateQueue.run(MergingUpdateQueue.java:240)
	at com.intellij.util.concurrency.QueueProcessor.runSafely(QueueProcessor.java:241)
	at com.intellij.util.Alarm$Request.runSafely(Alarm.java:388)
	at com.intellij.util.Alarm$Request.run(Alarm.java:377)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at com.intellij.util.concurrency.SchedulingWrapper$MyScheduledFutureTask.run(SchedulingWrapper.java:223)
	at com.intellij.util.concurrency.BoundedTaskExecutor.doRun(BoundedTaskExecutor.java:241)
	at com.intellij.util.concurrency.BoundedTaskExecutor.access$200(BoundedTaskExecutor.java:31)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.execute(BoundedTaskExecutor.java:214)
	at com.intellij.util.ConcurrencyUtil.runUnderThreadName(ConcurrencyUtil.java:212)
	at com.intellij.util.concurrency.BoundedTaskExecutor$1.run(BoundedTaskExecutor.java:203)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:702)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1$1.run(Executors.java:699)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.util.concurrent.Executors$PrivilegedThreadFactory$1.run(Executors.java:699)
	at java.base/java.lang.Thread.run(Thread.java:833)

Correctly check bounds when inserting text

Describe the bug

When we insert, update or remove text with Rosie, we should check the boundaries within the IDE to make sure we are not attempting to write/read/remove outside of the IDE boundaries.

Version: 1.7.22
java.lang.StringIndexOutOfBoundsException: begin 82, end 152, length 71
	at java.base/java.lang.String.checkBoundsBeginEnd(String.java:4604)
	at java.base/java.lang.String.substring(String.java:2707)
	at java.base/java.lang.String.subSequence(String.java:2745)
	at com.intellij.psi.impl.source.tree.injected.DocumentWindowImpl.prepareReplaceString(DocumentWindowImpl.java:317)
	at com.intellij.psi.impl.source.tree.injected.DocumentWindowImpl.replaceString(DocumentWindowImpl.java:366)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotationFix.lambda$invoke$0(RosieAnnotationFix.java:47)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$1(WriteCommandAction.java:150)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1023)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.lambda$doRunWriteCommandAction$2(WriteCommandAction.java:148)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:210)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:184)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.doRunWriteCommandAction(WriteCommandAction.java:157)
	at com.intellij.openapi.command.WriteCommandAction$BuilderImpl.run(WriteCommandAction.java:124)
	at io.codiga.plugins.jetbrains.annotators.RosieAnnotationFix.invoke(RosieAnnotationFix.java:38)
	at com.intellij.codeInsight.intention.impl.IntentionActionWithTextCaching$MyIntentionAction.lambda$invoke$0(IntentionActionWithTextCaching.java:224)
	at com.intellij.util.SlowOperations.allowSlowOperations(SlowOperations.java:149)
	at com.intellij.codeInsight.intention.impl.IntentionActionWithTextCaching$MyIntentionAction.invoke(IntentionActionWithTextCaching.java:224)
	at com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler.lambda$invokeIntention$5(ShowIntentionActionsHandler.java:257)
	at com.intellij.openapi.application.WriteAction.lambda$run$1(WriteAction.java:86)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteActionWithClass(ApplicationImpl.java:1011)
	at com.intellij.openapi.application.impl.ApplicationImpl.runWriteAction(ApplicationImpl.java:1037)
	at com.intellij.openapi.application.WriteAction.run(WriteAction.java:85)
	at com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler.invokeIntention(ShowIntentionActionsHandler.java:257)
	at com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler.lambda$chooseActionAndInvoke$4(ShowIntentionActionsHandler.java:233)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:219)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:174)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:164)
	at com.intellij.openapi.command.impl.CoreCommandProcessor.executeCommand(CoreCommandProcessor.java:150)
	at com.intellij.codeInsight.intention.impl.ShowIntentionActionsHandler.chooseActionAndInvoke(ShowIntentionActionsHandler.java:232)
	at com.intellij.codeInsight.intention.impl.IntentionListStep.chooseActionAndInvoke(IntentionListStep.java:135)
	at com.intellij.codeInsight.intention.impl.IntentionListStep.lambda$applyAction$3(IntentionListStep.java:127)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:105)
	at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
	at com.intellij.ui.popup.AbstractPopup.lambda$dispose$18(AbstractPopup.java:1543)
	at com.intellij.util.ui.EdtInvocationManager.invokeLaterIfNeeded(EdtInvocationManager.java:113)
	at com.intellij.ide.IdeEventQueue.ifFocusEventsInTheQueue(IdeEventQueue.java:179)
	at com.intellij.ide.IdeEventQueue.executeWhenAllFocusEventsLeftTheQueue(IdeEventQueue.java:132)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.doWhenFocusSettlesDown(FocusManagerImpl.java:163)
	at com.intellij.ui.popup.AbstractPopup.dispose(AbstractPopup.java:1540)
	at com.intellij.ui.popup.WizardPopup.dispose(WizardPopup.java:162)
	at com.intellij.ui.popup.list.ListPopupImpl.dispose(ListPopupImpl.java:326)
	at com.intellij.openapi.util.ObjectTree.runWithTrace(ObjectTree.java:126)
	at com.intellij.openapi.util.ObjectTree.executeAll(ObjectTree.java:158)
	at com.intellij.openapi.util.Disposer.dispose(Disposer.java:217)
	at com.intellij.openapi.util.Disposer.dispose(Disposer.java:205)
	at com.intellij.ui.popup.WizardPopup.disposeAllParents(WizardPopup.java:266)
	at com.intellij.ui.popup.list.ListPopupImpl.handleNextStep(ListPopupImpl.java:434)
	at com.intellij.ui.popup.list.ListPopupImpl._handleSelect(ListPopupImpl.java:406)
	at com.intellij.ui.popup.list.ListPopupImpl.handleSelect(ListPopupImpl.java:361)
	at com.intellij.ui.popup.list.ListPopupImpl$MyMouseListener.mouseReleased(ListPopupImpl.java:618)
	at java.desktop/java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:298)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6648)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3392)
	at com.intellij.ui.popup.list.ListPopupImpl$MyList.processMouseEvent(ListPopupImpl.java:694)
	at java.desktop/java.awt.Component.processEvent(Component.java:6413)
	at java.desktop/java.awt.Container.processEvent(Container.java:2266)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5022)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2324)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4854)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4948)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4575)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4516)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2310)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2802)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4854)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:781)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:730)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:724)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:97)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:754)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:752)
	at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:751)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:898)
	at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:820)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:743)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:439)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:791)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:438)
	at com.intellij.openapi.application.TransactionGuardImpl.performActivity(TransactionGuardImpl.java:113)
	at com.intellij.ide.IdeEventQueue.performActivity(IdeEventQueue.java:604)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$8(IdeEventQueue.java:436)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:881)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:484)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:207)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:92)

Linting codiga.yml file for empty or non-existing ruleset

Is your feature request related to a problem? Please describe.

Linting and improvement of the the codiga.yml file

We want to lint the codiga.yml file:

  1. If the file does not contains the rulesets key, we should show a warning/error
  2. If a ruleset exists but is empty (e.g. has no rule), we should emit a warning (ruleset <ruleset-name> has no rule)
  3. If a ruleset does not exists, we should show a warning (ruleset <ruleset-name> does not exists or you do not have access to it)

To see if a ruleset exists, use getRulesetsForClient. Pass a list with only one ruleset:

  • if nothing is returned, the ruleset does not exists or the user does not have access
  • if the ruleset is returned but empty, there is no rule

Issue inserting snippet

Describe the bug

When inserting a snippet in an empty file, it works. But when we insert in a code block it does not.

Example of code in webstorm:

const markup = `
<div class="spinner">
<svg>
<use href="*${icons}*#icon-loader"></use>
</svg>
</div>
`;

It seems to not work when inserting between the <use> brackets.

Suggestions of rulesets to use

Is your feature request related to a problem? Please describe.

When a user opens a project that contains Python code, we want to suggest creating a codiga.yml file with some default content to enable code analysis on their Python project.

This way, the user can have a set of default rules for their Python projects.

Describe the solution you'd like

When the user opens a project, if there is no codiga.yml at the project's root, the plugin asks the user if they want to add a new codiga.yml file. If the user accepts, we create a codiga.yml file with the following content:

rulesets:
  - python-security
  - python-best-practices
  - python-code-style

Text of the popup: `Check for security, code style in your Python code with Codiga".

  • Option 1: Create a codiga.yml file to check code
  • Option 2: Never remind me for this project

In the popup, there are two options:

  • Create the file
  • Never remind me for this project

If the user decides never to be reminded of this project, we will never show this popup/dialog. Otherwise, if the user closes the dialog, we will remind them the next time they open the project.

We can show the popup in two different places:

  • When they open the project (needs to detect that the project uses Python)
  • When they open a file in the project (and the dialog opens only once for this project)

Note that the popup nevers shows up if there is a codiga.yml file.

Further linting on codiga.yml

Is your feature request related to a problem? Please describe.

Lint the ruleset and make sure they are sluggified named with lowercase alphanumeric characters and - in between.

  • Valid names: my-ruleset, awesome-ruleset, i-love-codiga
  • Invalid names: -my_ruleset, AwEsom3Stuff!`.

Add User-Agent header

Is your feature request related to a problem? Please describe.
No, we would like to know what platforms our users are making requests from to better understand how users are interacting with our products.

Describe the solution you'd like
Please add a header to requests made from this extension.

headers: {
  ...otherHeaders,
  "User-Agent": "IntelliJ"
}

Describe alternatives you've considered
N/A

Additional context
N/A

Fix rule names when calling Rosie

Describe the bug
We pass number to Rosie when execute the rules. When we pass the rule name, it should be ruleset/rulename. Rosie is going to make some checks if these rules exists and such calls will be banned in the future.

Support ignore section of the codiga.yml file

Is your feature request related to a problem? Please describe.

Some rules should be ignored, either for the entire project or specific path.

Describe the solution you'd like
Make sure that the ignore section of the codiga.yml file is correctly used and violations being filtered according to the file specification.

Additional context
Please see the documentation of the codiga.yml syntax here.

APEX code analysis should work with Illuminated Cloud

Describe the bug

When we use Illuminated cloud, the real-time feedback is not being triggered.

To Reproduce
Steps to reproduce the behavior:

  1. Start IntelliJ
  2. Open Apex code: https://github.com/SalesforceSFDC/Apex
  3. Feedback from Code Inspector is showing up
  4. Install Illuminated Cloud plugin in IntelliJ
  5. No external analysis is being shown

Expected behavior

We should get the Code Inspector feedback, even if Illuminated Cloud is installed.

Additional context

See why the analysis is not triggered with Illuminated Cloud.

NullPointer exception when creating recipes

Stack Trace

java.lang.NullPointerException
	at io.codiga.plugins.jetbrains.actions.create_recipe.AssistantCreateRecipeAction.actionPerformed(AssistantCreateRecipeAction.java:69)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.lambda$performActionDumbAwareWithCallbacks$4(ActionUtil.java:239)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performDumbAwareWithCallbacks(ActionUtil.java:260)
	at com.intellij.openapi.actionSystem.ex.ActionUtil.performActionDumbAwareWithCallbacks(ActionUtil.java:239)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.lambda$performAction$0(ActionMenuItem.java:277)
	at com.intellij.openapi.wm.impl.FocusManagerImpl.runOnOwnContext(FocusManagerImpl.java:236)
	at com.intellij.openapi.wm.impl.IdeFocusManagerImpl.runOnOwnContext(IdeFocusManagerImpl.java:67)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.performAction(ActionMenuItem.java:269)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem$ActionTransmitter.actionPerformed(ActionMenuItem.java:284)
	at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.lambda$fireActionPerformed$2(ActionMenuItem.java:111)
	at com.intellij.openapi.application.TransactionGuardImpl.performUserActivity(TransactionGuardImpl.java:94)
	at com.intellij.openapi.actionSystem.impl.ActionMenuItem.fireActionPerformed(ActionMenuItem.java:111)
	at com.intellij.ui.plaf.beg.BegMenuItemUI.doClick(BegMenuItemUI.java:541)
	at com.intellij.ui.plaf.beg.BegMenuItemUI$MyMouseInputHandler.mouseReleased(BegMenuItemUI.java:571)
	at java.desktop/java.awt.Component.processMouseEvent(Component.java:6654)
	at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3345)
	at java.desktop/java.awt.Component.processEvent(Component.java:6419)
	at java.desktop/java.awt.Container.processEvent(Container.java:2263)
	at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:5029)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2321)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4861)
	at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4918)
	at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4547)
	at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4488)
	at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2307)
	at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2790)
	at java.desktop/java.awt.Component.dispatchEvent(Component.java:4861)
	at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:778)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:727)
	at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:721)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:95)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:751)
	at java.desktop/java.awt.EventQueue$5.run(EventQueue.java:749)
	at java.base/java.security.AccessController.doPrivileged(Native Method)
	at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:85)
	at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:748)
	at com.intellij.ide.IdeEventQueue.defaultDispatchEvent(IdeEventQueue.java:891)
	at com.intellij.ide.IdeEventQueue.dispatchMouseEvent(IdeEventQueue.java:820)
	at com.intellij.ide.IdeEventQueue._dispatchEvent(IdeEventQueue.java:757)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$6(IdeEventQueue.java:447)
	at com.intellij.openapi.progress.impl.CoreProgressManager.computePrioritized(CoreProgressManager.java:818)
	at com.intellij.ide.IdeEventQueue.lambda$dispatchEvent$7(IdeEventQueue.java:446)
	at com.intellij.openapi.application.impl.ApplicationImpl.runIntendedWriteActionOnCurrentThread(ApplicationImpl.java:805)
	at com.intellij.ide.IdeEventQueue.dispatchEvent(IdeEventQueue.java:498)
	at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
	at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
	at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Add color syntaxing in the snippet search view

Is your feature request related to a problem? Please describe.

In the Snippet Search feature, the code is shown without any syntax highlighting. The idea would be to enable syntax highlighting for all the snippets being shown.

Uploading Screen Shot 2022-09-15 at 9.44.20 AM.png…

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.