From 160a9234c1132a8229f5e70d86cbe33ae80afea1 Mon Sep 17 00:00:00 2001 From: Tim Warner Date: Thu, 27 Mar 2025 08:03:13 -0500 Subject: [PATCH 1/2] Tweak PPT at last minute for March 2025 delivery --- course-plan.md | 11 ++------- data/README_ContrastStudy.md | 45 ++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 9 deletions(-) create mode 100644 data/README_ContrastStudy.md diff --git a/course-plan.md b/course-plan.md index b88fb81..017744b 100644 --- a/course-plan.md +++ b/course-plan.md @@ -1,12 +1,5 @@ # GitHub Copilot for Developers - Teaching Punchlist -## Course Structure - -- **Duration**: 4 hours total -- **Segments**: 4 x ~55 minute segments -- **Breaks**: ~9 minute breaks between segments -- **Platform**: ON24 live training **platform** - ## SEGMENT 1: Getting Started with GitHub Copilot (55min) ### 1. Welcome & Introduction (10min) @@ -126,7 +119,7 @@ ### 1. AI Coding Assistant Landscape (10min) -- [ ] Compare: Copilot, Replit, Anysphere, Magic +- [ ] Compare: Copilot, Windsurf, v0, Replit, Anysphere, Magic - [ ] Integration with GitHub ecosystem - [ ] Cost/benefit analysis - [ ] Microsoft/OpenAI/Anthropic relationships @@ -141,7 +134,7 @@ ### 3. Extensions and Integration (15min) - [ ] GitHub marketplace extensions -- [ ] DEMO: Install and use an extension +- [ ] DEMO: Install and use an extensions - [ ] API integration possibilities - [ ] Creating custom plugins diff --git a/data/README_ContrastStudy.md b/data/README_ContrastStudy.md new file mode 100644 index 0000000..4ee3234 --- /dev/null +++ b/data/README_ContrastStudy.md @@ -0,0 +1,45 @@ +# Contrast Study: Good Data vs. Bad Data for AI-900 + +This repository contains **two CSV datasets** plus this **Markdown** guide. The purpose is to demonstrate: + +1. A **good_data.csv** file that embodies **Microsoft’s Responsible AI Principles**: + - **Anonymized IDs** instead of personal names. + - **No direct PII** (no phone numbers, addresses, etc.). + - Balanced distribution of features (several regions, a range of ages, consistent labeling). + - Clearly defined **features** (all columns except the final) vs. **label** (the final column). + +2. A **bad_data.csv** file that violates multiple best practices: + - **FullName**, **StreetAddress**, **PhoneNumber** columns reveal sensitive PII. + - Unnecessary or questionable columns like “Blacklisted.” + - Inconsistent label values (Yes, No, Maybe, or empty). + - Missing or out-of-range numeric values (e.g., PerformanceRating can be 0 or 6, or missing). + - Skewed/uniform region (everything is “North”), leading to potential bias. + - Disorganized, incomplete, or erroneous rows. + +## Key Teaching Points + +- **Responsible AI** demands that data be collected and labeled **fairly**, with **privacy** and **security** in mind, and with **transparent** usage of features vs. labels. +- The **good_data.csv** shows a standard tabular layout ready for typical **classification** tasks (predicting “PromotionEligible”), with data that can be **one-hot encoded** or used as-is in many ML pipelines. +- The **bad_data.csv** highlights the pitfalls: from personal information leaks to label ambiguity, missing values, and potential biases. + +## How to Use + +1. **Load** `good_data.csv` in tools such as: + - Azure Machine Learning Studio + - VS Code + Python (Pandas) + - Databricks or Spark (for bigger scale) + - GitHub Codespaces or local Jupyter Notebooks + +2. **Inspect** how easy it is to parse and model the “good” dataset. Notice consistent numeric columns, no hidden PII, and a clear target label. + +3. **Load** `bad_data.csv`: + - Observe the errors, missing data, out-of-bound values, etc. + - Discuss how to fix or remove these columns and how that might reduce bias or risk. + +4. **Emphasize** Microsoft Responsible AI Principles—ask learners to spot each violation in `bad_data.csv` (privacy, fairness, reliability, etc.). + +5. **Extend** the data or create new synthetic variants for advanced labs. Show how “cleaning” the bad data can be done, bridging best practices and real-world scenarios. + +## Enjoy Teaching! + +Use these files in your **AI-900** or general ML classes to illustrate the difference between “solid, responsibly sourced data” vs. “chaotic, risk-laden data” in a memorable, hands-on way. From fe3c42bcee80fab0101dce4c20d0644e0e3aaa00 Mon Sep 17 00:00:00 2001 From: Tim Warner Date: Thu, 27 Mar 2025 12:22:43 -0500 Subject: [PATCH 2/2] Add GitHub news fetcher and related files; update requirements and documentation --- .cursorrules | 76 ++++++++++ .gitignore | 3 +- LICENSE | 2 +- README.md | 170 +++++++++++++---------- docs/repository-structure.md | 100 +++---------- docs/setup-guide.md | 43 +++--- fizzbuzz.js | 13 ++ github-copilot-news-fetcher.js | 57 ++++++++ github-news-fetcher2.py | 127 +++++++++++++++++ notepad | 9 ++ prom | 0 requirements.txt | 3 + server-2025-learning-lab/CONTRIBUTING.md | 15 +- workflow_dev/codeql-app-scan.yml | 29 ++++ 14 files changed, 465 insertions(+), 182 deletions(-) create mode 100644 .cursorrules create mode 100644 fizzbuzz.js create mode 100644 github-copilot-news-fetcher.js create mode 100644 github-news-fetcher2.py create mode 100644 notepad create mode 100644 prom create mode 100644 requirements.txt create mode 100644 workflow_dev/codeql-app-scan.yml diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..f04868e --- /dev/null +++ b/.cursorrules @@ -0,0 +1,76 @@ +{ + "rules": { + "python": { + "max_line_length": 88, + "docstring_style": "google", + "require_type_hints": true, + "require_docstrings": true, + "require_async_for_io": true, + "require_error_handling": true + }, + "general": { + "require_tests": true, + "test_coverage_threshold": 80, + "require_readme": true, + "require_requirements": true, + "require_logging": true, + "require_error_messages": true + }, + "security": { + "prevent_hardcoded_secrets": true, + "require_input_validation": true, + "require_dependency_pinning": true + }, + "style": { + "require_consistent_naming": true, + "require_comments_complex_logic": true, + "max_function_length": 50, + "max_complexity": 10 + }, + "teaching": { + "require_example_comments": true, + "require_step_documentation": true, + "require_performance_comments": true + }, + "git": { + "require_conventional_commits": true, + "max_commit_size": 300, + "require_branch_protection": true + }, + "ci_cd": { + "require_github_actions": true, + "require_security_scanning": true, + "require_dependency_updates": true + }, + "observability": { + "require_structured_logging": true, + "require_error_tracking": true, + "require_performance_metrics": true + } + }, + "documentation": { + "required_sections": [ + "Overview", + "Installation", + "Usage", + "Configuration", + "Testing", + "Security", + "Performance", + "Contributing" + ] + }, + "ignore_patterns": [ + "**/__pycache__/**", + "**/.pytest_cache/**", + "**/venv/**", + "**/node_modules/**" + ], + "custom_checks": { + "teaching_readiness": { + "require_step_by_step_comments": true, + "require_learning_objectives": true, + "require_example_outputs": true + } + } +} diff --git a/.gitignore b/.gitignore index 8e90a1b..a73b26d 100644 --- a/.gitignore +++ b/.gitignore @@ -459,7 +459,7 @@ log/ *.pfx *.env *.env.* -!*.env.example +!.env.example .secrets/ secrets/ credentials/ @@ -507,3 +507,4 @@ temp/ .idea/ *.swp *.swo +tims-notebook.md diff --git a/LICENSE b/LICENSE index 1f873a5..e1fd273 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2024 Timothy Warner +Copyright (c) 2023 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 2d1f822..eefb7c8 100644 --- a/README.md +++ b/README.md @@ -1,84 +1,110 @@ -# GitHub Copilot for Developers +# GitHub Copilot Dev Repository -GitHub Copilot Course Cover +## Overview +This repository is a collection of resources, examples, and exercises for mastering GitHub Copilot and related technologies. -[![Course Demo Repository](https://img.shields.io/badge/Course%20Demo-NodeGoat-brightgreen?style=for-the-badge)](https://github.com/timothywarner/nodegoat) -[![Knowledge Base Demo](https://img.shields.io/badge/Knowledge%20Base-DemoKB-orange?style=for-the-badge)](https://github.com/timothywarner-org/demokb) -[![Website](https://img.shields.io/website?url=https%3A%2F%2Ftechtrainertim.com)](https://techtrainertim.com) -[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) +## Repository Structure +- **assets/**: Images and other media assets. +- **blackbeard-extension-main/**: A sample extension project. +- **data/**: Example datasets for exercises. +- **docs/**: Documentation and guides. +- **examples/**: Code examples and templates. +- **exercises/**: Hands-on exercises for learning. +- **modules/**: Structured learning modules. +- **resources/**: Additional learning resources. +- **server-2025-learning-lab/**: A server-side learning lab project. -Gain experience with an AI-based pair programmer right now! +## Getting Started +1. Clone the repository: `git clone ` +2. Navigate to the desired folder and follow the instructions in the README files. -## Course Information +## Contributing +See [CONTRIBUTING.md](server-2025-learning-lab/CONTRIBUTING.md) for guidelines. -**Instructor**: Tim Warner - Microsoft MVP, MCT +## License +This project is licensed under the terms of the MIT license. See [LICENSE](LICENSE) for details. -## Connect with Tim -- 📧 Email: [tim@techtrainertim.com](mailto:tim@techtrainertim.com) -- 🌐 Website: [TechTrainerTim.com](https://techtrainertim.com) -- 🐦 Bluesky: [@techtrainertim.bsky.social](https://bsky.app/profile/techtrainertim.bsky.social) -- 💼 LinkedIn: [Timothy Warner](https://www.linkedin.com/in/timothywarner) -- 🎥 YouTube: [@TechTrainerTim](https://youtube.com/@TechTrainerTim) -- 📚 O'Reilly: [Timothy Warner](https://learning.oreilly.com/search/?q=author%3A%22Timothy+Warner%22&type=*&rows=100) +# GitHub Copilot News Fetcher -## Repository Structure +A modern Python example demonstrating how to fetch and display GitHub Copilot news from official sources. This educational example showcases several Python best practices and modern development patterns. -### Course Content -- 📁 `/modules` - Core course materials organized by topic - - 📁 `/01-getting-started` - Getting started with GitHub Copilot - - 📁 `/02-everyday-development` - Using Copilot for everyday development - - 📁 `/03-advanced-features` - Advanced features and techniques - - 📁 `/04-ecosystem-future` - Ecosystem and future possibilities - -### Resources -- 📁 `/exercises` - Hands-on exercises (all in one place) -- 📁 `/examples` - Code examples organized by language/technology -- 📁 `/docs` - Course documentation and reference materials -- 📁 `/workflows` - GitHub Actions and automation examples -- 📁 `/presentations` - Slides and presentation materials -- 📁 `/cheatsheets` - Quick reference guides +## Learning Objectives -## Getting Started -1. Review the [setup guide](docs/setup-guide.md) -2. Check the [course details](docs/course-details.md) -3. Start with the [basics](modules/01-getting-started/README.md) -4. Try the [exercises](exercises/README.md) - -## Prerequisites -- GitHub account (free or paid) -- Visual Studio Code with GitHub Copilot extension -- Basic understanding of Git and GitHub -- Familiarity with at least one programming language - -## Core Resources -### Official Documentation -- [GitHub Copilot Product Page](https://github.com/features/copilot) -- [Official Documentation](https://docs.github.com/en/copilot) -- [GitHub Copilot for Individuals](https://docs.github.com/en/copilot/quickstart) -- [GitHub Copilot for Business](https://docs.github.com/en/copilot/github-copilot-enterprise/overview) - -### IDE Extensions -- [VS Code Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.copilot) -- [Visual Studio Extension](https://marketplace.visualstudio.com/items?itemName=GitHub.copilotvs) -- [JetBrains Extension](https://plugins.jetbrains.com/plugin/17718-github-copilot) -- [Neovim Extension](https://github.com/github/copilot.vim) - -### GitHub Copilot X Features -- [Copilot CLI](https://githubnext.com/projects/copilot-cli/) -- [Copilot for Pull Requests](https://github.blog/2023-11-08-github-copilot-in-the-cli-now-in-public-beta/) -- [Copilot Chat](https://docs.github.com/en/copilot/github-copilot-chat/using-github-copilot-chat) - -### Learning Resources -- [GitHub Learning Lab](https://github.com/skills/copilot-codespaces-vs) -- [Best Practices for Prompting](https://github.blog/2023-06-20-how-to-write-better-prompts-for-github-copilot/) -- [GitHub Copilot Trust Center](https://github.com/features/copilot/trust) -- [Community Forum](https://github.community/c/code-to-cloud/github-copilot/41) - -### Pricing & Billing -- [Pricing Information](https://docs.github.com/en/billing/managing-billing-for-github-copilot/about-billing-for-github-copilot) -- [Enterprise Features](https://docs.github.com/en/copilot/github-copilot-enterprise/overview) +1. **Modern Python Features** + - Type hints with `typing` module + - Dataclasses for clean data structures + - Async/await for concurrent operations + - Resource management with context managers -## License -MIT License - See [LICENSE](LICENSE) for details +2. **Best Practices** + - Clean code organization with classes + - Error handling with try/except + - Resource cleanup in finally blocks + - Strong typing for better maintainability + - Concurrent operations for better performance + +3. **Real-world Integration** + - HTTP requests with modern `httpx` library + - RSS feed parsing + - GitHub API integration + - Beautiful console output with `rich` + +## Installation + +```bash +# Create and activate a virtual environment (recommended) +python -m venv venv +source venv/bin/activate # On Windows: venv\Scripts\activate + +# Install dependencies +pip install -r requirements.txt +``` + +## Usage + +Simply run the script: + +```bash +python github-news-fetcher2.py +``` + +The script will: +1. Fetch the latest Copilot-related posts from the GitHub blog +2. Fetch the latest Copilot releases from GitHub +3. Display the combined results in a nicely formatted table + +## Code Structure + +- `CopilotNews`: Dataclass representing a single news item +- `GitHubNewsFetcher`: Main class handling news fetching and display + - `fetch_blog_posts()`: Fetches and filters GitHub blog posts + - `fetch_releases()`: Fetches latest GitHub Copilot releases + - `display_news()`: Formats and displays results + +## Error Handling + +The script includes robust error handling: +- Timeouts for HTTP requests +- Exception catching for API and parsing errors +- Graceful degradation (continues even if one source fails) +- Resource cleanup with async context management + +## Dependencies + +- `httpx`: Modern async HTTP client +- `feedparser`: RSS/Atom feed parser +- `rich`: Terminal formatting and tables + +## Extension Ideas + +1. Add more news sources (Twitter, YouTube, etc.) +2. Implement caching for API responses +3. Add filtering options for specific topics +4. Create a web interface using FastAPI +5. Add unit tests with pytest + +## Contributing + +Feel free to submit issues and enhancement requests! diff --git a/docs/repository-structure.md b/docs/repository-structure.md index 1f18aa1..001f26f 100644 --- a/docs/repository-structure.md +++ b/docs/repository-structure.md @@ -79,89 +79,21 @@ This structure is optimized for the 4-hour instructional session by: 2. Providing clear progression through the outlined topics 3. Containing specific examples and exercises within each module 4. Maintaining common reference materials separately -# Repository Structure -``` -copilot-dev-2/ -├── README.md # Main documentation and course overview -├── LICENSE # MIT License -├── .gitignore # Git ignore file -├── assets/ # Images and other media -│ ├── slides/ # Presentation slides (including warner-copilot.pptx) -│ └── images/ # Images used in documentation -├── docs/ # Course documentation -│ ├── course-details.md # Detailed course outline -│ ├── setup-guide.md # Environment setup instructions -│ ├── oreilly-details.md # O'Reilly course specifics -│ └── resources.md # Additional learning resources -├── modules/ # Organized by course segments -│ ├── 01-getting-started/ # Introduction and setup -│ │ ├── README.md # Module overview -│ │ ├── exercises/ # Hands-on activities -│ │ └── examples/ # Code demos -│ ├── 02-copilot-fundamentals/ # Core functionality -│ │ ├── README.md # Module overview -│ │ ├── exercises/ # Hands-on activities -│ │ └── examples/ # Code demos -│ ├── 03-tips-and-shortcuts/ # Time-saving techniques -│ │ ├── README.md # Module overview -│ │ ├── exercises/ # Hands-on activities -│ │ └── examples/ # Code demos -│ ├── 04-copilot-x-advanced/ # Advanced capabilities -│ │ ├── README.md # Module overview -│ │ ├── exercises/ # Hands-on activities -│ │ └── examples/ # Code demos -│ └── 05-real-world-usage/ # Use cases and best practices -│ ├── README.md # Module overview -│ ├── exercises/ # Hands-on activities -│ └── examples/ # Code demos -├── examples/ # Common example code for reference -│ ├── web-dev/ # Web development examples -│ ├── data-science/ # Data science examples -│ ├── devops/ # DevOps and automation examples -│ └── prompt-engineering/ # Prompt crafting examples -└── resources/ # Additional resources - ├── cheatsheets/ # Quick reference guides - ├── templates/ # Template files and snippets - └── further-reading/ # Links and additional materials -``` - -## Directory Purposes - -### `/assets` -- Stores all media content including presentation slides and images -- Maintains version control of visual content for the course - -### `/docs` -- Contains all course documentation -- Provides setup guides and resources -- Houses detailed course materials and O'Reilly-specific information - -### `/modules` -- Structured according to the course segments -- Each module contains: - - README.md with module objectives and summary - - Exercises for hands-on practice - - Examples relevant to that module's content -- Organized for a logical teaching flow in a 4-hour session - -### `/examples` -- Common reusable code examples categorized by domain -- Demonstrates different use cases of GitHub Copilot -- More comprehensive than the specific module examples - -### `/resources` -- Supplementary materials for students -- Quick reference cheatsheets -- Template files for various use cases -- Additional reading materials and links - -## Instructional Flow Benefits - -This structure is optimized for a 4-hour instructional session by: +# Repository Structure -1. Organizing content into logical segments that match the course outline -2. Providing clear progression from basics to advanced topics -3. Containing specific examples and exercises within each module -4. Maintaining common reference materials separately -5. Creating a consistent structure within each module for easier navigation \ No newline at end of file +This document provides an overview of the repository structure and the purpose of each folder. + +## Top-Level Folders +- **assets/**: Contains images and other media assets. +- **blackbeard-extension-main/**: A sample extension project for learning. +- **data/**: Example datasets for exercises and analysis. +- **docs/**: Documentation and guides for the repository. +- **examples/**: Code examples and templates for various use cases. +- **exercises/**: Hands-on exercises to practice skills. +- **modules/**: Structured learning modules for different topics. +- **resources/**: Additional resources like cheatsheets and templates. +- **server-2025-learning-lab/**: A server-side learning lab project. + +## Usage +Refer to the README files in each folder for detailed instructions. \ No newline at end of file diff --git a/docs/setup-guide.md b/docs/setup-guide.md index 45d47db..b0e9a59 100644 --- a/docs/setup-guide.md +++ b/docs/setup-guide.md @@ -1,24 +1,29 @@ # Setup Guide ## Prerequisites -1. GitHub Account Setup - * Create or login to your GitHub account - * Enable GitHub Copilot subscription - -2. IDE Installation - * Install Visual Studio Code - * Install GitHub Copilot extension - * Configure Copilot settings - -3. Git Configuration - * Install Git - * Configure basic Git settings - * Clone this repository - -4. Verify Installation - * Test Copilot suggestions - * Test Copilot Chat - * Verify access to all features +- Git installed on your machine. +- Python 3.8+ and Node.js 14+ installed. +- A GitHub account. + +## Steps +1. Clone the repository: + ```bash + git clone + ``` +2. Navigate to the project directory: + ```bash + cd copilot-dev-2 + ``` +3. Install dependencies: + - For Python: + ```bash + pip install -r requirements.txt + ``` + - For Node.js: + ```bash + npm install + ``` +4. Run the application or scripts as needed. ## VS Code Configuration ### Required Extensions @@ -53,4 +58,4 @@ - Verify GitHub authentication - Check Copilot subscription status - Ensure VS Code is up to date -- Clear VS Code cache if needed \ No newline at end of file +- Clear VS Code cache if needed \ No newline at end of file diff --git a/fizzbuzz.js b/fizzbuzz.js new file mode 100644 index 0000000..1df5027 --- /dev/null +++ b/fizzbuzz.js @@ -0,0 +1,13 @@ +function fizzBuzz (n) { + for (let i = 1; i <= n; i++) { + if (i % 3 === 0 && i % 5 === 0) { + console.log("FizzBuzz"); + } else if (i % 3 === 0) { + console.log("Fizz"); + } else if (i % 5 === 0) { + console.log("Buzz"); + } else { + console.log(i); + } + } +} \ No newline at end of file diff --git a/github-copilot-news-fetcher.js b/github-copilot-news-fetcher.js new file mode 100644 index 0000000..c5b835b --- /dev/null +++ b/github-copilot-news-fetcher.js @@ -0,0 +1,57 @@ +import axios from 'axios'; +import cheerio from 'cheerio'; + +/** + * Fetches and parses GitHub Copilot news from GitHub Blog. + * @returns {Promise} Array of news articles about GitHub Copilot + */ +async function fetchCopilotNews() { + try { + console.log("Fetching GitHub Copilot news..."); + + // GitHub Blog URL + const githubBlogUrl = 'https://github.blog'; + + // Fetch GitHub Blog page + const response = await axios.get(githubBlogUrl); + const html = response.data; + + // Parse HTML using Cheerio + const $ = cheerio.load(html); + const news = []; + + // Fixed the duplicate line here + $('article').each((index, element) => { + const title = $(element).find('h2').text().trim(); + const link = $(element).find('a').attr('href'); + const description = $(element).find('p').text().trim(); + + if (title.toLowerCase().includes('copilot')) { + news.push({ + title, + link: link.startsWith('http') ? link : `${githubBlogUrl}${link}`, + description, + }); + } + }); + + if (news.length > 0) { + console.log("GitHub Copilot News found:"); + news.forEach((item, index) => { + console.log(`${index + 1}. ${item.title}`); + console.log(` Link: ${item.link}`); + console.log(` Description: ${item.description}`); + }); + } else { + console.log("No GitHub Copilot news found."); + } + + return news; + } catch (error) { + console.error("Error fetching GitHub Copilot news:", error.message); + throw error; + } +} + +// Run the function +fetchCopilotNews(); \ No newline at end of file diff --git a/github-news-fetcher2.py b/github-news-fetcher2.py new file mode 100644 index 0000000..a62c42b --- /dev/null +++ b/github-news-fetcher2.py @@ -0,0 +1,127 @@ +#!/usr/bin/env python3 +""" +GitHub Copilot News Fetcher +A simple tool to fetch the latest GitHub Copilot news from official sources. + +Author: Tim Warner +Purpose: Educational demonstration of Python best practices and API usage +""" + +import httpx +import feedparser +from datetime import datetime +from rich.console import Console +from rich.table import Table +from typing import List, Dict, Any +import asyncio +from dataclasses import dataclass + +@dataclass +class CopilotNews: + """Represents a single piece of Copilot news""" + title: str + date: datetime + url: str + source: str + +class GitHubNewsFetcher: + """Fetches and aggregates GitHub Copilot news from multiple sources""" + + def __init__(self): + self.console = Console() + # Using httpx for modern async HTTP + self.client = httpx.AsyncClient( + timeout=30.0, + follow_redirects=True + ) + + async def fetch_blog_posts(self) -> List[CopilotNews]: + """Fetch Copilot-related posts from GitHub blog""" + try: + # GitHub blog feed URL + response = await self.client.get("https://github.blog/feed/") + feed = feedparser.parse(response.text) + + copilot_news = [] + for entry in feed.entries: + # Filter for Copilot-related posts + if "copilot" in entry.title.lower() or "copilot" in entry.description.lower(): + news = CopilotNews( + title=entry.title, + date=datetime(*entry.published_parsed[:6]), + url=entry.link, + source="GitHub Blog" + ) + copilot_news.append(news) + + return copilot_news[:5] # Return latest 5 matches + except Exception as e: + self.console.print(f"[red]Error fetching blog posts: {e}[/red]") + return [] + + async def fetch_releases(self) -> List[CopilotNews]: + """Fetch latest GitHub Copilot releases using GitHub API""" + try: + response = await self.client.get( + "https://api.github.com/repos/github/copilot-docs/releases" + ) + releases = response.json() + + return [ + CopilotNews( + title=f"Release: {release['name']}", + date=datetime.fromisoformat(release['published_at'].replace('Z', '+00:00')), + url=release['html_url'], + source="GitHub Releases" + ) + for release in releases[:3] # Latest 3 releases + ] + except Exception as e: + self.console.print(f"[red]Error fetching releases: {e}[/red]") + return [] + + def display_news(self, news_items: List[CopilotNews]): + """Display news items in a formatted table""" + table = Table(title="Latest GitHub Copilot News") + + table.add_column("Date", style="cyan") + table.add_column("Title", style="green") + table.add_column("Source", style="yellow") + table.add_column("URL", style="blue") + + # Sort by date, newest first + sorted_news = sorted(news_items, key=lambda x: x.date, reverse=True) + + for item in sorted_news: + table.add_row( + item.date.strftime("%Y-%m-%d"), + item.title, + item.source, + item.url + ) + + self.console.print(table) + + async def close(self): + """Clean up resources""" + await self.client.aclose() + +async def main(): + fetcher = GitHubNewsFetcher() + try: + # Fetch news from multiple sources concurrently + blog_posts, releases = await asyncio.gather( + fetcher.fetch_blog_posts(), + fetcher.fetch_releases() + ) + + # Combine and display results + all_news = blog_posts + releases + fetcher.display_news(all_news) + + finally: + await fetcher.close() + +if __name__ == "__main__": + # Run the async main function + asyncio.run(main()) diff --git a/notepad b/notepad new file mode 100644 index 0000000..22a74d1 --- /dev/null +++ b/notepad @@ -0,0 +1,9 @@ +# tim's dream board + +1. do something EPIC: + - Build a GitHub Copilot plugin that tells dad jokes while coding + - Host a "worst code ever" contest and judge entries with AI + - Create a VS Code extension that plays dramatic music during merge conflicts + +2. do something nice +3. my imaginatino is failing \ No newline at end of file diff --git a/prom b/prom new file mode 100644 index 0000000..e69de29 diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..5b9ab42 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +httpx==0.26.0 +feedparser==6.0.11 +rich==13.7.0 \ No newline at end of file diff --git a/server-2025-learning-lab/CONTRIBUTING.md b/server-2025-learning-lab/CONTRIBUTING.md index f15613d..1177623 100644 --- a/server-2025-learning-lab/CONTRIBUTING.md +++ b/server-2025-learning-lab/CONTRIBUTING.md @@ -1,10 +1,15 @@ -# Contributing to Windows Server 2025 Learning Lab +# Contributing Guidelines -Thank you for considering contributing to the Windows Server 2025 Learning Lab project! This document provides guidelines and instructions for contributing. +Thank you for considering contributing to this project! Please follow these guidelines to ensure a smooth contribution process. -## Code of Conduct +## How to Contribute +1. Fork the repository. +2. Create a new branch for your feature or bugfix. +3. Commit your changes with clear and descriptive messages. +4. Submit a pull request to the `main` branch. -By participating in this project, you agree to abide by its [Code of Conduct](CODE_OF_CONDUCT.md). +## Code of Conduct +Please adhere to the [Code of Conduct](CODE_OF_CONDUCT.md) to maintain a welcoming and inclusive environment. ## How Can I Contribute? @@ -134,4 +139,4 @@ This project uses labels to categorize issues and pull requests: ## Thank You! -Your contributions are greatly appreciated. Every little bit helps, and credit will always be given. \ No newline at end of file +Your contributions are greatly appreciated. Every little bit helps, and credit will always be given. \ No newline at end of file diff --git a/workflow_dev/codeql-app-scan.yml b/workflow_dev/codeql-app-scan.yml new file mode 100644 index 0000000..2cdef04 --- /dev/null +++ b/workflow_dev/codeql-app-scan.yml @@ -0,0 +1,29 @@ +# CodeQL workflow for security scanning +name: "CodeQL Analysis" + +on: + push: + branches: + - main + pull_request: + branches: + - main + schedule: + - cron: "0 0 * * 0" + +jobs: + analyze: + name: Analyze CodeQL + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v3 + + - name: Initialize CodeQL + uses: github/codeql-action/init@v2 + with: + languages: "javascript,python" + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v2 \ No newline at end of file