ERROR - StartScraper - start: 20: ExtensionScraper:start: 50: ExtensionScraper:scrapeCourse: 91: ExtensionScraper:scrapeTopic: 152: QuizUtility:downloadQuizFiles: 25: QuizUtility:downloadQuiz: 69: 'explanation'

Hi, I got the error as title after scraper the this course. It only downloads the first 3 chapters then stops the browser. What should I do ? Thank you.

@HelloWorldDC please attach the log file

@anilabhadatta hi, the log file has only 1 line like the title, I will try download again.

@anilabhadatta this is log file I got it
 2023-11-08 01:51:14,661 - DEBUG - HomeScreen - browseSaveDirectory completed
                              saveDirectoryPath: C:/Users/ThanhDC/educative.io_scraper/EducativeDownloaded

 2023-11-08 01:51:34,777 - INFO - HomeScreen -   Starting Chrome Driver...
                                Path:  C:\Users\ThanhDC\educative.io_scraper\src\ChromeDrivers\win\chromedriver-win64/chromedriver.exe

 2023-11-08 01:51:34,779 - DEBUG - HomeScreen - startChromeDriver completed
 2023-11-08 01:51:41,257 - DEBUG - HomeScreen - loginAccount called
 2023-11-08 01:51:41,282 - DEBUG - HomeScreen - loginAccount completed
 2023-11-08 01:51:41,756 - INFO - LoginAccount - LoginAccount initiated...
                            Login your account in the browser...
                            To Terminate, Click on Logout Button

 2023-11-08 01:51:41,756 - INFO - BrowserUtility - Loading Browser...
 2023-11-08 01:51:44,201 - INFO - BrowserUtility - Browser Initiated
 2023-11-08 01:51:54,945 - DEBUG - HomeScreen - terminateProcess called
 2023-11-08 01:51:54,945 - INFO - HomeScreen - Terminating Process...
 2023-11-08 01:51:54,959 - DEBUG - BrowserUtility - getCurrentUrlViaWebsocket called
 2023-11-08 01:51:54,959 - DEBUG - BrowserUtility - getDevToolsUrl called
 2023-11-08 01:51:54,960 - DEBUG - BrowserUtility - getDevToolsUrl completed with devToolUrl: ws://<IP_ADDRESS>:50183/devtools/browser/1f6dcbf7-9de1-4e09-af76-8c35d33e82c6
 2023-11-08 01:51:54,966 - INFO - BrowserUtility - Current Url: https://www.educative.io/learn/home
 2023-11-08 01:51:54,967 - DEBUG - BrowserUtility - shutdownChromeViaWebsocket called
 2023-11-08 01:51:54,967 - DEBUG - BrowserUtility - getDevToolsUrl called
 2023-11-08 01:51:54,967 - DEBUG - BrowserUtility - getDevToolsUrl completed with devToolUrl: ws://<IP_ADDRESS>:50183/devtools/browser/1f6dcbf7-9de1-4e09-af76-8c35d33e82c6
 2023-11-08 01:51:55,021 - INFO - BrowserUtility - Browser closed via websocket
 2023-11-08 01:51:55,025 - DEBUG - HomeScreen - terminateProcess completed
 2023-11-08 01:51:58,070 - DEBUG - HomeScreen - startScraper called
 2023-11-08 01:51:58,072 - DEBUG - HomeScreen - startScraper completed
 2023-11-08 01:51:58,504 - INFO - StartScraper - StartScraper Initiated...
                            To Terminate, Click on Stop ScraperType Button

 2023-11-08 01:51:58,510 - INFO - ExtensionScraper - ExtensionScraper initiated...
 2023-11-08 01:51:58,511 - INFO - ExtensionScraper - Started Scraping from Text File URL: https://www.educative.io/courses/intermediate-javascript/getting-started?showContent=true
 2023-11-08 01:51:58,511 - INFO - BrowserUtility - Loading Browser...
 2023-11-08 01:51:59,391 - INFO - BrowserUtility - Browser Initiated
 2023-11-08 01:52:02,192 - INFO - ApiUtility - Course Type Selector: a[href*='/courses/']
 2023-11-08 01:52:02,232 - INFO - ApiUtility - Getting Next Data
 2023-11-08 01:52:02,242 - INFO - ApiUtility - Getting Course Topic URLs List from URL: https://www.educative.io/courses/intermediate-javascript/getting-started?showContent=true
 2023-11-08 01:52:03,555 - DEBUG - SeleniumBasicUtility - Expanding all sections function
 2023-11-08 01:52:03,555 - INFO - SeleniumBasicUtility - Expanding all sections
 2023-11-08 01:52:03,556 - INFO - OSUtility - Sleeping for 2 seconds
 2023-11-08 01:52:05,565 - INFO - SeleniumBasicUtility - Expanding all sections
 2023-11-08 01:52:05,565 - INFO - OSUtility - Sleeping for 2 seconds
 2023-11-08 01:52:07,573 - INFO - SeleniumBasicUtility - Expanding all sections
 2023-11-08 01:52:07,574 - INFO - OSUtility - Sleeping for 2 seconds
 2023-11-08 01:52:09,580 - INFO - ApiUtility - Course URL Selector: //a[contains(@href, 'courses/intermediate-javascript/')]
 2023-11-08 01:52:09,586 - INFO - LoginAccount - Checking if logged in...
 2023-11-08 01:52:09,590 - INFO - ApiUtility - Getting Course Collections JSON from URL: https://educative.io/api/collection/10370001/5165314803236864?work_type=collection
 2023-11-08 01:52:09,590 - INFO - ApiUtility - Executing JS to get JSON from URL
 2023-11-08 01:52:10,257 - DEBUG - ExtensionScraper - Course Topic URLs: ['https://www.educative.io/courses/intermediate-javascript/getting-started?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/important-features-of-a-menu?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/basic-html-code?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/styling-conventions?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/submenu?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/styling-your-submenu?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/getting-data-from-the-server?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/implementing-the-behavior-of-dropdown-menu?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/getting-varied-responses-from-server?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/extending-the-submenu-functionality?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/understanding-the-autocomplete-search-functionality?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/examining-googles-autocomplete-functionality?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/setting-up-a-framework-to-build-googles-autocomplete?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/building-a-server-endpoint-for-autocomplete?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/displaying-autocomplete-suggestions?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/formatting-the-autocomplete-suggestions?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/styling-an-autocomplete-enabled-engine?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/further-styling-an-autocomplete-enabled-engine?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/final-styling-touches-to-the-autocomplete-enabled-engine?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/what-is-a-tooltip?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/examining-the-important-features?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/how-to-determine-the-middle-of-cursor?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/alternative-approach-to-find-the-middle?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/lets-start-building-the-tooltip?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/perfecting-the-position?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/bug-1-selectable-tooltip?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/bug-2-tooltip-displays-on-clicking?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/bug-3-multiline-highlights?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/adding-styling?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/adding-animations?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/what-is-an-autovalidating-form?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/rules-for-user-input-categories?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/building-the-form?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/displaying-errors-when-validation-fails?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/test-driven-development?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/unit-tests?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/integration-tests?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/acceptance-tests?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/unique-errors-for-each-field?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/introduction-to-regular-expressions?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/validation-of-user-input-with-regex?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/displaying-actual-errors?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/styling-the-form?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/guide-to-implementing-rules-for-password?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/restrictions-and-month-selector?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/wrapping-up?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/what-is-an-infinite-list?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/building-an-html-template-for-infinite-lists?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/styling-list-items?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/server-client-communication?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/generating-tweets-from-server?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/client-side-hydration?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/adding-a-loading-element?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/autopopulation?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/ship-it?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/resourcing?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/frameworks-and-libraries?showContent=true', 'https://www.educative.io/courses/intermediate-javascript/project-structure?showContent=true']
 2023-11-08 01:52:10,258 - DEBUG - ExtensionScraper - Course Collections JSON: {'courseTitle': 'Intermediate JavaScript: Building Frontend Components', 'topicApiUrlList': ['https://educative.io/api/collection/10370001/5165314803236864/page/5645478960037888?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5639274879778816?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5676830073815040?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5725643752865792?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5733935958982656?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5700735861784576?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5673385510043648?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5718998062727168?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5689792285114368?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5754903989321728?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5643440998055936?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5709068098338816?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5697982787747840?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5764640680181760?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5631943370604544?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5704837555552256?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5665117697998848?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5121099960418304?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5758251144577024?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5674248798470144?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5752142325350400?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5111298845048832?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5659645909663744?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5732694713434112?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5073520312713216?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5735735550279680?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/6136226336735232?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/6444131803987968?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5655608640405504?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/6650089310257152?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5663741160980480?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5730192894984192?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5148362265329664?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/6274262172172288?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5630721452408832?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/6344768943554560?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5676663945822208?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5707274949492736?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5667168544882688?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5748475799011328?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5740423507083264?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5647308616105984?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5725202142986240?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5686306919153664?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5758531089203200?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5676325415157760?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5077521074749440?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5748755743637504?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5656774724026368?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5734977488551936?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5694639155707904?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5204544732528640?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5710096743006208?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5694771527942144?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5081622768517120?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5660850647990272?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5726683906703360?work_type=collection', 'https://educative.io/api/collection/10370001/5165314803236864/page/5183361953824768?work_type=collection'], 'topicNameList': ['Getting Started', 'Important Features of a Menu', 'Basic HTML Code', 'Styling Conventions', 'Submenu', 'Styling your Submenu', 'Getting Data from the Server', 'Implementing the Behavior of Dropdown Menu', 'Getting Varied Responses from Server', 'Extending the Submenu Functionality', 'Understanding the Autocomplete Search Functionality', "Examining Google's Autocomplete Functionality", "Setting up a Framework to build Google's Autocomplete", 'Building a Server Endpoint for Autocomplete', 'Displaying Autocomplete Suggestions', 'Formatting the Autocomplete Suggestions', 'Styling an Autocomplete Enabled Engine', 'Further Styling an Autocomplete Enabled Engine', 'Final Styling Touches to the Autocomplete Enabled Engine', 'What is a Tooltip?', 'Examining the Important Features', 'How to Determine the Middle of Cursor?', 'Alternative Approach to find the Middle', "Let's Start Building the Tooltip", 'Perfecting the Position', 'Bug 1: Selectable Tooltip', 'Bug 2: Tooltip Displays on Clicking', 'Bug 3: Multiline Highlights', 'Adding Styling', 'Adding Animations', 'What is an Autovalidating form?', 'Rules for User Input Categories', 'Building the Form', 'Displaying Errors when Validation Fails', 'Test Driven Development', 'Unit Tests', 'Integration Tests', 'Acceptance Tests', 'Unique Errors for Each Field', 'Introduction to Regular Expressions', 'Validation of User Input with Regex', 'Displaying Actual Errors', 'Styling the Form', 'Guide to implementing Rules for Password', 'Restrictions and Month Selector', 'Wrapping Up', 'What is an Infinite List?', 'Building an HTML Template for Infinite Lists', 'Styling List items', 'Server Client Communication', 'Generating Tweets from Server', 'Client Side Hydration', "Adding a 'Loading' Element", 'Autopopulation', 'Ship it!', 'Resourcing', 'Frameworks and Libraries', 'Project Structure']}
 2023-11-08 01:52:10,261 - INFO - ExtensionScraper - API Urls: 58 == 58 :Topic Urls
 2023-11-08 01:52:10,262 - INFO - ExtensionScraper - -----------------------------------------------------------
                Scraping Topic: 0-getting started: https://www.educative.io/courses/intermediate-javascript/getting-started?showContent=true

 2023-11-08 01:52:10,262 - INFO - LoginAccount - Checking if logged in...
 2023-11-08 01:52:10,266 - INFO - ApiUtility - Getting Course API Content JSON from URL: https://educative.io/api/collection/10370001/5165314803236864/page/5645478960037888?work_type=collection
 2023-11-08 01:52:10,266 - INFO - ApiUtility - Executing JS to get JSON from URL
 2023-11-08 01:52:10,318 - INFO - ApiUtility - Successfully fetched JSON API data
 2023-11-08 01:52:10,318 - INFO - OSUtility - Sleeping for 10 seconds
 2023-11-08 01:52:21,124 - INFO - SeleniumBasicUtility - Loading page and checking if something went wrong
 2023-11-08 01:52:21,124 - INFO - OSUtility - Sleeping for 10 seconds
 2023-11-08 01:52:31,169 - INFO - SeleniumBasicUtility - Waiting for webdriver to load topic page
 2023-11-08 01:52:31,198 - INFO - SeleniumBasicUtility - Adding name attribute in next/back button
 2023-11-08 01:52:31,202 - INFO - BrowserUtility - Scrolling Page
 2023-11-08 01:52:31,891 - INFO - OSUtility - Sleeping for 2 seconds
 2023-11-08 01:52:33,891 - INFO - RemoveUtility - Removing blur with CSS
 2023-11-08 01:52:33,904 - INFO - RemoveUtility - Removing mark-as-completed/completed tick mark
 2023-11-08 01:52:33,949 - INFO - RemoveUtility - Removing unwanted elements
 2023-11-08 01:52:33,955 - INFO - ShowUtility - Showing single markdown quiz solution
 2023-11-08 01:52:33,959 - INFO - ShowUtility - No single markdown quiz solution found
 2023-11-08 01:52:33,960 - INFO - ShowUtility - Showing code solutions
 2023-11-08 01:52:33,964 - INFO - ShowUtility - No code solution found
 2023-11-08 01:52:33,964 - INFO - ShowUtility - Showing hints
 2023-11-08 01:52:33,968 - INFO - ShowUtility - No hints found
 2023-11-08 01:52:33,968 - INFO - ShowUtility - Showing slides
 2023-11-08 01:52:33,972 - INFO - ShowUtility - No slides found
 2023-11-08 01:52:33,972 - INFO - SingleFileUtility - Fixing all object tags
 2023-11-08 01:52:33,977 - INFO - SingleFileUtility - No object tag found
 2023-11-08 01:52:33,977 - INFO - SingleFileUtility - Injecting important scripts
 2023-11-08 01:52:33,984 - INFO - OSUtility - Sleeping for 5 seconds
 2023-11-08 01:52:38,993 - INFO - OSUtility - Sleeping for 5 seconds
 2023-11-08 01:52:43,994 - INFO - SingleFileUtility - Making code selectable
 2023-11-08 01:52:43,999 - INFO - SingleFileUtility - No code found
 2023-11-08 01:52:43,999 - INFO - SingleFileUtility - getSingleFileHtml: Getting SingleFile Html...
 2023-11-08 01:52:45,257 - INFO - ExtensionScraper - Topic File Successfully Created
 2023-11-08 01:52:45,258 - DEBUG - ExtensionScraper - Course API Content JSON: [{'content': {'comp_id': 'f02f25f9-5133-4966-8905-93adc22f2438', 'cursorPosition': {'ch': 0, 'line': 18, 'sticky': None}, 'mdHtml': '<p>Hi, welcome to <em>Intermediate Javascript: Building Frontend Components</em>. The purpose of this course is to teach you how to apply the introductory HTML, CSS, and JavaScript that you’ve learned in order to build real-world components. The course will walk you through the process of building several complex components that you’ve likely encountered on popular websites. You’ll learn how to approach common frontend challenges, what questions to ask, how to design solutions once you’ve thought of them, how to debug and work with mistakes, and more. <em>The ultimate goal is to empower you so that you can point to any part of a website and say, “I can build that.”</em></p>\n<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow></mrow><annotation encoding="application/x-tex"></annotation></semantics></math></span><span class="katex-html" aria-hidden="true"></span></span></span></p>\n<h2>Prerequisite</h2>\n<p>If you don’t know any HTML, CSS, or JavaScript, this course will be a bit difficult to follow, but not impossible. The target audience ranges from people who have gone through at least one introductory course on these topics (or at least, through JavaScript) to entry-level professionals who are looking to level up their front-end skills. If you’re completely new to the topic, I recommend taking <a href="https://www.educative.io/collection/10370001/5686791109607424">one of the excellent courses</a> on Educative before this one. If you’re feeling ambitious, however, complete beginners might be able to follow along by doing their own research on the aspects of the lessons that aren’t explained.</p>\n<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow></mrow><annotation encoding="application/x-tex"></annotation></semantics></math></span><span class="katex-html" aria-hidden="true"></span></span></span></p>\n<h2>About</h2>\n<p>This course uses plain HTML, CSS, and JavaScript.</p>\n<p>The path to becoming a good frontend engineer includes learning the fundamentals and knowing how to build things with plain JavaScript before adding on libraries and frameworks, which often obscure what you’re really doing. You won’t always be writing and reading code with the library you’ve specialized in, and learning how to build components in native JavaScript makes things seem a lot less like magic.</p>\n<p>You’ll build five different components, and the chapters are meant to be taken in order. The reason for this is that in each chapter, the focus will be on the different aspects of frontend development while building off of what was covered in previous chapters. For example, an implementation detail might be explained in-depth in an earlier chapter, but in later chapters, it’ll be assumed you’ve already gotten enough exposure to it.</p>\n<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow></mrow><annotation encoding="application/x-tex"></annotation></semantics></math></span><span class="katex-html" aria-hidden="true"></span></span></span></p>\n<h2>Notes</h2>\n<p>A lot of the working examples throughout this course will be self-contained in a tabbed iframe. Please spend time understanding each tab and the changes made.</p>\n<p>If you’re following along, you’ll want to separate your HTML, CSS, and JavaScript into different files, and reference the CSS and JavaScript from your HTML page. It’s omitted from the examples because that’s how the library that helps display them works. So for example, if you have <code>index.html</code>, you’ll want to include after <code><head></code>, something like <code><link rel="stylesheet" type="text/css" href="./index.css"></code>, and just before the <code></body></code> (the closing tag), something like <code><script src="./index.js"></script></code>. I encourage you to follow along with your own files, maybe even implementing pieces yourself before looking at the next example and comparing it.</p>\n', 'text': 'Hi, welcome to *Intermediate Javascript: Building Frontend Components*. The purpose of this course is to teach you how to apply the introductory HTML, CSS, and JavaScript that you\'ve learned in order to build real-world components. The course will walk you through the process of building several complex components that you\'ve likely encountered on popular websites. You\'ll learn how to approach common frontend challenges, what questions to ask, how to design solutions once you\'ve thought of them, how to debug and work with mistakes, and more. *The ultimate goal is to empower you so that you can point to any part of a website and say, "I can build that."*\n$$$$\n## Prerequisite\nIf you don\'t know any HTML, CSS, or JavaScript, this course will be a bit difficult to follow, but not impossible. The target audience ranges from people who have gone through at least one introductory course on these topics (or at least, through JavaScript) to entry-level professionals who are looking to level up their front-end skills. If you\'re completely new to the topic, I recommend taking [one of the excellent courses](https://www.educative.io/collection/10370001/5686791109607424) on Educative before this one. If you\'re feeling ambitious, however, complete beginners might be able to follow along by doing their own research on the aspects of the lessons that aren\'t explained.\n$$$$\n## About\nThis course uses plain HTML, CSS, and JavaScript. \n\nThe path to becoming a good frontend engineer includes learning the fundamentals and knowing how to build things with plain JavaScript before adding on libraries and frameworks, which often obscure what you\'re really doing. You won\'t always be writing and reading code with the library you\'ve specialized in, and learning how to build components in native JavaScript makes things seem a lot less like magic. \n\nYou\'ll build five different components, and the chapters are meant to be taken in order. The reason for this is that in each chapter, the focus will be on the different aspects of frontend development while building off of what was covered in previous chapters. For example, an implementation detail might be explained in-depth in an earlier chapter, but in later chapters, it\'ll be assumed you\'ve already gotten enough exposure to it.\n\n$$$$\n## Notes\nA lot of the working examples throughout this course will be self-contained in a tabbed iframe. Please spend time understanding each tab and the changes made.\n\nIf you\'re following along, you\'ll want to separate your HTML, CSS, and JavaScript into different files, and reference the CSS and JavaScript from your HTML page. It\'s omitted from the examples because that\'s how the library that helps display them works. So for example, if you have `index.html`, you\'ll want to include after `<head>`, something like `<link rel="stylesheet" type="text/css" href="./index.css">`, and just before the `</body>` (the closing tag), something like `<script src="./index.js"></script>`. I encourage you to follow along with your own files, maybe even implementing pieces yourself before looking at the next example and comparing it.', 'version': '2.0'}, 'hash': '1', 'iteration': 7, 'mode': 'edit', 'type': 'MarkdownEditor'}]
 2023-11-08 01:52:45,260 - INFO - ExtensionScraper - Downloading Code and Quiz Files if found...
 2023-11-08 01:52:45,260 - INFO - ExtensionScraper - Code and Quiz Files Downloaded if found.
 2023-11-08 01:52:45,261 - INFO - ExtensionScraper - -----------------------------------------------------------
                Scraping Topic: 1-important features of a menu: https://www.educative.io/courses/intermediate-javascript/important-features-of-a-menu?showContent=true

 2023-11-08 01:52:45,261 - INFO - LoginAccount - Checking if logged in...
 2023-11-08 01:52:45,266 - INFO - ApiUtility - Getting Course API Content JSON from URL: https://educative.io/api/collection/10370001/5165314803236864/page/5639274879778816?work_type=collection
 2023-11-08 01:52:45,266 - INFO - ApiUtility - Executing JS to get JSON from URL
 2023-11-08 01:52:45,965 - INFO - ApiUtility - Successfully fetched JSON API data
 2023-11-08 01:52:45,965 - INFO - OSUtility - Sleeping for 10 seconds
 2023-11-08 01:53:05,230 - INFO - SeleniumBasicUtility - Loading page and checking if something went wrong
 2023-11-08 01:53:05,231 - INFO - OSUtility - Sleeping for 10 seconds
 2023-11-08 01:53:15,334 - INFO - SeleniumBasicUtility - Waiting for webdriver to load topic page
 2023-11-08 01:53:15,364 - INFO - SeleniumBasicUtility - Adding name attribute in next/back button
 2023-11-08 01:53:15,371 - INFO - BrowserUtility - Scrolling Page
 2023-11-08 01:53:16,064 - INFO - OSUtility - Sleeping for 2 seconds
 2023-11-08 01:53:18,065 - INFO - RemoveUtility - Removing blur with CSS
 2023-11-08 01:53:18,080 - INFO - RemoveUtility - Removing mark-as-completed/completed tick mark
 2023-11-08 01:53:18,126 - INFO - RemoveUtility - Removing unwanted elements
 2023-11-08 01:53:18,134 - INFO - ShowUtility - Showing single markdown quiz solution
 2023-11-08 01:53:18,139 - INFO - ShowUtility - No single markdown quiz solution found
 2023-11-08 01:53:18,139 - INFO - ShowUtility - Showing code solutions
 2023-11-08 01:53:18,144 - INFO - ShowUtility - No code solution found
 2023-11-08 01:53:18,144 - INFO - ShowUtility - Showing hints
 2023-11-08 01:53:18,149 - INFO - ShowUtility - No hints found
 2023-11-08 01:53:18,149 - INFO - ShowUtility - Showing slides
 2023-11-08 01:53:18,153 - INFO - ShowUtility - No slides found
 2023-11-08 01:53:18,153 - INFO - SingleFileUtility - Fixing all object tags
 2023-11-08 01:53:18,157 - INFO - SingleFileUtility - No object tag found
 2023-11-08 01:53:18,157 - INFO - SingleFileUtility - Injecting important scripts
 2023-11-08 01:53:18,167 - INFO - OSUtility - Sleeping for 5 seconds
 2023-11-08 01:53:23,179 - INFO - OSUtility - Sleeping for 5 seconds
 2023-11-08 01:53:28,179 - INFO - SingleFileUtility - Making code selectable
 2023-11-08 01:53:28,184 - INFO - SingleFileUtility - No code found
 2023-11-08 01:53:28,184 - INFO - SingleFileUtility - getSingleFileHtml: Getting SingleFile Html...
 2023-11-08 01:53:47,192 - INFO - ExtensionScraper - Topic File Successfully Created
 2023-11-08 01:53:47,193 - DEBUG - ExtensionScraper - Course API Content JSON: [{'children': [{'text': ''}], 'content': {'comp_id': '34a3b76d-b94a-4c56-acb7-ad3364ab4315', 'cursorPosition': 44, 'mdHtml': '<p>Let’s get started by making a dropdown menu!</p>\n<p>Menus can be seen all over the web. Some are simple and expand a single column of options; some are more complex and can nest submenus. If you’re creating a website from scratch with any sort of navigation or extended options, the chances are good that you’ll be implementing a dropdown menu as well.</p>\n<p>We’ll base ours on one used by one of the most popular e-commerce websites: eBay.</p>\n', 'text': "Let’s get started by making a dropdown menu!\n\nMenus can be seen all over the web. Some are simple and expand a single column of options; some are more complex and can nest submenus. If you're creating a website from scratch with any sort of navigation or extended options, the chances are good that you'll be implementing a dropdown menu as well.\n\nWe'll base ours on one used by one of the most popular e-commerce websites: eBay. ", 'version': '2.0'}, 'hash': 0, 'iteration': 1, 'mode': 'view', 'type': 'MarkdownEditor'}, {'children': [{'text': ''}], 'content': {'caption': '', 'comp_id': '60aa7fba-fae6-4e87-b394-a660a0758851', 'image_id':<PHONE_NUMBER>874176, 'metadata': {'height': 318, 'name': 'ebay_menu.gif', 'sizeInBytes': 12089751, 'width': 1254}, 'style': 'original'}, 'hash': 1, 'iteration': 0, 'mode': 'view', 'type': 'Image'}, {'children': [{'text': ''}], 'content': {'comp_id': 'c2fa58ea-b3e5-4609-b2ab-fe518138232f', 'cursorPosition': 660, 'mdHtml': '<p>Let’s take note of the features we want to implement.</p>\n<ul>\n<li>There’s a top-level menu bar that is always visible.</li>\n<li>Hovering over an item is what brings up submenus</li>\n<li>Submenus are separated into two, labeled columns</li>\n<li>Submenus include a portion for images</li>\n<li>Submenus are all the same size</li>\n<li>Transitioning from one submenu to another is seamless. Rather than closing and opening animations, the contents change</li>\n<li>The submenu columns have clickable links, but the top-level option is also clickable (e.g., users can click on “Electronics” but also a specific type of electronics)</li>\n<li>Submenu images are also clickable</li>\n<li>When a user’s mouse leaves the submenu, it closes</li>\n</ul>\n', 'text': 'Let\'s take note of the features we want to implement.\n- There\'s a top-level menu bar that is always visible.\n- Hovering over an item is what brings up submenus\n- Submenus are separated into two, labeled columns\n- Submenus include a portion for images\n- Submenus are all the same size\n- Transitioning from one submenu to another is seamless. Rather than closing and opening animations, the contents change\n- The submenu columns have clickable links, but the top-level option is also clickable (e.g., users can click on "Electronics" but also a specific type of electronics)\n- Submenu images are also clickable\n- When a user\'s mouse leaves the submenu, it closes', 'version': '2.0'}, 'hash': 2, 'iteration': 1, 'mode': 'edit', 'saveVersion': 1, 'type': 'MarkdownEditor'}]
 2023-11-08 01:53:47,195 - INFO - ExtensionScraper - Downloading Code and Quiz Files if found...
 2023-11-08 01:53:47,195 - INFO - ExtensionScraper - Code and Quiz Files Downloaded if found.
 2023-11-08 01:53:47,210 - INFO - ExtensionScraper - -----------------------------------------------------------
                Scraping Topic: 2-basic html code: https://www.educative.io/courses/intermediate-javascript/basic-html-code?showContent=true

 2023-11-08 01:53:47,210 - INFO - LoginAccount - Checking if logged in...
 2023-11-08 01:53:47,216 - INFO - ApiUtility - Getting Course API Content JSON from URL: https://educative.io/api/collection/10370001/5165314803236864/page/5676830073815040?work_type=collection
 2023-11-08 01:53:47,217 - INFO - ApiUtility - Executing JS to get JSON from URL
 2023-11-08 01:53:47,675 - INFO - ApiUtility - Successfully fetched JSON API data
 2023-11-08 01:53:47,675 - INFO - OSUtility - Sleeping for 10 seconds
 2023-11-08 01:54:01,915 - INFO - SeleniumBasicUtility - Loading page and checking if something went wrong
 2023-11-08 01:54:01,916 - INFO - OSUtility - Sleeping for 10 seconds
 2023-11-08 01:54:11,963 - INFO - SeleniumBasicUtility - Waiting for webdriver to load topic page
 2023-11-08 01:54:11,985 - INFO - SeleniumBasicUtility - Adding name attribute in next/back button
 2023-11-08 01:54:11,990 - INFO - BrowserUtility - Scrolling Page
 2023-11-08 01:54:12,831 - INFO - OSUtility - Sleeping for 2 seconds
 2023-11-08 01:54:14,832 - INFO - RemoveUtility - Removing blur with CSS
 2023-11-08 01:54:14,850 - INFO - RemoveUtility - Removing mark-as-completed/completed tick mark
 2023-11-08 01:54:14,905 - INFO - RemoveUtility - Removing unwanted elements
 2023-11-08 01:54:14,918 - INFO - ShowUtility - Showing single markdown quiz solution
 2023-11-08 01:54:14,933 - INFO - ShowUtility - No single markdown quiz solution found
 2023-11-08 01:54:14,934 - INFO - ShowUtility - Showing code solutions
 2023-11-08 01:54:14,939 - INFO - ShowUtility - No code solution found
 2023-11-08 01:54:14,939 - INFO - ShowUtility - Showing hints
 2023-11-08 01:54:14,945 - INFO - ShowUtility - No hints found
 2023-11-08 01:54:14,945 - INFO - ShowUtility - Showing slides
 2023-11-08 01:54:14,951 - INFO - ShowUtility - No slides found
 2023-11-08 01:54:14,952 - INFO - SingleFileUtility - Fixing all object tags
 2023-11-08 01:54:14,956 - INFO - SingleFileUtility - No object tag found
 2023-11-08 01:54:14,957 - INFO - SingleFileUtility - Injecting important scripts
 2023-11-08 01:54:14,984 - INFO - OSUtility - Sleeping for 5 seconds
 2023-11-08 01:54:19,992 - INFO - OSUtility - Sleeping for 5 seconds
 2023-11-08 01:54:24,993 - INFO - SingleFileUtility - Making code selectable
 2023-11-08 01:54:24,998 - INFO - SingleFileUtility - getSingleFileHtml: Getting SingleFile Html...
 2023-11-08 01:54:26,348 - INFO - ExtensionScraper - Topic File Successfully Created
 2023-11-08 01:54:26,349 - DEBUG - ExtensionScraper - Course API Content JSON: [{'children': [{'text': ''}], 'content': {'comp_id': 'ec3a596b-b0ba-4059-98e6-267ebf0a12d4', 'cursorPosition': {'ch': 280, 'line': 2, 'sticky': None}, 'mdHtml': '<p>Let’s dive right into the top-level menu by putting the elements into HTML.</p>\n<p>When considering how to structure HTML, you should be thinking about how to group the things you want to build. For the top-level menu, we can create a group for the menu that encompasses the entire component and a group for each menu item. Let’s create some <code>div</code>s for our groups.</p>\n', 'text': "Let's dive right into the top-level menu by putting the elements into HTML.\n\nWhen considering how to structure HTML, you should be thinking about how to group the things you want to build. For the top-level menu, we can create a group for the menu that encompasses the entire component and a group for each menu item. Let's create some `div`s for our groups.", 'version': '2.0'}, 'hash': 0, 'iteration': 0, 'mode': 'view', 'saveVersion': 1, 'type': 'MarkdownEditor'}, {'children': [{'text': ''}], 'content': {'active': 'html', 'comp_id': '00742b26-e81d-49b0-85f3-7bc98587a8f2', 'filename': '', 'jotted': {'autoRun': True, 'caption': '', 'codePlaygroundTemplate': 'jottedTabs', 'exercise': False, 'files': [{'content': '', 'type': 'css'}, {'content': 'var TestResult = function() {\r\n    this.succeeded = false;\r\n    this.reason = "";\r\n    this.input = "";\r\n    this.expected_output = "";\r\n    this.actual_output = "";\r\n}\r\n\r\nvar executeTests = function(userJsCode, userCssCode, userHtmlCode, userHtmlPage){\r\n  var results = [];\r\n \r\n\tconst jsdom = require("jsdom");\r\n  const { JSDOM } = jsdom;\r\n  const dom = new JSDOM(userHtmlPage);\r\n  \r\n  const result = new TestResult();\r\n  result.expected_output = \'Hello World\';\r\n  result.input = \'Html page\';\r\n  \r\n  const pTag = dom.window.document.querySelector("p");\r\n  if (!pTag) {\r\n    result.actual_output = \'null\';\r\n    result.succeeded = false;\r\n    result.reason = \'No p tag found\'\r\n  }\r\n  else {\r\n\t  const pTagText = pTag ? pTag.textContent : \'\';\r\n  \tresult.actual_output = pTagText;\r\n    if (pTagText.trim() != \'Hello World\') {\r\n      result.reason = \'Did not match expected output (Hello World in a p tag).\'\r\n      result.succeeded = false;\r\n    }  \r\n  }\r\n\r\n  results.push(result);\r\n\r\n  return results;\r\n}\r\n', 'type': 'exercise'}, {'content': '\n\n', 'type': 'hiddenjs'}, {'content': '<html>\n  <head>\n  </head>\n <body>\n  <div>\n    <div>\n      Home\n    </div>\n    <div>\n      Motors\n    </div>\n    <div>\n      Fashion \n    </div>\n    <div>\n      Electronics\n    </div>\n    <div>\n      Toys\n    </div>\n   </div>\n </body>\n</html>\n', 'type': 'html'}, {'content': '\n', 'type': 'js'}], 'height': None, 'heightCodepanel': None, 'hideCss': True, 'hideHtml': False, 'hideJs': True, 'hideNav': False, 'hideResult': False, 'hints': None, 'pane': 'result', 'panelsHighlightedLines': {'css': '', 'hiddenjs': '', 'html': '', 'js': ''}, 'plugins': [{'name': 'codemirror', 'options': {'lineNumbers': True, 'theme': 'default'}}, {'name': 'babel', 'options': {'presets': ['es2015', 'stage-2']}}], 'readOnlyState': {'css': False, 'html': False, 'js': False}, 'runOnLoad': False, 'showBabelTransformPane': False, 'showBlank': False, 'showLineNumbers': True, 'showSolution': False, 'solutionPanels': {'css': '', 'html': '', 'js': ''}, 'theme': 'default', 'toggleState': {'css': True, 'html': True, 'js': True, 'result': True}}, 'selectedApiKeys': {}, 'version': '11'}, 'hash': 1, 'iteration': 0, 'mode': 'view', 'type': 'RunJS'}, {'children': [{'text': ''}], 'content': {'comp_id': '1bb6ea83-8284-4465-84d7-d2bde98a65b2', 'cursorPosition': {'ch': 26, 'line': 2, 'sticky': None}, 'mdHtml': '<p>We have a basic HTML layout for a menu, and because this will be static (it won’t change), we can define it directly in our HTML. This is the equivalent of “hard-coding” information, meaning that rather than relying on some external source for the menu items, these menu items are listed directly in the front-end source code.</p>\n<p class="katex-block "><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow></mrow><annotation encoding="application/x-tex"></annotation></semantics></math></span><span class="katex-html" aria-hidden="true"></span></span></span></p>\n<h2>Dynamic vs Static HTML</h2>\n<p>The alternative is to have data be taken from the server. Take a moment to think about when we’d want to hardcode data to HTML. (Don’t worry if you don’t know the answer.)</p>\n', 'text': 'We have a basic HTML layout for a menu, and because this will be static (it won\'t change), we can define it directly in our HTML. This is the equivalent of "hard-coding" information, meaning that rather than relying on some external source for the menu items, these menu items are listed directly in the front-end source code.\n$$$$\n## Dynamic vs Static HTML\nThe alternative is to have data be taken from the server. Take a moment to think about when we\'d want to hardcode data to HTML. (Don\'t worry if you don\'t know the answer.)', 'version': '2.0'}, 'hash': 2, 'iteration': 0, 'mode': 'view', 'saveVersion': 1, 'type': 'MarkdownEditor'}, {'children': [{'text': ''}], 'content': {'comp_id': '1f4427ca-cbf9-4242-a0ea-ba66611f25f4', 'questions': [{'questionOptions': [{'correct': False, 'mdHtml': '<p>The data is different depending on the user</p>\n', 'text': 'The data is different depending on the user'}, {'correct': True, 'mdHtml': '<p>The data is updated infrequently</p>\n', 'text': 'The data is updated infrequently'}, {'correct': False, 'mdHtml': '<p>The size of the data set is large</p>\n', 'text': 'The size of the data set is large'}, {'correct': False, 'mdHtml': '<p>The data appears on every page</p>\n', 'text': 'The data appears on every page'}], 'questionText': 'When is it appropriate to hardcode data into HTML?', 'questionTextHtml': '<p>When is it appropriate to hardcode data into HTML?</p>\n'}], 'renderMode': 'slide', 'title': '', 'titleMdHtml': '', 'version': '1.0'}, 'hash': 3, 'iteration': 0, 'mode': 'view', 'type': 'Quiz'}, {'children': [{'text': ''}], 'content': {'comp_id': '9eba4229-f059-47b8-a637-22aad5346012', 'cursorPosition': 0, 'mdHtml': '<p>When data is different for each user, we have no way of implementing that in plain HTML. It certainly is possible with some server-side rendering, though. Server-side rendering is when the HTML is passed through the server first and has some data populated dynamically instead of being the same for every user. For example, <code><div id="user">{{user.username}}</div></code> might be a line in some HTML that’s passed through a templating engine on the server to populate the portion in the braces before being served to clients (don’t worry if this syntax looks foreign, it’s not JavaScript). In any case, that’s not considered hardcoding.</p>\n<p>When the data set is large, however, we’d be repeating a lot of code to put it all on the HTML. This violates not only code hygiene by making a page unwieldy to scroll through, but also the DRY (Don’t Repeat Yourself) principle, both of which hint at a more maintainable way to implement this.</p>\n<p>Finally, data appearing on every page is not enough reason by itself to hardcode into the HTML. For example, a username shown on every page is different depending on the user.</p>\n<p>When a user wants a page, loading data onto that page in server-side rendering can add time. For data that is rarely updated, manageable in size, and is the same for every user, hardcoding provides the benefit of having the data immediately available (since HTML loads before JavaScript).</p>\n', 'text': 'When data is different for each user, we have no way of implementing that in plain HTML. It certainly is possible with some server-side rendering, though. Server-side rendering is when the HTML is passed through the server first and has some data populated dynamically instead of being the same for every user. For example, `<div id="user">{{user.username}}</div>` might be a line in some HTML that\'s passed through a templating engine on the server to populate the portion in the braces before being served to clients (don\'t worry if this syntax looks foreign, it\'s not JavaScript). In any case, that\'s not considered hardcoding.\n\nWhen the data set is large, however, we\'d be repeating a lot of code to put it all on the HTML. This violates not only code hygiene by making a page unwieldy to scroll through, but also the DRY (Don\'t Repeat Yourself) principle, both of which hint at a more maintainable way to implement this.\n\nFinally, data appearing on every page is not enough reason by itself to hardcode into the HTML. For example, a username shown on every page is different depending on the user.\n\nWhen a user wants a page, loading data onto that page in server-side rendering can add time. For data that is rarely updated, manageable in size, and is the same for every user, hardcoding provides the benefit of having the data immediately available (since HTML loads before JavaScript).', 'version': '2.0'}, 'hash': 4, 'iteration': 2, 'mode': 'edit', 'saveVersion': 4, 'type': 'MarkdownEditor'}]
 2023-11-08 01:54:26,351 - INFO - ExtensionScraper - Downloading Code and Quiz Files if found...
 2023-11-08 01:54:26,351 - INFO - OSUtility - Sleeping for 1 seconds
 2023-11-08 01:54:27,352 - INFO - CodeUtility - Downloading RunJS...
 2023-11-08 01:54:27,354 - INFO - CodeUtility - RunJs Code Downloaded at: C:/Users/ThanhDC/educative.io_scraper/EducativeDownloaded\intermediate javascript building frontend components\2-basic html code\Codes_1
 2023-11-08 01:54:27,354 - INFO - QuizUtility - Downloading Quiz...
 2023-11-08 01:54:27,438 - ERROR - StartScraper - start: 20: ExtensionScraper:start: 50: ExtensionScraper:scrapeCourse: 91: ExtensionScraper:scrapeTopic: 152: QuizUtility:downloadQuizFiles: 25: QuizUtility:downloadQuiz: 69: 'explanation'
 2023-11-08 01:54:27,440 - DEBUG - StartScraper - Exiting Scraper...

@HelloWorldDC git pull latest commit should be fixed


Add option to specify default text style in MaterialApp

Currently, MaterialApp inserts a DefaultTextStyle in its hierarchy
with a style of _errorTextStyle. This means that any material app
with a Text widget that:
(a) doesn't have another DefaultTextStyle widget in its ancestry
between it and the MaterialApp, and
(b) specifies an explicit style with inherit: true
... is susceptible to having its styles inherit from the app-level
error styles.  In this case, it's forced to insert a DefaultTextStyle
as a child of the MaterialApp, which is a little counter-intuitive.
This is exacerbated by the change in #12249, which changed the default
platform text themes in typography.dart to inherit: true. While this
change was correct, it makes apps more susceptible to the behavior above.
Consider the case of an app using a Text widget and explicitly setting
a style on that widget of a platform default style. In that case, they're
explicitly saying "I want this text to have style X" (e.g.
Typography.white.body1), and because the default platform text styles
don't specify decorations, those get inherited from the top-level error
text styles.
This change adds the ability to give MaterialApp a defaultTextStyle,
and only to use _errorTextStyles if such a default is unspecified.

This is the wrong solution.
It's invalid to have text in a material app that isn't in a Material, and the Material introduces the right styles.

The right fix is probably to make the default text style be one that actually throws an exception when used, saying that you have to use a Material.

ACK.  Closing this, and I fixed the issue that was affecting the internal tests by fixing the tests to use Material correctly. thx.

Having said that, https://github.com/flutter/flutter/issues/12548 is similar and interesting...


hapistrano is broken

Describe the bug
The hapistrano package is broken, the package building fails at the testing phase.
To Reproduce
Steps to reproduce the behavior:

nix-env -iA haskellPackages.hapistrano

Expected behavior
Hapistrano should be installed.
Metadata
Please run nix run nixpkgs.nix-info -c nix-info -m and paste the result.

system: "x86_64-darwin"
host os: Darwin 18.7.0, macOS 10.14.6
multi-user?: no
sandbox: no
version: nix-env (Nix) 2.3.1
channels(warellano): "nixpkgs-20.03pre199995.895874d2145"
nixpkgs: /Users/warellano/.nix-defexpr/channels/nixpkgs

The issue is related to the fact that one of the tests in hapistrano uses zsh with is not available to the nix-shell in the building process.

Fix the problem created PR #72985

Previews PR had problems fix on PR #72988

Fixed on PR #72988


To do app

Here is a ToDo app UI that consist of 3 pages.

I tried to add the mockup in Figma file provided but it's on read-only mode.
Here's the link to it .

Hi @Joel-Fah
Please pardon me for the whole silence on your MR. I completely missed that out. I will love to review your MR. Also apologies that the figma file. I have resolved the issue with the figm file


Update spring-boot-starter-storage README file after spring-cloud-azure migration is done

Now in the README.md of spring-boot-starter-storage we only state that the starter is deprecated. We should make it clear that users could use another storage starter, which implements the Spring Resource abstraction, we provide instead.

closing the issue


Drop unsupporterd Ruby versions from .travis.yml

As Ruby 2.2 and 2.3 are no longer supported, we should drop them from .travis.yml

Merging as CI fixed


Add support for TLS with Redis 6

Redis 6 adds support for TLS, but LuckPerms fails to load with it (need to set SSL to true in jedis connections), I had to switch to plugin messaging temporarily. This will also require updating jedis dependency to 3.3.0

You'll need to add the ssl property to your config:
redis:
  enabled: true
  address: localhost
  password: 'example'
  ssl: true

Additional info :
Redis needs the client (luckperms) to give a certificate and you need to trust the server certificate.
You can add the server certificate to your java using :
keytool -import -alias CERTALIASYOUWANT -keystore $JAVA_HOME/lib/security/cacerts -storepass KEYSTORE_PASSWORD -file redis_ca.pem
(default KEYSTORE_PASSWORD in java is changeit)
And you can specify your own certificat by running the server java with parameters :
java -Djavax.net.ssl.keyStore=./KEYSTORE_FILE.p12 -Djavax.net.ssl.keyStorePassword=KEYSTORE_PASSWORD -jar server.jar
More information here : https://stackoverflow.com/questions/5871279/ssl-and-cert-keystore
(This might be obvious for many, but due to the pain I had to find this, I don't see why not help the next people)


[Refactor] Move procedures from "Outlook Synch. Type Conv"

Describe the request
Move the code from the Outlook Synch. Type Conv module to a more precise codeunit in order to decouple this more general functionality from the CRM.Outlook module.
Additional context
It is usually a good idea to use functions that are already available. To use them, we first have to find them. Usually we look for a good name for the codeunit that pretty much explains what we want to do. This is not easy, because we need to know that the code is in the Outlook module.
We would assume that the code we are looking for is in the "Data Type Management" codeunit. Perhaps a new codeunit, e.g. "Type Conv. Management" would be more suitable.
In this case, we want to use the EvaluateTextToFieldRef procedure. To find this procedure, we have searched for code that contains the following line: case FldRef.Type of.
Please move the code to a codeunit in the System Application and refer to it in the Outlook module if required.

@christianbraeunlich is this some requirement you'd like to fix by yourself?
If it's related to an improvement for the system application then this issue might be better at the new repository.
https://github.com/microsoft/BCApps
Additionally this issue is very general therefore I'd think the new repository would require an idea created on https://aka.ms/bcideas first.
@JesperSchulz what would you suggest here?

You are completely correct, @pri-kise. @christianbraeunlich, if this is an issue you'd like to address yourself, try to create an issue in the BCApps repository and have it triaged. If you want Microsoft to address this issue, you could try to create a BCIdea, but I don't think the chances for success that way are huge. Historically, refactoring projects have a hard time getting votes, unless they include some direct customer value too.


Smoove kids 12

Code of Conduct

[X] I have read and agree to the GitHub Docs project's Code of Conduct

What article on docs.github.com is affected?
Deer @
Ronald
@
What part(s) of the article would you like to see updated?
D @
Additional information
@

Ronald

@

<EMAIL_ADDRESS>

https://user-images.githubusercontent.com/129891950/230474422-b536ca37-1307-4e71-a580-fff72238c6df.mp4

Uploading VID_20230323_150509.mp4…

Ro

Ro


Bumping async search to <IP_ADDRESS>

Signed-off-by: Sarat Vemulapalli<EMAIL_ADDRESS>Description
Bumping Async-Search to <IP_ADDRESS>
Check List

[x] Commits are signed per the DCO using --signoff

By submitting this pull request, I confirm that my contribution is made under the terms of the Apache 2.0 license.
For more information on following Developer Certificate of Origin and signing off your commits, please check here.

Rebase on top of #80

https://github.com/opensearch-project/opensearch-build/issues/1333

Codecov Report

:exclamation: No coverage uploaded for pull request base (1.2@3999973). Click here to learn what that means.
The diff coverage is n/a.

@@          Coverage Diff           @@
##             1.2      #79   +/-   ##
======================================
  Coverage       ?   83.57%
  Complexity     ?      556
======================================
  Files          ?       61
  Lines          ?     2058
  Branches       ?      146
======================================
  Hits           ?     1720
  Misses         ?      230
  Partials       ?      108

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 3999973...d97449b. Read the comment docs.


nrepl connection dialog switch inputs by 'tab'

When I called Remote Nrepl Connection and filled in host field I was confused that I have to use mouse to click port field then. Maybe I do something wrong, but it is common practice to use tab for such things even in webpages.
This PR offers such functionality for Remote Nrepl Connection modal.

I'm not seeing this change taking effect when I click tab in the host field. Atom seems to indicate that the command is running and I see the function remoteNreplFocusNext is running but toggleFocus doesn't seem to be executing in the connection view.

@jasongilman, I will check this on fresh Atom, thank you.


Addition to release trigger troubleshooting

Hey, I think it would be good idea to add a link to this default branch page somewhere in the "My pipeline isn't triggering" section. Resource triggers not working has caused me the most headache out of all of these, and this default branch setting is so obscure that it should be mentioned here as well.
https://docs.microsoft.com/en-us/azure/devops/pipelines/process/resources?view=azure-devops&tabs=schema#default-branch-for-triggers
Thanks!

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: 1e834fd0-59c9-3f45-a09d-88571d94c62e
Version Independent ID: b798ba39-ef08-55eb-3fa0-731782a1d7e0
Content: Troubleshoot builds and releases - Azure Pipelines
Content Source: docs/pipelines/troubleshooting.md
Product: devops
Technology: devops-cicd
GitHub Login: @steved0x
Microsoft Alias: sdanie

@DrBushyTop Thank you for the suggestion, this is a great idea, and I'm sorry that you ran into trouble. I am updating this content right now, and I will include this update.
@msebolt I am doing some other work in this topic right now so I'll go ahead and catch this one and add it to that work.


Corrected Nodejs querystring (un)escape definitions

Corrected escape and unescape functions signatures from NodeJS's querystring module.
Both functions take a string as input parameter and return the same string escaped or unescaped (depending on the function).
Previous declaration was declaring no input param and a return type of any.
Added a test code from a real world application.

@atrakeur thanks mate!


Update swagger codegen and templates to generate LR API with cayenne expressions

It was implemented in scope of #324


Speed up finetuning by using this new project unsloth? [Feature Request]

Reminder

[X] I have read the README and searched the existing issues.

Reproduction
https://github.com/unslothai/unsloth
According by the author, it's 5X faster and 60% less memory QLoRA finetuning. Compatible with the current huggingface trainer.
Expected behavior
No response
System Info
No response
Others
No response

#1732

supported


Added support for auto-sending crash reports.

Added an additional argument to the start method, that allows the plugin to upload crash reports automatically if set to true. If the argument is set to anything else, or not set at all, the default behaviour will remain the same, that the app will prompt the user if he wants to submit the report.

thanks

published on npm as 1.3.0

great, tnx


OneToOne simple relationship

Hello.
I spent lot of time finding the way to implement simple and elegant OnToOne relation for two models.
But the only way to make it possible I described here https://github.com/Raizlabs/DBFlow/issues/216#issuecomment-120721936
My models actually are DTOs which means I have a pre-defined structure. Fields annotated with @Expose are handled by Retrofit serializers (Gson).
Each User object has an UserProfile. UserProfile can not live without referenced User.
User.java
@Table(tableName = "Users", databaseName = "mydb")
@ModelContainer
public class User extends BaseModel {

    @Column(name = "id")
    @PrimaryKey(autoincrement = true)
    long id;

    @Expose
    @SerializedName("id")
    @Column(name = "userId")
    String userId;

    @Expose
    UserProfile profile;
}

UserProfile.java
@Table(tableName = "UserProfiles", databaseName = "mydb")
public class UserProfile extends BaseModel {

    @Column(name = "id")
    @PrimaryKey(autoincrement = true)
    long id;

    @Expose
    @Column(name = "firstName")
    String firstName;

    @Expose
    @Column(name = "lastName")
    String lastName;
}

The simple way means that I do not need to save or load UserProfile separately. I want to load a user only.
The expected result should be:
UserProfile profile = new UserProfile();
User user = new User();
user.setUserId("133456789");
user.setUserProfile(profile);
user.save(); // saves also a userProfile

// load
User user = new Select().from(User.class).querySingle();
user.getUserProfile(); // not null, loaded from DB

// modify
user.getUserProfile().setFirstName("john");
user.save(); // saves also a userProfile

// delete
user.delete(); // deletes user and associated userProfile

Any suggestions?
With respect,
Gennadi Kudrjavtsev
PS.
I tried suggested method by combining OneToMany and ForeignKey but this caused circular queries (https://github.com/Raizlabs/DBFlow/issues/322#issuecomment-120845545)

Guys, any thoughts? This feature can bring this library to another level :)

Try inserting in UserProfile:
@Expose
@Column
@ForeignKey(references = {@ForeignKeyReference(columnType = long.class, columnName = "id_user", foreignColumnName = "id")})
public User user;

++++++++++++++
And insert into User:
public UserProfile getUserProfile() {
  if ( profile == null ) {
    profile = new Select().from(UserProfile.class).byId(id).querySingle();
  }
  return profile;
}

++++++++++++++++++++++++++++++
not tested yet

user.getUserProfile().setFirstName("john");
violates the law of Demeter https://en.wikipedia.org/wiki/Law_of_Demeter

solution would have been to use a @ForeignKey

a little more info regarding putting that '@ForeignKey' would be really helpful in removing the confusion of all this One to One relation in dbFlow. And a use case example just like ydanneg has described above.
Thanx


Support Dotnet\Typescript Ubuntu Noble 24.04

Seems to me that here: https://github.com/devcontainers/images/tree/main/src/base-ubuntu
Noble is supported.
Can i help in any way creating the new typescript/dotnet images based on that?

[x] Open a PR
[x] Create a release
[x] Update templates (if necessary)
[x] Update https://github.com/devcontainers/images/issues/90
[x] Update Microsoft Artifact Registry docs

Hi 👋
Looks like we missed updating the dependent images, thanks for the pointing it out.
@gauravsaini04 Can you help add support for the ubuntu:noble variant for the .NET image? Also, worth checking if we need to add noble support to any other image which are ubuntu based.
@macel94 The Typescript image is Debian based, and we have never added Ubuntu support for it. Hence, we won't be adding it right away until we hear more feedback from the community, thanks!

Added changes to pr's for images, templates & mcr docs

So will you merge the templates fixes?
i'd like to try it out :)
let me know if i can help in any way @gauravsaini04

@gauravsaini04 What's pending in here? Can we close it out?

yes it can be closed.


The 'Add' tooltip from the Add worker button isn't working correctly

Description
The Add tooltip from the Add worker button is a glitching and once it appears, it stays there permanently.
Steps to reproduce

Login
Go to any solution where you can add a worker (eg. Caprover)
Press + button
Navigate to anywhere in page and you will find Add label is always displayed.

Logs/Alerts
Untitled_ Aug 17, 2023 10_01 AM.webm

is this happening anywhere else?

is this happening anywhere else?

It did occur to me in many of the solution instance listing.
Like below, when it was listing or after deleting.

is this happening anywhere else?

Like Caprover and Kubernetes Add button yes, but other buttons' tooltips no for now but will test all them to make sure.

I think there is no issue, it maybe happened on your machine only due to caching or something like that.
https://github.com/threefoldtech/tfgrid-sdk-ts/assets/57001890/9c3f6a5b-a612-4bde-9769-76225ef9923d

I did hard reset and clear the cache, and the bug still happen.
It's not about deploying or steps, it's because of the add tooltip after pressing the button it doesn't disappear like any other tooltip.
Add bug

the problem still exists after clicking on add worker for  one time the add label will always be there
Screencast from 08-21-2023 10:15:40 AM.webm

Closing the issue as non-reproducible.


MB/Housing 311 not clickable

I expect that all places where it says "Call 311" that it will be clickable. Instead, in MB in both English and French, at Housing > Emergency Housing and Shelters > the bottom of the page "Call 311 (in Winnipeg only)" is not clickable.
Acceptance Criteria

[ ]  able to click and call 311 on this page.

Steps for QA:

Still not clickable on iOS. See attached video.
https://user-images.githubusercontent.com/89798867/150585594-e5ae1db6-5d2d-4ef9-b0de-ce82498794a5.mov

Still not clickable on iOS. See attached video.
https://user-images.githubusercontent.com/89798867/150585594-e5ae1db6-5d2d-4ef9-b0de-ce82498794a5.mov

Still not clickable on iOS. See attached video.
https://user-images.githubusercontent.com/89798867/150585594-e5ae1db6-5d2d-4ef9-b0de-ce82498794a5.mov

Closing as fixed


Kernel keeps dying

File "<frozen importlib._bootstrap_external>", line 781, in get_code
  File "<frozen importlib._bootstrap_external>", line 741, in source_to_code
  File "<frozen importlib._bootstrap>", line 205, in _call_with_frames_removed
  File "/Users/x/github/IJython/jython_kernel.py", line 55
    abort_msg = {'status': 'abort',
                                  ^
TabError: inconsistent use of tabs and spaces in indentation
[I 21:00:06.283 NotebookApp] KernelRestarter: restarting kernel (1/5)

repo is awaiting a major update with many changes to jupyter meanwhile, in about a week i will try to update it.

I managed to fix those tabs and spaces problem and the kernel compiles OK and I can load it in a notebook. However, trying the example
import java OK
print dir(java) Nothing appears on output
And I see the following exception in kernel:
[IPKernelApp] ERROR | Exception in message handler:
Traceback (most recent call last):
File "/Users/xxx/miniconda3/lib/python3.6/site-packages/ipykernel/kernelbase.py", line 235, in dispatch_shell
handler(stream, idents, msg)
File "/Users/xxx/miniconda3/lib/python3.6/site-packages/ipykernel/kernelbase.py", line 399, in execute_request
user_expressions, allow_stdin)
File "/Users/xxx/Tmp/IJython/jython_kernel.py", line 58, in do_execute
output = self.jyrepl(code, timeout=None)
File "/Users/xxx/Tmp/IJython/jython_kernel.py", line 158, in jyrepl
if len(self._child.before.splitlines())>1:    out+='\n'.join(self._child.before.splitlines()[1:])+'\n'
TypeError: sequence item 0: expected str instance, bytes found
Is this exception related with the fact that I used python3.6 to install the kernel?
Do I need to use python2.7?


About/FAQ missing reference to webmention-endpoint?

In the FAQ https://brid.gy/about#endpoint there's a line about "Why do I have to add that line of HTML to my blog?"
Am I now missing it or did the actual line of HTML that's being referred to disappear from the page in an update?
I'm presuming it's referring to:
<link href="http://yourwebsite.host/webmention-endpoint" rel="webmention" /> or on WordPress

I think the brid.gy interface prompts the user to include such a line when signing up for service, but it may also make sense to mention it on this page in this section somewhere for completeness? It could certainly be referenced here for those reading the "about" page prior to actually attempting to set things up.

interesting idea! i don't think i've ever had the actual HTML in the docs. that's deliberate, since it's a bit different for each service, especially the instructions and where to add it. it is in the UI during the signup flow, you're right, which is better since then i know which service they're on, and other config details. i'd rather not confuse people by putting all those details in the docs too, since people will inevitably follow the wrong instructions.
i think i still prefer it that way, but i'm open to arguments otherwise...

Echoing what snarfed said, the markup is actually really different per service ... e.g., Tumblr lets you edit the template and add <link> tags in the header, but Wordpress.com only lets you add 's in a widget in the body.

I'm always a fan of instructions being built intuitively into the UI flow, to guide new users along, especially if they have a solid idea of what they're getting into in the first place. In this particular instance, the reference to the HTML was a tad too nebulous and may confuse many -- especially those who begin reading rather than jumping right in.
Shortly the indieweb will be so big that totally tyro users with no facility with code will be on the doorstep and will need better explanations/instructions. Perhaps I'll take some time in the coming months to put together simple walk thrus for the handful of major platforms? If you think it's worthwhile, can you let me know, based on the current userbase (or even recent growth in the past 6months-year), how you'd rank them in order of priority so we can help the biggest groups first? Or perhaps it's worth starting at the lowest hurdle for the least technical users (Tumblr/Blogger?) and building toward the more technical (WordPress.com)? (I'd presume most above this level are okay with most of what exists now).
I'm presuming that Brid.gy was originally meant as a "code" bridge to connect activity on silos, but I can also see it as taking on a secondary meaning in providing the initial value and impetus to bridge users into to the bigger IndieWeb movement.

heh, you made me https://www.google.com/search?q=define%3Atyro ! :P
point taken. we can definitely consider expanding that part of the docs. and walkthroughs for major platforms would be great! we try to do that somewhat with http://indiewebify.me/ , https://indiewebcamp.com/Getting_Started , https://indiewebcamp.com/web_hosting , etc., but they can definitely be improved. maybe start there to see what we have so far?
and you're right, bridgy is intended to bridge the indieweb and silos, both social networks and web/blog hosts. i'm all for improving it, but making it a catch-all tutorial/intro to the indieweb as a whole is a bit out of scope. http://indiewebify.me/ , the wiki, and/or new walkthroughs like you describe are probably more appropriate places...?

@tantek has used it in the "Bridge to bring in new users" sense before, too!


skipping app 'xxx' of type '' because it's not of supported source type

Hi Team,
We keep the helm charts of the applications in a git repository and seeing the above error in image updater container logs. Looking at https://github.com/argoproj-labs/argocd-image-updater/blob/49825ec4df76b3d2571515525ac71b83efd30acc/pkg/argocd/argocd.go#L520-L533, it seems like image updater supports only for helm chart repository, but not for git. Could you please advise?. Configurations as follow.
metadata:
      name: "{{ index .path.segments 1 }}-{{.environment}}"
      annotations:
        argocd-image-updater.argoproj.io/image-list: "{{.environment}}/{{ index .path.segments 1 }}"
        argocd-image-updater.argoproj.io/write-back-method: git
        argocd-image-updater.argoproj.io/git-branch: master
        argocd-image-updater.argoproj.io/write-back-target: "helmvalues:./microservices/{{ index .path.segments 1 }}/{{.environment}}/values.yaml"
    spec:
      project: "default"
      source:
        repoURL: git@gitlab.com:xxx/xxx/argocd_applicationset.git
        targetRevision: HEAD
        path: "{{.path.path}}"
        helm:
          valueFiles:
            - "{{.environment}}/values.yaml"
            - "values.yaml"

What does the log say exactly (you can omit your app name)? We're getting application source type from argocd app.Status.SourceType, and it's odd if it returns something other than helm.
Also have you tried it with the latest release 0.14.0, or latest snapshot in master?

Thanks for the reply @chengfang
Yes, using the latest helm chart 0.11.0 with the latest image quay.io/argoprojlabs/argocd-image-updater:v0.14.0. Full log as follows.
time=“2024-07-17T01:46:57Z” level=info msg=“argocd-image-updater v0.14.0+af844fe starting [loglevel:INFO, interval:2m0s, healthport:8080]”
time=“2024-07-17T01:46:57Z” level=info msg=“Loaded 1 registry configurations from /app/config/registries.conf”
time=“2024-07-17T01:46:57Z” level=info msg=“ArgoCD configuration: [apiKind=kubernetes, server=argocd-server.argocd, auth_token=false, insecure=false, grpc_web=false, plaintext=false]”
time=“2024-07-17T01:46:57Z” level=info msg=“Starting health probe server TCP port=8080"
time=“2024-07-17T01:46:57Z” level=info msg=“Starting metrics server on TCP port=8081"
time=“2024-07-17T01:46:57Z” level=info msg=“Warming up image cache”
time=“2024-07-17T01:46:57Z” level=info msg=“Finished cache warm-up, pre-loaded 0 meta data entries from 2 registries”
time=“2024-07-17T01:46:57Z” level=info msg=“Starting image update cycle, considering 3 annotated application(s) for update”
time=“2024-07-17T01:46:57Z” level=info msg=“Processing results: applications=3 images_considered=0 images_skipped=3 images_updated=0 errors=0"
time=“2024-07-17T01:48:57Z” level=info msg=“Starting image update cycle, considering 3 annotated application(s) for update”
time=“2024-07-17T01:48:57Z” level=info msg=“Processing results: applications=3 images_considered=0 images_skipped=3 images_updated=0 errors=0"
time=“2024-07-17T01:50:57Z” level=info msg=“Starting image update cycle, considering 3 annotated application(s) for update”
time=“2024-07-17T01:50:57Z” level=info msg=“Processing results: applications=3 images_considered=0 images_skipped=3 images_updated=0 errors=0"
time=“2024-07-17T01:52:57Z” level=info msg=“Starting image update cycle, considering 3 annotated application(s) for update”
time=“2024-07-17T01:52:57Z” level=info msg=“Processing results: applications=3 images_considered=0 images_skipped=3 images_updated=0 errors=0"
time=“2024-07-17T01:54:57Z” level=info msg=“Starting image update cycle, considering 3 annotated application(s) for update”
time=“2024-07-17T01:54:57Z” level=info msg=“Processing results: applications=3 images_considered=0 images_skipped=3 images_updated=0 errors=0"
time=“2024-07-17T01:56:57Z” level=info msg=“Starting image update cycle, considering 3 annotated application(s) for update”
time=“2024-07-17T01:56:57Z” level=info msg=“Processing results: applications=3 images_considered=0 images_skipped=3 images_updated=0 errors=0"
time=“2024-07-17T01:58:57Z” level=info msg=“Starting image update cycle, considering 3 annotated application(s) for update”
time=“2024-07-17T01:58:57Z” level=info msg=“Processing results: applications=3 images_considered=0 images_skipped=3 images_updated=0 errors=0"
time=“2024-07-17T02:00:58Z” level=warning msg=“skipping app ‘xxx-dev’ of type ‘’ because it’s not of supported source type” application=xxx-dev
time=“2024-07-17T02:00:58Z” level=warning msg=“skipping app ‘xxx-testing’ of type ‘’ because it’s not of supported source type” application=xxx-testing
time=“2024-07-17T02:00:58Z” level=info msg=“Starting image update cycle, considering 1 annotated application(s) for update”
time=“2024-07-17T02:00:58Z” level=info msg=“Processing results: applications=1 images_considered=0 images_skipped=1 images_updated=0 errors=0"
time=“2024-07-17T02:02:58Z” level=warning msg=“skipping app ‘xxx-dev’ of type ‘’ because it’s not of supported source type” application=xxx-dev
time=“2024-07-17T02:02:58Z” level=warning msg=“skipping app ‘xxx-testing’ of type ‘’ because it’s not of supported source type” application=xxx-testing
time=“2024-07-17T02:02:58Z” level=info msg=“Starting image update cycle, considering 1 annotated application(s) for update”

also, note that i'm using applicationset controller to provision applications

I can see the sourceType set to Helm in application status.
status:
  controllerNamespace: argocd
  health:
    status: Healthy
  reconciledAt: "2024-07-19T03:39:21Z"
  resources:
  - health:
      status: Healthy
    kind: Service
    name: xxx-dev
    namespace: dev
    status: Synced
    version: v1
  - kind: ServiceAccount
    name: xxx-dev
    namespace: dev
    status: Synced
    version: v1
  - group: apps
    health:
      status: Healthy
    kind: Deployment
    name: xxx-dev
    namespace: dev
    status: Synced
    version: v1
  sourceType: Helm

this was due to a configuration issue on my end.

Could you please post how did you resolve this?


refactor assistant streaming and create OpenAI compliant base class

This came from an offline discussion with @nenb and supersedes #424. It also paves the way for #375.
The main two changes are

Factor out the streaming protocol logic, i.e. SSE and JSONL streaming, to avoid code duplication and easy switching if this is the only change between assistants. The latter part lead directly to 2.
Implement a generic OpenAI compliant base class allowing the selection of the streaming protocol, an arbitrary URL as well as optional model selection.

More details inline.

If this PR is accepted, I'll have a go at #376 and bring it up to speed.

Touching on https://github.com/Quansight/ragna/pull/424#discussion_r1616447168

me having a different (incorrect?) definition of what a compliant API is

That is certainly up for debate. I think the most practical thing given the variety of cases here is: Any REST API is OpenAI compliant if it uses the same request and response schema as OpenAI.
For practicality reasons, we allow the following deviations:

The model can be passed in the request (OpenAI, Ollama), but doesn't have to in case the deployment only features one model (Azure OpenAI, Llamafile)
The streaming can either be performed with SSE (OpenAI, Azure OpenAI) or JSONL (Llamafile, Ollama)


Fixes duplicate runs

Adds lots of tests for merging behavior
Adds tests to some other parts of the code relating to configuration manipulation.
Removes duplicate search paths in the default case.

Signed-off-by: Chuck Ha<EMAIL_ADDRESS>What this PR does / why we need it:
Which issue(s) this PR fixes

Fixes #

Special notes for your reviewer:
Release note:
release-note

Mar 28 17:04:08.301: INFO: Waiting up to 5m0s for pod "pod-secrets-074ad31f-32aa-11e8-81cd-46e2536abc14" in namespace "e2e-tests-secrets-gp6cv" to be "success or failure"
Mar 28 17:04:08.306: INFO: Pod "pod-secrets-074ad31f-32aa-11e8-81cd-46e2536abc14": Phase="Pending", Reason="", readiness=false. Elapsed: 5.52174ms
namespace="heptio-sonobuoy" pod="sonobuoy" container="kube-sonobuoy"
time="2018-03-28T17:04:05Z" level=info msg="Scanning plugins in ./plugins.d (pwd: /)"
time="2018-03-28T17:04:05Z" level=info msg="Scanning plugins in /etc/sonobuoy/plugins.d (pwd: /)"
time="2018-03-28T17:04:05Z" level=info msg="Directory (/etc/sonobuoy/plugins.d) does not exist"
time="2018-03-28T17:04:05Z" level=info msg="Scanning plugins in ~/sonobuoy/plugins.d (pwd: /)"
time="2018-03-28T17:04:05Z" level=info msg="Directory (~/sonobuoy/plugins.d) does not exist"
time="2018-03-28T17:04:05Z" level=info msg="Filtering namespaces based on the following regex:.*|heptio-sonobuoy"
time="2018-03-28T17:04:05Z" level=info msg="Namespace default Matched=true"
time="2018-03-28T17:04:05Z" level=info msg="Namespace e2e-tests-sched-pred-xg82s Matched=true"
time="2018-03-28T17:04:05Z" level=info msg="Namespace heptio-sonobuoy Matched=true"
time="2018-03-28T17:04:05Z" level=info msg="Namespace kube-public Matched=true"
time="2018-03-28T17:04:05Z" level=info msg="Namespace kube-system Matched=true"
time="2018-03-28T17:04:05Z" level=info msg="Starting server Expected Results: [{ e2e} {ip-10-0-10-220.us-west-2.compute.internal systemd_logs} {ip-10-0-23-198.us-west-2.compute.internal systemd_logs} {ip-10-0-24-246.us-west-2.compute.internal systemd_logs}]"
time="2018-03-28T17:04:05Z" level=info msg="Running plugin" plugin=e2e
time="2018-03-28T17:04:05Z" level=info msg="starting aggregation server" address=<IP_ADDRESS> port=8080
time="2018-03-28T17:04:06Z" level=info msg="Running plugin" plugin=systemd-logs
time="2018-03-28T17:04:08Z" level=info msg="received aggregator request" client_cert=systemd-logs node=ip-10-0-10-220.us-west-2.compute.internal plugin_name=systemd_logs
namespace="heptio-sonobuoy" pod="sonobuoy-e2e-job-e64ff3a13dfc4beb" container="sonobuoy-worker"
time="2018-03-28T17:04:08Z" level=info msg="Waiting for waitfile" waitfile=/tmp/results/done

some logs to show it's working


Can't set directory case sensitivity from WSL with fsutil

Your Windows build number:  (Type ver at a Windows Command Prompt)

Microsoft Windows [Version 10.0.17134.885]

What you're doing and what's happening:  (Copy&paste the full set of specific command-line steps necessary to reproduce the behavior, and their output. Include screen shots if that helps demonstrate the problem.)

(open powershell)
> bash
$ fsutil.exe file setCaseSensitiveInfo testDir enable
Error:  Access is denied.
$ sudo fsutil.exe file setCaseSensitiveInfo testDir enable
sudo: fsutil.exe: command not found
$ whereis fsutil.exe
fsutil: /mnt/c/Windows/System32/fsutil.exe
$ sudo whereis fsutil.exe
fsutil:
$

What's wrong / what should be happening instead:

Specified directory should have case sensitivity enabled (or disabled with disable option).

Strace of the failing command, if applicable:  (If some_command is failing, then run strace -o some_command.strace -f some_command some_args, and link the contents of some_command.strace in a gist here).
N/A?
For WSL launch issues, please collect detailed logs.
N/A

See our contributing instructions for assistance.
EDIT:
This command works (without sudo) if I use an Adminstrator PowerShell, surely I don't have to sit in an Admin PowerShell at all times in case I want to use this command?

Maybe it only works in Windows Path.
It is not feasible for you to use fsutil.exe with WSL files path directly.

I'm marking this as external and bydesign.
If you try to run that .exe in powershell or CMD without Admin privileges you'll get the same error, and running it in an Admin window will resolve the error as you mentioned. WSL is calling the .exe correctly and it is behaving as expected, so this does not seem to be a WSL specific issue. Thank you for filing!


Local contacts: Consider the local contacts when the access is author…

…ized even if the server sync option is disabled.

ok


Add auto-toggle command that turns light on/off when using a webcam

This adds a new auto-toggle command to the command line interface. When using that command, litra will keep running and monitor the video device files (/dev/video*) using inotify. Opening or closing such a device will be tracked using a counter to determine if at least one device is currently opened.
Note: This is a quick & dirty PoC implementation and will only works on Linux. I suppose it can be improved, but I don't know if and when I find the time to do that. It works for me for now :)

@Holzhaus If you don't mind, I think I might hold off on this in hope of a cross-platform solution. We now have a Cargo crate that exposes a library target, so maybe this could be a separate OSS project? 👼🏻

The feature is opt-in, so it wouldn't break anything in case you worry about that (without it, the auto-toggle subcommand simply doesn't exist). But I can also make it a separate project if you want.

The feature is opt-in, so it wouldn't break anything in case you worry about that (when building without the feature flag, the auto-toggle subcommand simply doesn't exist). But I can also make it a separate project if you want.

That makes sense! I'm not familiar with Rust's support for features, so I didn't know you could do that 👼🏻
What do you think of merging this change, and then updating our CI/CD process for creating binaries to build with --features autotoggle when building for Linux?

@Holzhaus Is this done from your perspective?
Does it make sense for me to update the CI workflows to include the new feature when building for Linux?

@Holzhaus Is this done from your perspective?

Yes.

Does it make sense for me to update the CI workflows to include the new feature when building for Linux?

With https://github.com/timrogers/litra-rs/pull/18/commits/b82b4bde2f42cee1f6bd889ab372ef8f509798e6 it should be automatically included on Linux, and skipped on other OSes.
If you want to add support for other OSes: You basically need some kind of monitoring for accesses to the camera device(s). No idea how this works on Windows. However, the Logitech G HUB application has a similar feature, so windows users can use that for now if they really need it.

@Holzhaus This looks good to me! Let's get #21 merged, and then we can rebase this and get it shipped too.

@Holzhaus Would you be able to rebase this one, and then I'll get it merged in?

@Holzhaus Would you be able to rebase this one, and then I'll get it merged in?

Done.


Request to php file directly

Guzzle version(s) affected: 6.5.5
PHP version: 7.3
Description
I can't do request to site.com/login.php
How to reproduce
Just allow to do request to files directly

Thanks for getting in touch. We'll need more details than this. Are you trying to download a local file, without running a PHO-FPM server?

Provide more information is not very clear to me

This sounds like a configuration issue on your web server, not a bug with Guzzle. I'd recommend asking on some forums or getting some paid help.


BGFX.cmake support for Android

resubmit PR with changes for 1 build system on Android

It's in bgfx.cmake now


Extract DPE to C

This PR restores extraction of DPE to C.

I added some krml extraction rules, such as Pulse.Lib.Box with heap allocation. Otherwise, I rely on Karamel monomorphization (e.g. Pulse.Lib.Vec on top of Pulse.Lib.Array). To this end, I had to add some more eta-expansion.

I compile against HACL* EverCrypt_Hash.h, EverCrypt_HMAC.h and EverCrypt_Ed25519.h. To do that, I wrote Pulse interfaces equivalent to their Low* counterparts in HACL*, with suitable comments. Then, I turned the HACL module into an interface, and I implemented it with a .fst in a separate directory, but only for C extraction: enabled only if  KRML_HOME is nonempty. Otherwise I expect the new HACL.fsti to behave just like the former HACL.fst where I turned assume val into val. But apparently, this causes issues for extraction to .ast.
CI now clones HACL* and compiles DPE against those HACL*/EverCrypt header files. Alternatively, it is also possible to directly extract the handwritten Pulse interfaces and compile against them, thus not checking whether those interfaces are compatible with HACL*.
In general, the main problem with the HACL module (apart from losing Rust extraction) is the fact that hash_alg type is exposed. Without that type, separate compilation of DPE independently of HACL* would be possible. However, due to that type, it is necessary to #include "EverCrypt_Hash.h" in all files generated by Karamel when extracting DPE.

TODO:
~* Implement Pulse.Lib.SpinLock with a handwritten .c file, just like in Steel~ (dropped, see https://github.com/FStarLang/pulse/pull/20#issuecomment-1995226647)

[ ] Restore Rust extraction. @aseemr Can you please have a look? Thank you in advance!
I initially meant to restore Rust extraction as it currently is on main, but alternatively, we may want to enable HACL.fst for Rust and use either Cryspen's Rust bindings for HACL*, or (if any) a Rust extraction of HACL*.
Write a test program with a main entrypoint, to test linking with SpinLock and HACL* (we should do it eventually, but it is not blocking for this PR.)

Implement Pulse.Lib.SpinLock with a handwritten .c file, just like in Steel

Finally, I will not do that, because this would require special treatment of Pulse.Lib.SpinLock.lock in Karamel (cf. FStarLang/karamel#341): implementing the lock operations with pthreads violates the value semantics of the Karamel AST.
Thus, it may be preferable to extract and compile Pulse.Lib.SpinLock using a primitive CAS. However, this in turn requires #21 to be fixed. Thanks in advance!

Pulse extraction is very close to being restored. While I managed to produce Rust bindings from EverCrypt Pulse interfaces by using Rust's bindgen tool on the extracted EverCrypt.h, I still had to write huge amounts of glue code by hand, to account for function names, unerased unit and ghost arguments (e.g. permissions, pts_to values, etc.) and array type mismatches between Pulse and bindgen. Can this process be automated anyhow? I am not sure.
I moved the definition of dice_digest_len from the formerly handwritten hacl.rs to HACL.fst. But then, the Rust compiler loses the information that that value was a constant, because pulse2rust generates it as a static. @aseemr , would it be possible to have pulse2rust generate a const definition instead of static if the body is a constant? Those are the last remaining errors. Thanks in advance!
(Alternatively, I tried to mark dice_digest_len inline_for_extraction, but then Pulse extraction seems to replace the value of dice_digest_len with (), and then Karamel complains about ill-typed AST. By contrast, this works for v32us. I don't know what is going on there.)

(Alternatively, I tried to mark dice_digest_len inline_for_extraction, but then Pulse extraction seems to replace the value of dice_digest_len with (), and then Karamel complains about ill-typed AST. By contrast, this works for v32us. I don't know what is going on there.)

My bad, HACL needs to be extracted with --cmi since dice_digest_len is behind an interface. This seems to work. Then we might not need pulse2rust extraction of const definitions at this point.


Nested json objects with contents as array

Scenario:

Only check "Nested Elements" option and Current Sheet Only.
Result:
Only one element was converted:

Expected:

How to fix it?

To export nested arrays you have to use specific formatting on the keys, otherwise the exported rows will keep overwriting each other. I recommend looking at the documentation for the Nested array prefix option and looking at the wiki page for nested elements in general. But just enabling the Nested array prefix option and adding the appropriate prefix to your sheet name should take care of the issue.

Hi @GabrielRodriguesS I think that I have the same problem. Have you solve it?

I put the matrix prefix and nothing.
I told you how it was as soon as possible.

Giving up, it was simpler to tweak the data using a programming language.


Add idx field to Interface

Knowing the interface index (also known as the interface number) is required for setting some socket options, particularly around IPv6 multicasting (e.g. UdpSocket#join_multicast_v6).
This adds an idx field on Interface (an Option<u32>) and populates it on posix systems. Unfortunately, I am not a Windows programmer, so I'm leaving it unimplemented there; I would be delighted to see someone else pick up the torch and get it implemented on Windows as well.

Thanks, there are some build/test failures though.

I see that! Thought cargo test had my back  😅I need to spin up some test VMs; I’ll dig in on Monday 💪. On Feb 24, 2023, at 5:21 PM, messense @.***> wrote:
Thanks, there are some build/test failures though.
—Reply to this email directly, view it on GitHub, or unsubscribe.You are receiving this because you authored the thread.Message ID: @.***>

Hi @messense! I fixed the build errors and added an additional assertion in the test case; please let me know if there's anything  else I can do on this PR. Thanks for your review! :bow:

Published in v0.10.0: https://crates.io/crates/if-addrs/0.10.0


Trying to migrate from Router v3 to v5 , doesnt seem to work at all , dont know whats the issue

The project uses redux integration ,
Main component with route looks something like this
const Initial = (props) => {
    const {settings, userManager} = props;
    const {AppContextPath, AppType} = settings;
    const store = configureStore(userManager, {
        settings
    });

    const userIsAuthenticated = connectedReduxRedirect({
        redirectPath: `${AppContextPath}login`,
        authenticatedSelector: (state) => state.oidc.user !== null,
        authenticatingSelector: (state) => state.oidc.isLoadingUser,
        redirectAction: replace,
        wrapperDisplayName: 'UserIsAuthenticated'
    });

    const StandardAuthentication = userIsAuthenticated(({children, ...props}) =>
        React.cloneElement(children, props)
    );

    const SecuredRoutes = ({component: Component, ...rest}) => {
        return (
            <Route
                {...rest}
                render={(props) => {
                    <StandardAuthentication>
                        <>
                            <Component {...props} />
                        </>
                    </StandardAuthentication>;
                }}
            />
        );
    };

    return (
        <ErrorBoundary>
            <Provider store={store}>
                <OidcProvider store={store} userManager={userManager}>
                    <ConnectedRouter history={history} >
                        <>
                            {' '}
                            {/* short syntax for React.Fragment*/}
                            <Switch>

                                <Route
                                    path={`${AppContextPath}login(/:uuid)`}
                                    render={() => (
                                        <Login userManager={userManager} />
                                    )}
                                />
                                <Route
                                    path={`${AppContextPath}callback`}
                                    render={() => (
                                        <Callback userManager={userManager} />
                                    )}
                                />
                                <Route
                                    path={`${AppContextPath}callback`}
                                    render={() =>
                                        {userIsAuthenticated(App)}
                                    }
                                />
                                {/*<SecuredRoutes
                                    exact
                                    path="/"
                                    render={() => <App/>
                                />*/}
                                <Route component={NotFoundExternal} />
                            </Switch>
                        </>
                    </ConnectedRouter>
                </OidcProvider>
            </Provider>
        </ErrorBoundary>

    );
};

configureStore function looks like this -
export const history = createBrowserHistory();

export default function configureStore(
    userManager,
    preloadedState = {settings: {AppContextPath: '/'}}
) {
    const enhancers = [];
    if (process.env.NODE_ENV !== 'production') {
        const devToolsExtension = window.__REDUX_DEVTOOLS_EXTENSION__;

        if (typeof devToolsExtension === 'function') {
            enhancers.push(devToolsExtension());
        }
    }

    const store = createStore(
        createRootReducer(history),
        preloadedState,
        compose(
            applyMiddleware(
                routerMiddleware(history),
                thunkMiddleware,
                reduxPackMiddleware,
                mainError
            ),
            ...enhancers
        )
    );

     loadUser(store, userManager);

    return store;
};

and createRoot reducer as follows:-
const createRootReducer = (history) =>
    combineReducers({
        router: connectRouter(history),
        ...reducers,
        ...baseReducers
    });

export default createRootReducer;
`

versions of the packages used are:
"connected-react-router": "6.8.0",
"react-dom": "16.13.1",
"redux": "4.0.5",
"redux-auth-wrapper": "3.0.0",
"redux-oidc": "3.1.7",
"react-redux": "7.2.1",
"react-router-dom": "5.2.0",
"react-router-redux": "4.0.8"
Route is always going to Notfound route , what s possibly wrong here ? i am new to this please help.

Please print version of history you use. You might install 5 instead 4.
history 5 will be used with react-router 6

i had version history:  "history": "4.10.1",  installed 5.0.0 , still doesnt seem to work .