diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/util/ConfigUtil.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/util/ConfigUtil.kt index 0f35f2b0..954c79a2 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/util/ConfigUtil.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/config/util/ConfigUtil.kt @@ -13,6 +13,7 @@ inline fun buildBaseConfig( require(config == null) { "The ${config?.configName} config was already parsed" } - logger.info("Building ${config?.configName} config...") - return configBuilder(configFile) + return configBuilder(configFile).also { + logger.info("Building ${it.configName} config...") + } } diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/requests/FileRequests.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/requests/FileRequests.kt index 51af2126..fb7ae425 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/requests/FileRequests.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/requests/FileRequests.kt @@ -13,12 +13,17 @@ import java.io.File object FileRequests { - private val client = HttpClient(CIO) + private val client = HttpClient(CIO) { + install(HttpTimeout) + } private val logger: Logger = Logger.getInstance(FileRequests::class.java) - private const val TIMEOUT: Long = 15_000 // 15 seconds + private const val TIMEOUT: Long = 120_000 // 2 minutes - @Suppress("TooGenericExceptionCaught") + @Suppress("TooGenericExceptionCaught", "ReturnCount") suspend fun sendFile(file: File, logFileType: String): Boolean { + if (!file.exists() || file.length() == 0L) { + return true + } try { val researchId = GlobalPluginStorage.currentResearchId ?: error("ResearchId is undefined") diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt index a2ad68f6..ceb0c3c8 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginPanelFactory.kt @@ -56,6 +56,10 @@ class MainPluginPanelFactory : ToolWindowFactory { mainWindow = project.getService(MainWindowService::class.java).mainWindow trackingService = project.getService(TrackingService::class.java) mainWindow.jComponent.size = JBUI.size(toolWindow.component.width, toolWindow.component.height) + mainWindow.onError { + nextButton.text = UIBundle.message("ui.button.welcome") + setNextAction { agreementAcceptance() } + } agreementAcceptance() val buttonPanel = JBPanel>(FlowLayout()).apply { add(backButton) diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginWindow.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginWindow.kt index 9737c029..b1034a64 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginWindow.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/MainPluginWindow.kt @@ -12,9 +12,9 @@ import org.intellij.lang.annotations.Language import org.jetbrains.concurrency.Promise import org.jetbrains.research.tasktracker.ui.main.panel.models.LinkType import org.jetbrains.research.tasktracker.ui.main.panel.models.Theme -import org.jetbrains.research.tasktracker.ui.main.panel.template.DefaultErrorPage import org.jetbrains.research.tasktracker.ui.main.panel.template.HtmlTemplate import org.jetbrains.research.tasktracker.ui.main.panel.template.MainPageTemplate +import org.jetbrains.research.tasktracker.ui.main.panel.template.ServerErrorPage import javax.swing.JComponent class MainPluginWindow(service: MainWindowService) { @@ -28,9 +28,6 @@ class MainPluginWindow(service: MainWindowService) { init { windowBrowser.jbCefClient.setProperty(JBCefClient.Properties.JS_QUERY_POOL_SIZE, JS_QUERY_POOL_SIZE) - windowBrowser.setErrorPage { errorCode, errorText, failedUrl -> - DefaultErrorPage(errorCode.code.toString(), errorText, failedUrl).htmlContent - } loadHtmlTemplate(currentTemplate) val app = ApplicationManager.getApplication().messageBus app.connect().subscribe( @@ -46,6 +43,13 @@ class MainPluginWindow(service: MainWindowService) { Disposer.register(service, windowBrowser) } + fun onError(action: () -> Unit) { + windowBrowser.setErrorPage { errorCode, errorText, failedUrl -> + action.invoke() + ServerErrorPage().htmlContent + } + } + private fun getJsElementByIdCommand(elementId: String) = "document.getElementById('$elementId')" fun getElementValue(elementId: String): Promise = diff --git a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt index 809da77a..bdfb861f 100644 --- a/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt +++ b/ij-plugin/src/main/kotlin/org/jetbrains/research/tasktracker/ui/main/panel/panelStates/DefaultStates.kt @@ -37,6 +37,7 @@ fun Panel.agreementAcceptance() { project, UIBundle.message("ui.connection.lose") ) + return@runOnSuccess } } GlobalPluginStorage.currentResearchId = IdRequests.getResearchId() diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/agreement_default.yaml b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/agreement_default.yaml index b21936e7..a80da8f9 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/agreement_default.yaml +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/agreement_default.yaml @@ -1,9 +1,2 @@ agreements: - - text: | - Multiline - example - required: false - - text: "Example link" - - text: "Example link in JCEF link" - openLinkInDefaultBrowser: false - - text: "Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s," \ No newline at end of file + - text: I agree to save my name and email in the taskTracker plugin database. \ No newline at end of file diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/info_default.yaml b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/info_default.yaml index 2e904daa..fa8f30c3 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/info_default.yaml +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/info_default.yaml @@ -1,6 +1,6 @@ -pluginName: "Kotlin Introduction" -pluginDescription: "We want to track your progress through the kotlin introduction course in order to collect data on file changes during the course completion. Please, when you are ready, press the next button." -researchId: "Kotlin Introduction" +pluginName: "Kotlin Refactoring course" +pluginDescription: "We want to track your progress through the kotlin refactoring course in order to collect data on file changes during the course completion. Please, when you are ready, press the next button." +researchId: "Kotlin Refactoring" logs: - logPaths: - "edu-assistant/eduAssistant.log" diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/server_error_default.yaml b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/server_error_default.yaml index bd4c25dc..c844879c 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/server_error_default.yaml +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/server_error_default.yaml @@ -2,6 +2,7 @@ defaultMessageTemplate: " No worries, though! You can still send us your tracke Copy this link: %s Open the folder using the link. - Once you're in the folder, please send us all its files. + Once you're in the folder, please send us all files in this folder + to the email daniil.karol@jetbrains.com. We appreciate your assistance!" \ No newline at end of file diff --git a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/task_content_default.yaml b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/task_content_default.yaml index 3d375b92..35ab8991 100644 --- a/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/task_content_default.yaml +++ b/ij-plugin/src/main/resources/org/jetbrains/research/tasktracker/config/task_content_default.yaml @@ -1,60 +1,375 @@ tasks: - - description: "Take the kotlin introduction course, and after that, press the next button." - files: - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: TheFirstDateWithProgramming/task/src/main/kotlin/jetbrains/kotlin/course/first/date - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: WarmUp/task/src/main/kotlin/jetbrains/kotlin/course/warmup - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: LastPush/task/src/main/kotlin/jetbrains/kotlin/course/last/push - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: MastermindAdvanced/task/src/main/kotlin/jetbrains/kotlin/course/mastermind/advanced - sourceSet: SRC - - extension: KOTLIN - filename: RealQuestions - isInternal: false - relativePath: TheFirstDateWithProgramming/task/src/main/kotlin/jetbrains/kotlin/course/first/date - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: AlmostDone/task/src/main/kotlin/jetbrains/kotlin/course/almost/done - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: Hangman/task/src/main/kotlin/jetbrains/kotlin/course/hangman - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: FeedbackSurvey/Survey/src - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: Introduction/task/src/main/kotlin/jetbrains/kotlin/course/welcome - sourceSet: SRC - - extension: KOTLIN - filename: Main - isInternal: false - relativePath: Chat/task/src/main/kotlin/jetbrains/kotlin/course/chat - sourceSet: SRC - - extension: KOTLIN - filename: Util - isInternal: false - relativePath: WarmUp/task/src/main/kotlin/jetbrains/kotlin/course/warmup - sourceSet: SRC - id: main - name: "Kotlin Introduction" +- description: "Take the kotlin refactoring course, and after that, press the next button." + files: + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: ExtractingCode/WhatIsExtractVariableRefactoring/Theory/src/main/kotlin/jetbrains/refactoring/course/extracting + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RenamingCode/NamingRules/Quiz/src/main/kotlin/jetbrains/refactoring/course/renaming + sourceSet: SRC + - extension: KOTLIN + filename: VideoSaver + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: PaymentProcessor + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/processor + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/Introduction/RefactoringAndItsPurposeIntroduction/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RenamingCode/RenameRefactoringInIDE/RenameRefactoringInIDE/src/main/kotlin/jetbrains/refactoring/course/renaming + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: ExtractingCode/WhatIsExtractVariableRefactoring/ExtractMagicConstantsPractice/src/main/kotlin/jetbrains/refactoring/course/extracting + sourceSet: SRC + - extension: KOTLIN + filename: Video + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/video + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/GettingFamiliarWithIDERefactoringFeatures/Theory/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: MovingCode/Introduction/MovingCodeIntroduction/src/main/kotlin/jetbrains/refactoring/course/moving + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/FactoryMethodPatternTheory/Theory/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: ProcessedVideo + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/video + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/WhatIsCodeRefactoring/Quiz/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Animal + isInternal: false + relativePath: MovingCode/WhatArePullUpAndPushDownRefactorings/task/src/main/kotlin/jetbrains/refactoring/course/moving + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: MovingCode/WhatIsMoveMethodRefactoring/task/src/main/kotlin/jetbrains/refactoring/course/moving + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: InliningCode/InlineMethodRefactoring/InlineMethodAndVariablesPractice/src/main/kotlin/jetbrains/refactoring/course/inlining + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/CommonCodeIssuesAndTheirImpactOnCodeQuality/Theory/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Student + isInternal: false + relativePath: RenamingCode/RenameRefactoringInIDE/FixTyposPractice/src/main/kotlin/jetbrains/refactoring/course/renaming + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: InliningCode/InlineMethodRefactoring/Theory/src/main/kotlin/jetbrains/refactoring/course/inlining + sourceSet: SRC + - extension: KOTLIN + filename: EncodedVideo + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/video + sourceSet: SRC + - extension: KOTLIN + filename: PayPalPayment + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/strategy + sourceSet: SRC + - extension: KOTLIN + filename: Dog + isInternal: false + relativePath: MovingCode/WhatArePullUpAndPushDownRefactorings/task/src/main/kotlin/jetbrains/refactoring/course/moving + sourceSet: SRC + - extension: KOTLIN + filename: MiddleMan + isInternal: false + relativePath: InliningCode/MiddleManCodeSmell/task/src/main/kotlin/jetbrains/refactoring/course/inlining + sourceSet: SRC + - extension: KOTLIN + filename: TransportationServiceFactory + isInternal: false + relativePath: RefactoringToDesignPatterns/FactoryMethodPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: Introduction/Introduction/Introduction/src/main/kotlin/jetbrains/refactoring/course/introduction + sourceSet: SRC + - extension: KOTLIN + filename: Car + isInternal: false + relativePath: MovingCode/WhatIsMoveMethodRefactoring/task/src/main/kotlin/jetbrains/refactoring/course/moving/car + sourceSet: SRC + - extension: KOTLIN + filename: Bicycle + isInternal: false + relativePath: RefactoringToDesignPatterns/FactoryMethodPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: InliningCode/WhatIsInlineVariableRefactoring/Theory/src/main/kotlin/jetbrains/refactoring/course/inlining + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RenamingCode/RenameRefactoringInIDE/Quiz/src/main/kotlin/jetbrains/refactoring/course/renaming + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: MovingCode/CohesionAndCoupling/Quiz/src + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: ExtractingCode/Introduction/ExtractingCodeIntroduction/src/main/kotlin/jetbrains/refactoring/course/extracting + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/Introduction/RefactoringToDesignPatternsIntroduction/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Car + isInternal: false + relativePath: RefactoringToDesignPatterns/FactoryMethodPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: CodeStyleAndFormatting/WhatIsFormatting/Theory/src/main/kotlin/jetbrains/refactoring/course/formatting + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: CodeStyleAndFormatting/WhatIsFormatting/Quiz/src/main/kotlin/jetbrains/refactoring/course/formatting + sourceSet: SRC + - extension: KOTLIN + filename: Order + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: University + isInternal: false + relativePath: RenamingCode/RenameRefactoringInIDE/FixTyposPractice/src/main/kotlin/jetbrains/refactoring/course/renaming + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternTheory/Theory/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Transport + isInternal: false + relativePath: RefactoringToDesignPatterns/FactoryMethodPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: InliningCode/WhatIsInlineVariableRefactoring/InlineVariablesPractice/src/main/kotlin/jetbrains/refactoring/course/inlining + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: Conclusion/FeedbackSurvey/FeedbackSurvey/src/main/kotlin/jetbrains/refactoring/course/conclusion + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: CodeStyleAndFormatting/WhatIsFormatting/ReformatTheCodePractice/src/main/kotlin/jetbrains/refactoring/course/formatting + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RenamingCode/Introduction/RenamingCodeIntroduction/src/main/kotlin/jetbrains/refactoring/course/renaming + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: MovingCode/CohesionAndCoupling/Theory/src + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: CodeStyleAndFormatting/CodeSchemasAndEditorConfig/task/src/main/kotlin/jetbrains/refactoring/course/formatting + sourceSet: SRC + - extension: KOTLIN + filename: Driver + isInternal: false + relativePath: MovingCode/WhatIsMoveMethodRefactoring/task/src/main/kotlin/jetbrains/refactoring/course/moving/driver + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: ExtractingCode/WhatIsExtractMethodRefactoring/ExtractDuplicatedCodePractice/src/main/kotlin/jetbrains/refactoring/course/extracting + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/CommonCodeIssuesAndTheirImpactOnCodeQuality/Quiz/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: PaymentStrategy + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/strategy + sourceSet: SRC + - extension: KOTLIN + filename: CreditCardPayment + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/strategy + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RenamingCode/NamingRules/Theory/src/main/kotlin/jetbrains/refactoring/course/renaming + sourceSet: SRC + - extension: NO_EXTENSION + filename: .editorconfig + isInternal: false + relativePath: CodeStyleAndFormatting/CodeSchemasAndEditorConfig/task + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: RefactoringAndItsPurpose/Practice/RefactoringAndItsPurposePractice/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: Introduction/JoinOurDiscordCommunity/JoinOurDiscordCommunity/src/main/kotlin/jetbrains/refactoring/course/introduction + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/DesignPatternsAndTheirRelationshipsWithRefactoring/Theory/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternTheory/Theory/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: Introduction/GettingToKnowYou/GettingToKnowYou/src/main/kotlin/jetbrains/refactoring/course/introduction + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringToDesignPatterns/FactoryMethodPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Task + isInternal: false + relativePath: CodeStyleAndFormatting/WhatIsFormatting/ReformatTheCodeUsingIDEPractice/src/main/kotlin/jetbrains/refactoring/course/formatting + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: Conclusion/Conclusion/Conclusion/src/main/kotlin/jetbrains/refactoring/course/conclusion + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: CodeStyleAndFormatting/Introduction/CodeStyleAndFormattingIntroduction/src/main/kotlin/jetbrains/refactoring/course/formatting + sourceSet: SRC + - extension: KOTLIN + filename: VideoLoader + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: VideoEncoder + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/RefactoringTechniques/Theory/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: VideoProcessor + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: VideoConversionFacade + isInternal: false + relativePath: RefactoringToDesignPatterns/FacadePatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns + sourceSet: SRC + - extension: KOTLIN + filename: Cat + isInternal: false + relativePath: MovingCode/WhatArePullUpAndPushDownRefactorings/task/src/main/kotlin/jetbrains/refactoring/course/moving + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: ExtractingCode/WhatIsExtractMethodRefactoring/Theory/src/main/kotlin/jetbrains/refactoring/course/extracting + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/WhatIsCodeRefactoring/Theory/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: RefactoringAndItsPurpose/RefactoringTechniques/Quiz/src/main/kotlin/jetbrains/refactoring/course/refactoring/purpose + sourceSet: SRC + - extension: KOTLIN + filename: Main + isInternal: false + relativePath: InliningCode/Introduction/InliningCodeIntroduction/src/main/kotlin/jetbrains/refactoring/course/inlining + sourceSet: SRC + - extension: KOTLIN + filename: BitcoinPayment + isInternal: false + relativePath: RefactoringToDesignPatterns/StrategyPatternPractice/task/src/main/kotlin/jetbrains/refactoring/course/patterns/strategy + sourceSet: SRC + id: main + name: "Kotlin refactoring course"