The daily open source grind ๐Ÿ”— **Source:** [The daily open source grind](https://www.youtube.com/watch?v=gL3x3AvhBBk) > [!note]+ Document Notes > tags: [open-source, php-development, tempest, live-coding] > author: Brent Roose > source: YouTube > reference: https://www.youtube.com/watch?v=gL3x3AvhBBk > date created: 2024-12-19 12:00 > > # ๐Ÿท๏ธ Title: The daily open source grind > <!-- deep-read:sections start --> ## ๐Ÿงฐ Action Inbox - [H1] Review pull requests for Tempest framework โ€” 00:00 #pull-request-review - [H2] Fix pagination joins issue โ€” 05:45 #bug-fix - [H3] Debate DocBlock vs Attributes for relation types โ€” 15:30 #architecture ## ๐Ÿงญ Table of Contents - [๐Ÿ“ Summary](#-summary) - [๐Ÿ“– Main Content](#-main-content) - [๐Ÿ—’๏ธ Notes](#๏ธ-notes) - [๐Ÿ“š References](#-references) - [๐Ÿ—ฃ๏ธ Paraphrase](#๏ธ-paraphrase) - [๐Ÿ“ฐ Newsletter](#-newsletter) - [โœ… Action Items](#-action-items) - [๐Ÿงช Hypotheses](#-hypotheses) - [๐Ÿ“Š Methodology](#-methodology) - [โ“ Questions](#-questions) - [๐Ÿ”ฎ Future Research](#-future-research) - [๐Ÿ’ก Implications](#-implications) - [๐Ÿง  Learning Styles Assessment](#-learning-styles-assessment) - [๐Ÿ“Š Accessibility Assessment](#-accessibility-assessment) - [๐ŸŒ DEIB Assessment](#-deib-assessment) - [โœ… Logical Validity](#-logical-validity) - [๐Ÿ›ก๏ธ DARVO Analysis](#-darvo-analysis) - [๐ŸŽฏ Conclusion](#-conclusion) ### ๐Ÿ”— References - [Tempest Framework](https://tempestphp.com) - [Laravel Lift Package](https://github.com/WendellAdriel/laravel-lift) ## ๐Ÿ“ Summary - Brent Roose conducts a live coding session reviewing pull requests for the Tempest PHP framework - Key discussion around DocBlock parsing vs attributes for defining model relations in PHP - Multiple technical challenges addressed including pagination joins and Redis session management - Strong emphasis on code quality, developer experience, and framework architecture decisions - Community engagement through live streaming helps maintain open source momentum ## ๐Ÿ“– Main Content This stream showcases the day-to-day reality of maintaining an open source PHP framework. Brent addresses technical debt, reviews community contributions, and engages in architectural debates about the best approaches for handling PHP's limitations around generics and type hints. The main tension revolves around how to handle relationship definitions in models - whether to use DocBlocks with fully qualified class names, support short class names through complex parsing, or introduce attributes as an alternative approach. Each solution involves trade-offs between developer experience, performance, and code complexity. ## ๐Ÿ—’๏ธ Notes #### โฑ๏ธ [00:00](https://youtu.be/gL3x3AvhBBk?t=0) โ€” [H1] Stream Setup and Personal Updates - Key idea: Brent is sick but continues streaming to maintain consistency - Evidence: "I was considering not streaming today... my daughter is still sick... I'm getting sick as well" #### โฑ๏ธ [02:30](https://youtu.be/gL3x3AvhBBk?t=150) โ€” [H2] Holiday Planning and Work-Life Balance - Key idea: Planning three weeks completely offline to avoid burnout - Evidence: "I plan on doing as little screen time as possible during the holiday... have this GitHub activity chart be completely empty" #### โฑ๏ธ [05:45](https://youtu.be/gL3x3AvhBBk?t=345) โ€” [H1] Pagination Joins Bug Fix - Key idea: Fixed issue where pagination didn't copy joins to count queries - Evidence: "The problem here was something with query builders being cloned and not using the right copying everything over" #### โฑ๏ธ [12:15](https://youtu.be/gL3x3AvhBBk?t=735) โ€” [H2] Redis Session Manager Addition - Key idea: Community contributor added Redis session support - Evidence: "This pull request is adding Redis sessions... we support database sessions and file sessions" #### โฑ๏ธ [18:30](https://youtu.be/gL3x3AvhBBk?t=1110) โ€” [H1] DocBlock Parsing vs PHP Parser Discussion - Key idea: Complex debate about supporting short class names in DocBlocks - Evidence: "The problem here is that we only support fully qualified class names in our DocBlocks" #### โฑ๏ธ [25:20](https://youtu.be/gL3x3AvhBBk?t=1520) โ€” [H2] PHP Generics Wishlist - Key idea: All current solutions are workarounds for PHP's lack of generics - Evidence: "The best solution would just be PHP having generics folks and anything else is just not really great" #### โฑ๏ธ [32:45](https://youtu.be/gL3x3AvhBBk?t=1965) โ€” [H1] IDE Support Philosophy - Key idea: Framework designed to work best with proper IDE tools - Evidence: "I want to write a framework that works with the right tools... just use a proper IDE don't use a text editor" #### โฑ๏ธ [38:10](https://youtu.be/gL3x3AvhBBk?t=2290) โ€” [H2] Static Analysis as Core Language Feature - Key idea: DocBlocks serve as runtime-affecting code, not just documentation - Evidence: "Static analysis is an integral part of the language itself... I want PHP to ship with a built-in static analyzer" #### โฑ๏ธ [45:00](https://youtu.be/gL3x3AvhBBk?t=2700) โ€” [H1] Community Poll on Attribute Support - Key idea: Live polling community about adding attribute-based relation definitions - Evidence: "Add has many class name support or not? Yes. No. Start." #### โฑ๏ธ [52:30](https://youtu.be/gL3x3AvhBBk?t=3150) โ€” [H2] Rejecting Complex Workarounds - Key idea: Decision to reject PHP parser implementation for simplicity - Evidence: "I don't want to add layers upon layers of dealing with PHP's shortcomings" #### โฑ๏ธ [55:15](https://youtu.be/gL3x3AvhBBk?t=3315) โ€” [H1] Documentation Update Solution - Key idea: Simple solution through documentation rather than code complexity - Evidence: "Types in DocBlocks must always be fully qualified and not use short class names" #### โฑ๏ธ [58:45](https://youtu.be/gL3x3AvhBBk?t=3525) โ€” [H2] Framework Growth Discussion - Key idea: Uncertain about Tempest reaching Laravel's scale, focused on current community - Evidence: "I don't think Laravel 10 years ago had the intention to be where it is today... we have around 78 people who have contributed" ## ๐Ÿ“š References - [Tempest Framework Documentation](https://tempestphp.com) - [Laravel Lift Package](https://github.com/WendellAdriel/laravel-lift) - [PHP RFC for Generics](https://wiki.php.net/rfc/generics) ## ๐Ÿ—ฃ๏ธ Paraphrase - Maintaining an open source framework requires balancing technical purity with practical developer experience needs - The PHP ecosystem's limitations around generics force framework authors into complex workarounds that often feel unsatisfying - Community engagement through live coding sessions helps maintain momentum and gather feedback on architectural decisions ## ๐Ÿ“ฐ Newsletter **Tempest Framework Development: Balancing Pragmatism and Principles** The latest Tempest development stream highlighted a common challenge in PHP framework development: working around language limitations while maintaining clean, intuitive APIs. Key developments include fixes for pagination joins, Redis session support, and important architectural decisions about DocBlock parsing. The team chose simplicity over complexity, requiring fully qualified class names in relation DocBlocks rather than implementing complex parsing solutions. This decision reflects a broader philosophy in modern PHP development - sometimes the most maintainable solution isn't the most convenient one for developers. Resources: [Tempest Docs](https://tempestphp.com), [GitHub Repo](https://github.com/tempestphp/tempest-framework), [Community Discord](#) ## โœ… Action Items #### DevRel - Developer advocacy: Continue live streaming development sessions for community engagement - Education: Document architectural decision-making process for framework contributors - Developer experience: Balance framework simplicity with developer convenience #### Community - Maintainers: Establish clear contribution guidelines for complex architectural changes - Contributors: Encourage small, focused pull requests over large refactoring attempts - Ecosystem: Build relationships with IDE tool makers for better framework support #### FAIR - Technical independence: Avoid over-dependence on external parsing libraries - Policies: Maintain clear stance on code quality vs convenience trade-offs ## ๐Ÿงช Hypotheses - Live streaming open source development increases community engagement and contribution quality - Requiring fully qualified class names in DocBlocks will improve framework performance and maintainability - PHP generics support would eliminate most current framework architecture debates - Developer tool quality significantly impacts framework adoption and user satisfaction ### ๐Ÿ“Š Methodology - Community feedback through live chat and polls during development sessions - Performance benchmarking of different DocBlock parsing approaches - Contribution quality analysis before and after implementing stricter guidelines ### โ“ Questions - How can PHP framework authors better advocate for language-level improvements like generics? - What's the optimal balance between developer convenience and code maintainability? - How do live development streams impact open source project sustainability? ### ๐Ÿ”ฎ Future Research - Impact of live development streaming on open source project health - Developer experience metrics for different PHP ORM approaches - Community decision-making processes in technical architecture choices ### ๐Ÿ’ก Implications - Practice: Framework maintainers should prioritize long-term maintainability over short-term convenience - Policy: Open source projects benefit from transparent decision-making processes - Education: Live coding sessions serve as valuable educational content for framework users - Community: Regular engagement helps maintain project momentum during difficult technical decisions ### ๐Ÿง  Learning Styles Assessment Reading level estimate: Grade 12-14 (technical content) #### ๐Ÿ‘€ Visual learners - Present: Code examples, IDE screenshots, GitHub interface - Improve: Architecture diagrams showing framework relationships #### ๐Ÿ”Š Aural learners - Present: Live commentary explaining technical decisions - Improve: Post-stream audio summaries of key decisions #### ๐Ÿ—ฃ๏ธ Verbal learners - Present: Real-time explanations of code concepts and trade-offs - Improve: Glossary of framework-specific terminology #### ๐Ÿงฉ Kinesthetic learners - Present: Live coding demonstrations, interactive problem-solving - Improve: Hands-on exercises for contributing to the framework ### ๐Ÿ“Š Accessibility Assessment #### Screen reader semantics - Present: Clear code structure and verbal descriptions - Improve: Better alt text for code screenshots in documentation #### Keyboard navigation - Present: Standard IDE keyboard shortcuts demonstrated - Improve: Document accessibility features of development setup ### ๐ŸŒ DEIB Assessment #### Cultural breadth - Present: International community participation in live chat - Improve: Consider timezone rotation for live streams #### Inclusive language - Present: Professional, respectful technical discussion - Improve: Avoid dismissive language about different development approaches ### โœ… Logical Validity #### Strong reasoning - Deductive strength: Clear logical progression from PHP limitations to design decisions - Causal reasoning: Well-explained connections between technical choices and outcomes #### Tone of voice - Overall tone: Professional yet conversational, showing both expertise and uncertainty appropriately ### ๐Ÿ›ก๏ธ DARVO Analysis No concerning patterns detected - discussion maintains focus on technical merit rather than personal attacks. ## ๐ŸŽฏ Conclusion This development stream demonstrates the complex balance required in open source framework development. The decision to reject complex DocBlock parsing in favor of simpler, fully-qualified class name requirements reflects a mature approach to technical debt management. The live streaming format provides valuable transparency into decision-making processes while building community engagement. For WordPress developers, similar principles apply when choosing between convenience and maintainability in plugin and theme development. The emphasis on proper development tools and static analysis points toward a future where PHP development becomes more structured and predictable, benefiting the entire ecosystem. ## ๐Ÿงฑ Refactor Appendix ### ๐Ÿ“š Literature Split Pad ### [H1] Open source maintenance requires balancing contributor effort with architectural integrity > [!quote] The daily open source grind by [[Brent Roose]] via [[YouTube]]. Published 2024-12-19. Accessed 2024-12-19. > "I really appreciate that you spent so much time on this but I don't want to add layers upon layers of dealing with PHP's shortcomings." Framework maintainers must sometimes reject well-intentioned contributions to preserve long-term architectural health. [view highlight](https://youtu.be/gL3x3AvhBBk?t=3150#H1) #opensource #architecture ID:rw_001 ### [H2] Live coding builds stronger open source communities > [!quote] The daily open source grind > "We have around 78 people who have contributed... enough people were excited about it that it was worth looking further into." Transparent development processes through streaming create engaged contributor communities around technical projects. [view highlight](https://youtu.be/gL3x3AvhBBk?t=3525#H2) #community #devrel ID:rw_002 --- ### ๐Ÿ”– Atomic Split Pad (Zettel Candidates) #### [Z1] PHP's lack of generics forces architectural compromises - Applies to all PHP frameworks dealing with typed collections - Timestamp: 25:20 - Links: [[PHP-Language-Limitations]] [[Framework-Architecture]] #### [Z2] Developer tooling philosophy affects framework adoption - Quality IDE support can justify more verbose syntax requirements - Timestamp: 32:45 - Links: [[Developer-Experience]] [[Tool-Integration]] --- ### โœ๏ธ Fleeting Queue - [F1] Research IBM Plex Mono font for code display โ€” beautiful monospace option #design #fonts - [F2] Investigate PHPStorm GitHub integration workflow โ€” could improve PR review process #tools #workflow - [F3] Document cache clearing issues in production deployment โ€” affects multiple projects #deployment #debugging --- ## Full Transcript [00:04] [music]<br>[00:13] [music]<br>[00:16] are<br>[00:18] [music]<br>[00:25] [music]<br>[00:37] heat. [music]<br>[00:53] >> [music]<br>[00:57] [music]<br>[01:03] [music]<br>[01:10] [music]<br>[01:15] [music]<br>[01:25] [music]<br>[01:31] [music]<br>[01:40] [music]<br>[01:44] [music]<br>[01:48] >> Hello. Hello. Hello.<br>[01:53] Let's post everything everywhere.<br>[01:58] I made it.<br>[02:00] I made it.<br>[02:12] Uh, let's see. Hang on a second. I'm<br>[02:14] just posting everything. [sighs]<br>[02:18] Pure Tempest stuff today.<br>[02:25] Hello, folks. Oh, and I forgot to pop<br>[02:28] out my chats.<br>[02:30] And that's all fine. Yeah, folks. It's<br>[02:32] uh [laughter] I uh was considering not<br>[02:36] streaming today, actually. Um so my<br>[02:39] daughter is still sick. Pretty sick<br>[02:41] actually. She's not getting better. Um<br>[02:44] but she'll be fine eventually. Uh but<br>[02:47] I'm getting sick as well. You might hear<br>[02:50] that actually from my voice. I don't<br>[02:51] know. Um I hear it. [laughter]<br>[02:55] So, so yeah, actually I maybe I should<br>[02:57] just get a bit closer to my microphone<br>[02:59] and you know whisper hello. Uh no,<br>[03:02] that's going to be awkward. Uh<br>[03:04] [laughter]<br>[03:04] but um yeah, my uh my throat is uh<br>[03:10] acting up. So uh yeah, I'll see how uh<br>[03:13] how far I can uh get along. But I I did<br>[03:17] want to do some stuff today, so might as<br>[03:20] well give it a try. Actually, it was my<br>[03:22] wife saying, "No, don't don't be a baby<br>[03:24] and just just stream."<br>[03:29] Which I guess is a good thing because it<br>[03:31] means that now I can um<br>[03:35] uh I I will get my my streak uh two<br>[03:40] weeks non-stop stream. Well, non-stop<br>[03:42] streaming every workday. Uh<br>[03:46] so, uh so yeah, let's see here.<br>[03:49] It's it's the kids are sick, you'll get<br>[03:51] it to season. Same same. Yeah.<br>[03:55] Unfortunately, I wish it was different.<br>[03:58] But uh I I had a cold for 3 months<br>[04:02] non-stop and I actually went to like the<br>[04:04] the uh specialist for it because I just<br>[04:08] didn't get better and he was like,<br>[04:10] "Yeah, just bad luck with kids. Deal<br>[04:13] with it." No, he gave me some medicine<br>[04:15] and actually helped. But uh yeah, now it<br>[04:17] is uh it's back.<br>[04:22] Ah, well uh did I spam the socials<br>[04:25] everywhere? I love this GitHub thing. I<br>[04:27] don't know if ever anyone really sees it<br>[04:29] or or or whether it's useful, but I just<br>[04:32] I like it. Uh I just create a release<br>[04:36] every time I'm going live and then uh it<br>[04:38] ends up in people's feed. We'll see. Um<br>[04:43] what else is there to say? Yeah, posting<br>[04:45] on LinkedIn now as well.<br>[04:48] Um, yeah, I want to<br>[04:51] do some Tempest stuff today.<br>[04:56] Basically, that's it. There is it's<br>[04:58] almost my holiday and I plan on doing as<br>[05:01] little screen time as possible during<br>[05:04] the holiday.<br>[05:06] Um, like I I have three weeks off and<br>[05:08] I'm really going to try to avoid my my<br>[05:10] laptop altogether. We'll see how that<br>[05:12] goes. I'm saying that now but uh I feel<br>[05:15] like it's uh this is always just such a<br>[05:18] good refresher you know to uh take real<br>[05:22] break step back and and you know have<br>[05:24] this this GitHub um [snorts]<br>[05:27] the the activity chart be be completely<br>[05:30] empty. You see, I did it the same uh in<br>[05:32] January last year. Actually, it was a<br>[05:35] pretty long period. U this also had to<br>[05:38] do with uh being away on an internal<br>[05:42] gathering with Jet Brains. So, there was<br>[05:44] some time off here, some additional time<br>[05:46] off, but you know, this this is this is<br>[05:48] good. Okay, this is a pretty long<br>[05:50] period, but um I want to try and do it.<br>[05:55] As you can see here, uh last year as<br>[05:57] well, just have some proper time off. Um<br>[06:02] over here, 2023 was uh this is I think<br>[06:06] when I started working on Tempest<br>[06:07] actually. Yeah.<br>[06:10] So uh so yeah, I'm just uh going to step<br>[06:13] away actually. Why is this Oh, this is<br>[06:16] the future. Okay. Okay, I understand.<br>[06:19] Um, I'm going to step away for um<br>[06:23] for 3 weeks and then I'll be back like<br>[06:26] re-energized, invigorated to uh do some<br>[06:29] more work. But I also figured I before I<br>[06:32] leave, I'll have to take a look at this<br>[06:34] list of pull requests at least. And um<br>[06:39] because I there are some things waiting<br>[06:41] for me basically to uh uh to reply to.<br>[06:46] So yeah, I I I need to put in the work<br>[06:49] and uh that's what I want to do today. I<br>[06:51] have no clue how interesting that will<br>[06:53] be, but we can chat while I'm doing<br>[06:56] that. Um I experience has taught me that<br>[07:00] dur uh doing live streams in general is<br>[07:04] not really productive time. So uh we'll<br>[07:07] we'll see how uh how we get along. But<br>[07:09] yeah, there are some some pull requests<br>[07:11] here and you know people have have spent<br>[07:13] time and effort doing like sending a<br>[07:16] pull request. The least I can do is give<br>[07:18] it a review, right? Um and there are<br>[07:21] some some older ones here as well which<br>[07:24] I I I'm ashamed to admit that I I've<br>[07:27] been lacking basically. Um<br>[07:31] do not disturb please. Yes,<br>[07:35] there we go.<br>[07:37] Uh so yeah, that's that's the idea. Uh<br>[07:39] let's actually start with this one<br>[07:42] because uh this was an issue I was<br>[07:43] running into just earlier today and Enzo<br>[07:46] already submitted a pull request which<br>[07:48] is really nice. Uh now the problem is<br>[07:51] I'll have to<br>[07:54] be a to um<br>[07:57] reproduce it. Let's go here. We have our<br>[07:59] feed controller<br>[08:01] and uh so what was happening? We've made<br>[08:05] some changes to our<br>[08:08] You know what I'm actually going to do<br>[08:09] because I still have the old code over<br>[08:11] here. Um, we made some changes in a<br>[08:14] recent release and it broke some<br>[08:15] something and I want to uh to fix that.<br>[08:17] So, home controller. Uh, let's see. Um,<br>[08:26] yeah, it's it's<br>[08:29] I think uh this query over here. Let's<br>[08:32] see. Um so the difference between<br>[08:38] uh<br>[08:41] this one and this query here is that<br>[08:43] this uses the pagionate function and<br>[08:46] there is a problem there. So so let's um<br>[08:48] let's just see. I think this will crash.<br>[08:50] I hope it crashes because then I have a<br>[08:52] uh a reproducible example<br>[08:56] um feed. Yeah. Okay. So this is good.<br>[08:59] This is the bug and Enzo has submitted a<br>[09:02] pull request for it. So let's uh what is<br>[09:04] pagionation joins composer JSON uh let's<br>[09:09] do<br>[09:11] def uh pag uh fe<br>[09:20] pagination<br>[09:21] joints<br>[09:24] composer up let's see<br>[09:30] and so the error is gone<br>[09:33] That is perfect. Yes.<br>[09:37] Um actually I might as well then<br>[09:40] fix what I was do. Ah but this is No, I<br>[09:44] don't want to fix it because I I<br>[09:45] actually don't want pagionation here.<br>[09:47] But but okay, that's the uh the thing I<br>[09:50] had to check. So let's uh revert that.<br>[09:54] Let's uh quickly review it as well.<br>[09:57] Let's check where Enzo didn't do<br>[09:59] anything weird. I don't think uh um<br>[10:05] I know what you're missing. Relative<br>[10:07] line numbers plus Vim motions.<br>[10:09] Otherwise, your PHP storm setup is<br>[10:11] superb.<br>[10:12] Really? It's rel like Vim. What is Vim<br>[10:15] motions? Uh<br>[10:18] are commands for fast efficient cursor<br>[10:19] movement. Yeah. Yeah. Yeah. Uh<br>[10:23] I don't think I like that. Relative<br>[10:25] lines. H maybe that. Is that a plugin?<br>[10:28] Actually, let's try it out. Oh, and I<br>[10:31] need to zoom in. I want I want 110%<br>[10:34] today. I don't know. I want some more uh<br>[10:37] like a screen estate uh relative. No<br>[10:41] plugins, please.<br>[10:43] Line marketplace.<br>[10:46] Oh, there are like<br>[10:49] let's see what uh<br>[10:51] [snorts]<br>[10:54] replaces the line numbers in the gutter<br>[10:56] with values relative to the car<br>[10:57] position. Okay, so let's install it.<br>[11:00] Let's let's give it a try, you know. Uh<br>[11:08] should I Yeah. Okay.<br>[11:13] I don't know if I like that. There's so<br>[11:16] much motion now. Like everything's<br>[11:18] changing. I'll I'll give it a try for uh<br>[11:22] it's in settings. Is this actually just<br>[11:29] in<br>[11:34] I like line numbers.<br>[11:38] Oh, it's not even okay. I didn't know.<br>[11:43] Hey, I work for Jet Brains, but<br>[11:46] line number.<br>[11:49] Oh, no. This was part of the This was<br>[11:52] the plug-in.<br>[11:54] Okay. Okay. Let's enable it again.<br>[11:59] Relative line numbers. Boom. Save. Okay.<br>[12:04] Uh, yeah. I'm not sure.<br>[12:10] So, so undefin explain to me why you you<br>[12:13] like this.<br>[12:16] Search for show line numbers and then<br>[12:18] show line numbers.<br>[12:22] Uh,<br>[12:26] okay. Yeah. So, it is<br>[12:29] hang on. So, let's disable the plug-in<br>[12:31] again.<br>[12:35] Uh, relative line numbers. We don't need<br>[12:38] it anymore.<br>[12:40] Uh, save.<br>[12:42] Okay.<br>[12:48] Yeah. Okay. It's basically the same,<br>[12:49] right? Um, I'm using Vim, so that's why<br>[12:53] it's great you know where you'll jump,<br>[12:56] right? Yeah. Uh,<br>[12:59] deny.<br>[13:02] So then you can say, I want to jump to<br>[13:04] line eight, for example. Like I reckon<br>[13:08] you do something like plus eight. I<br>[13:10] don't know if that<br>[13:18] Yeah. Uh line.<br>[13:21] What was it? Show line<br>[13:24] numbers.<br>[13:27] And what's hybrid actually?<br>[13:37] I'm going to do absolute, man. Yeah. No.<br>[13:41] Oh, it's still<br>[13:47] okay, now it's good. Hey, thanks for the<br>[13:51] distraction. [laughter]<br>[13:53] Um, we were going to to review this one<br>[13:56] real quick, right? Uh so um the problem<br>[13:59] here was something with query builders<br>[14:01] being cloned and and not using the right<br>[14:05] um<br>[14:07] like copying everything over. And on top<br>[14:09] of that, pagionation uses the count<br>[14:11] query builder which didn't have joints.<br>[14:13] So that's what we're adding here. Uh if<br>[14:16] source instance of support joins and<br>[14:18] this is in which method?<br>[14:21] Yeah. From C. Yeah. Yeah. Yeah. Yeah.<br>[14:23] Yeah. And then<br>[14:28] yeah, so there's a new interface uh two<br>[14:30] new interfaces probably. Um we need to<br>[14:34] fine-tune this some more. But this is<br>[14:35] this is the way we're what this is what<br>[14:38] we're doing right now. That's what we<br>[14:39] settled on. Uh if joins isn't uh yeah<br>[14:42] then we'll add a new uh this is in count<br>[14:46] statement with joins.<br>[14:52] [snorts]<br>[14:56] Oh then we're just copying<br>[15:04] is Enzo here.<br>[15:08] Do you ever do pull requests in in<br>[15:10] PHPstorm? Uh there is a GitHub plugin.<br>[15:13] No, I don't use it. I like this<br>[15:14] interface more actually. Um<br>[15:21] GitHub<br>[15:22] uh view pull requests<br>[15:25] and<br>[15:26] yeah, we need to look in right<br>[15:28] authorize.<br>[15:36] I can show you.<br>[15:39] Oh, but this is the wrong. I need to go<br>[15:42] to here, of course. Window<br>[15:47] GitHub. Oh, it's still indexing here.<br>[15:53] Uh, few few pull requests.<br>[16:00] Origin<br>[16:10] So this one, right? And then<br>[16:16] actually what does the does it use the<br>[16:18] diff viewer here? Huh? Hey, maybe this<br>[16:22] is a good idea.<br>[16:24] But the thing is, can I add<br>[16:29] review comments?<br>[16:31] Because I definitely like uh the diff<br>[16:33] viewer here. It's really nice,<br>[16:36] but I want to add inline comments.<br>[16:43] Okay, yours. Uh we'll try it like this.<br>[16:47] We'll try it like this. So uh and can we<br>[16:50] then check it if we So what I'm<br>[16:53] wondering about why uh don't we add the<br>[16:58] joins to the existing<br>[17:02] statement start review<br>[17:12] over here.<br>[17:14] Okay. So now I did this one. Okay.<br>[17:18] Oh, and then I have to submit my review.<br>[17:20] Okay.<br>[17:24] So, yeah. Uh, so this is this supports<br>[17:27] join supports relations. I don't really<br>[17:29] like it, but it is what it is. Um,<br>[17:33] it's okay for now. Uh, we need to make<br>[17:35] them public, of course. Yes.<br>[17:39] Okay. Scrolling here. This is Oh, this<br>[17:42] was just a wrong dog block. Sure. If<br>[17:45] Yeah. So these are the changes that um<br>[17:49] just for that<br>[17:52] and this is just a rename<br>[17:57] okay based on the interface I reckon uh<br>[17:59] let's see supports<br>[18:05] uh it was probably in this one here get<br>[18:08] result relations yeah yeah okay so this<br>[18:11] and then support joins public array<br>[18:14] joins And then relations get get all<br>[18:17] resolved relations with our joint<br>[18:18] statement. Not sure what this then does<br>[18:23] no<br>[18:26] mu is here. Who is the author of this<br>[18:28] pull request? It was an oversight after<br>[18:31] I was testing things. I'll clean it up.<br>[18:33] Okay.<br>[18:35] What software are you using for<br>[18:36] streaming OBS? Yesh.<br>[18:40] Uh uh what's upto?<br>[18:44] Good to see you and uh riffer rifer<br>[18:49] rifer 17,0002.<br>[18:53] Thank you for joining. Um<br>[18:58] the current relation names requested for<br>[19:00] eager loading. Okay. And get all<br>[19:02] resolved. What are resolved relations?<br>[19:04] Oh, okay. Relation array. Okay, that<br>[19:06] makes sense. So that's good. Um<br>[19:12] yeah. Yeah. And then the count statement<br>[19:14] also has joins of course. Yeah. Uh<br>[19:18] which we were just missing basically.<br>[19:21] And okay, that looks good. And then<br>[19:22] select query builder. Um<br>[19:26] it's just a test. Okay, cool.<br>[19:31] Missing reviewer. Set myself as<br>[19:33] reviewer.<br>[19:36] Submit. Uh request changes.<br>[19:43] It's pretty cool actually. So, let's go<br>[19:45] over here because Enzo did in fact um<br>[19:51] can I now uh can I update this branch<br>[19:56] changes from<br>[20:04] refresh review data? Yeah. Okay. I guess<br>[20:06] that's it. Yeah.<br>[20:12] Okay. And then I have this one comment<br>[20:13] here. Um<br>[20:16] ah and I guess that's what Ilmu was uh<br>[20:20] referring to. I hope that's what Ilmu<br>[20:23] was refer Okay, I'll say Enzo from now<br>[20:25] because um<br>[20:30] I hope it is. Enzo, if you if you can<br>[20:33] give me like a a check that you were<br>[20:36] replying to this uh message over here,<br>[20:39] then I can uh move on with my life<br>[20:41] basically. Uh and then after that you<br>[20:44] can merge. Okay, cool. Uh it is in fact<br>[20:48] the fact. Yes. Cool. Uh [snorts] so I I<br>[20:51] don't know Enzo if you uh<br>[20:53] saw it at the start of the stream, but<br>[20:55] this in fact does my issue. Uh does fix<br>[20:57] my issue. Wow. Words. Yes. Okay. Good<br>[21:00] morning. Uh Franken PHP worker mode is<br>[21:03] my PR still work in progress and then uh<br>[21:06] Enzo is working on this one. Is there<br>[21:08] anything else<br>[21:11] um I need to resolve this uh problem?<br>[21:20] Okay.<br>[21:22] Serializer factory has a for property<br>[21:25] used in the RM mostly true.<br>[21:30] Okay, let's re let's do it like this.<br>[21:33] And uh that means Oh, I'll Yeah, I'll<br>[21:36] just do it like Oh, now I'm back in<br>[21:37] GitHub. Stupid<br>[21:40] approve.<br>[21:45] So, this is this is a pretty cool<br>[21:48] refactor actually. It's one of these<br>[21:51] things that<br>[21:53] just had to be done and uh Enzo actually<br>[21:56] did it which is really nice.<br>[22:00] uh add reddis session manager. This is<br>[22:03] also one that's um<br>[22:06] you know just had to be done. Let's see<br>[22:09] what's I will give this a try. Which<br>[22:11] Reddit client should we support? We<br>[22:13] already have support through tempest key<br>[22:14] value store. Uh okay details in the PR.<br>[22:18] Let's see. Uh because there was some<br>[22:21] discussion here before questions. Do we<br>[22:22] need actions in a cleanup function? Uh<br>[22:27] let's let's just first Okay. Sorry.<br>[22:29] Let's do it like this. Uh,<br>[22:34] I'll Can I now<br>[22:37] search for<br>[22:39] for this<br>[22:42] search?<br>[22:46] Mhm.<br>[22:51] View timeline. What does that do?<br>[22:55] Oh, an AI assistant actually gives like<br>[22:56] a summary of the Oh, that's that's<br>[22:58] pretty cool as well. View timeline. Oh,<br>[23:00] that's probably just this. Okay. Okay.<br>[23:04] So, uh Reddis session config. Uh let's<br>[23:07] just take a look at session uh config.<br>[23:10] Right now, we have file session config,<br>[23:12] right? Um<br>[23:15] so that we only well we support database<br>[23:18] sessions and file sessions. Uh and and<br>[23:23] this pull request is adding radius<br>[23:26] radius sessions.<br>[23:28] Uh do we yeah okay let's let's first<br>[23:31] look at this. So config that makes sense<br>[23:33] in yeah and done. Ah you know what we<br>[23:37] need to do here because this is in<br>[23:41] let's take a look.<br>[23:44] So this is in HTTP.<br>[23:49] We actually don't do this in<br>[23:56] h but<br>[23:59] this is no this is<br>[24:05] so the the problem here is that HTTP<br>[24:08] doesn't have a dependency on radius on<br>[24:11] tempest key value store right which is<br>[24:14] okay if you just install it as a<br>[24:17] standalone thing then that's fine. Um<br>[24:21] you only want this class to exist when<br>[24:24] tempest key value store is available. So<br>[24:26] what you actually need to do uh yeah<br>[24:28] this view is read only uh rep with uh<br>[24:34] guard<br>[24:36] check so that uh this class is only<br>[24:41] available when key value store<br>[24:46] is<br>[24:48] installed. Um,<br>[24:52] where do we do this<br>[24:55] if class?<br>[25:03] Yeah. So,<br>[25:06] uh,<br>[25:08] see for example.<br>[25:18] Mhm. In this case, uh you'd have to wrap<br>[25:23] it. You have to check for and now let's<br>[25:26] see in key value store which class makes<br>[25:30] sense<br>[25:33] for uh the existence of<br>[25:38] okay<br>[25:42] and actually we need to do that for the<br>[25:43] database session config as well.<br>[25:47] Ah, but this<br>[25:50] no maybe it's not necessary because this<br>[25:52] is config.<br>[25:55] Uh, let's see. Let's see. Let's uh go to<br>[25:57] our<br>[25:59] pull request again.<br>[26:12] [snorts] Yeah, because none of this is<br>[26:14] discovered actually.<br>[26:18] So I can remove my comment. It's not<br>[26:20] it's not a problem. Reddit session test.<br>[26:24] Yeah, I think this is like assuming all<br>[26:27] of this works which I assume has been<br>[26:30] tested.<br>[26:34] I think that should be fine. Let's see<br>[26:36] what was uh so questions. Do we need<br>[26:38] actions in cleanup function when we set<br>[26:40] the expiration on the Reddit store data?<br>[26:42] Is the Reddit session config uh the<br>[26:45] right way to set a prefix for session<br>[26:47] keys? Do we need multiple tag Reddit<br>[26:49] setups? How can we set up the Reddis<br>[26:51] client to a different database for<br>[26:53] sessions? In this scenario, [snorts]<br>[26:55] Laravel uses multiple configuration and<br>[26:58] treats Reddits as a database.<br>[27:05] uh the radis cache uh client itself<br>[27:08] allows to set the prefix for the client<br>[27:09] as a whole. From my understanding to<br>[27:11] support that we need a tagged yeah<br>[27:13] session radis client. I don't understand<br>[27:15] how to do that without touching the key<br>[27:17] value store for example. Yeah. Uh let's<br>[27:19] see what did Enzo say about this.<br>[27:26] Good question. And the key value store<br>[27:28] doesn't support tech configs yet, but<br>[27:30] this should be the way to go if you want<br>[27:32] multiple database support. With the<br>[27:33] prefix, I'd assume it'd be better uh it<br>[27:37] would be pretty safe to have sessions on<br>[27:38] the same database as the cache though,<br>[27:41] but I admit I don't know what are the<br>[27:44] best practices here. Okay,<br>[27:54] I'm going to do this in GitHub.<br>[27:57] find this<br>[28:00] for now. Uh I don't think we should uh<br>[28:06] widen the scope of this PR and just<br>[28:11] assume one<br>[28:14] uh<br>[28:16] radis instance. Uh<br>[28:20] we can refactor uh we can add uh tagged<br>[28:25] radice configs later but let's not<br>[28:31] complicate<br>[28:32] this PR with it.<br>[28:35] Apart from that, all looks fine.<br>[28:41] [snorts]<br>[28:57] Um,<br>[28:59] yeah,<br>[29:02] let's approve.<br>[29:04] Actually,<br>[29:07] I can just merge this, right?<br>[29:10] What?<br>[29:12] No. H this this is this is stupid with<br>[29:15] the GitHub interface. Now I need to go<br>[29:17] back here and then I need to uh<br>[29:23] where where now do I find like that?<br>[29:31] I never know. There's one request to<br>[29:33] change. What is that requested change?<br>[29:35] How do I show that requested change?<br>[29:41] Must I like scroll through here? Is<br>[29:42] there a better way of doing that?<br>[29:46] Like these are<br>[29:49] resolved, I reckon. So, what's the<br>[29:51] request to change? Can I go over here?<br>[29:57] No.<br>[29:59] No.<br>[30:05] Yes, but where I know, but where is the<br>[30:07] request to change?<br>[30:18] So, I thought there was a way to show it<br>[30:20] over here<br>[30:24] with<br>[30:26] Yeah, because these are the resolved<br>[30:27] conversations, right? Yeah. Okay. This<br>[30:29] is what I was looking for. They are all<br>[30:31] resolved. So, what's the requested<br>[30:33] change?<br>[30:35] Enzo, do you know it's your change? But<br>[30:38] I<br>[30:41] Yeah,<br>[30:51] I'll just tag Enzo.<br>[30:54] Did you still have a an open change<br>[30:58] request?<br>[31:03] If anyone knows, let me like tell me in<br>[31:06] chat because<br>[31:09] few reviewed changes.<br>[31:12] Boom.<br>[31:14] This is just uh the diff.<br>[31:23] Since since I requested changes, GitHub<br>[31:25] wants me to re-review even though the<br>[31:27] conversations are resolved. Oh, really?<br>[31:30] Okay. So, I can basically Okay, you<br>[31:32] recruit. Okay.<br>[31:36] I see.<br>[31:38] It's weird, right? I find it weird, but<br>[31:43] it's what it is. Okay. Uh,<br>[31:46] next one. PHP parser implementation of<br>[31:49] Yeah.<br>[31:54] So the problem here is that we don't<br>[31:55] support<br>[32:00] okay these are two alternatives. Okay<br>[32:03] let's see I've managed to make PH um PHP<br>[32:05] parser implementation which is needless<br>[32:07] to say much more elegant uh PHP parser<br>[32:10] implementations here. If someone could<br>[32:12] perhap benchmark both implementations<br>[32:14] I'd be grateful.<br>[32:17] Okay, so what hap the problem here is<br>[32:19] that we only support fully qualified<br>[32:22] class names in our um in our dog blocks<br>[32:26] and Tempest actually relies on uh some<br>[32:29] dog blocks for example to determine<br>[32:33] um<br>[32:36] relations with with model for model<br>[32:38] properties and that's because PHP<br>[32:40] doesn't have generics. It's always<br>[32:42] generics. Um so this doesn't work<br>[32:48] and so here are two solutions<br>[32:52] and we'll check them out. Uh let's see.<br>[32:55] So we have<br>[32:57] uh this is in property reflector right<br>[32:59] which is the good the right place. Uh<br>[33:01] use statement cache<br>[33:04] resolve type. Mhm. Mhm. And so we have<br>[33:08] this method here<br>[33:10] get iterable type which will get the doc<br>[33:13] comment and then do some<br>[33:17] uh regax matching on it. Mhm. And then<br>[33:21] we'll<br>[33:26] determine the type based on that. But if<br>[33:29] you have this, the regax will match<br>[33:32] this.<br>[33:34] But that's not a valid type because you<br>[33:35] don't have its fully qualified class<br>[33:37] name. So what's need what needs to<br>[33:39] happen over here is if it contains<br>[33:43] uh backslashes, we'll just assume it's a<br>[33:45] fully qualified class name, which isn't<br>[33:48] entirely correct by the way because you<br>[33:49] can import um namespaces and then type<br>[33:54] them from there. But<br>[33:57] and this is why I say [laughter]<br>[33:59] do block parsing is is such a mess and I<br>[34:03] just wanted fully only fully qualified<br>[34:05] class names. Um<br>[34:09] [snorts] and and Adrian is saying could<br>[34:11] be an attribute returns array class name<br>[34:13] and this is not true Adrian because the<br>[34:15] reason we're doing it like this is<br>[34:18] because this way we also get autocomp<br>[34:20] completion and static analysis on this<br>[34:23] array. So you you could of course you<br>[34:26] could do it like this. Um let me let me<br>[34:30] copy that uh over here. Uh<br>[34:37] so you you could define a property like<br>[34:40] this<br>[34:43] but then uh you wouldn't have any static<br>[34:45] insights and and then you would end end<br>[34:48] up just adding at var uh uh<br>[34:53] yeah uh reviewer<br>[34:59] like this app reviewer for example.<br>[35:03] then you would add the dog block anyway<br>[35:05] because you want static analysis. So if<br>[35:07] you need to write this anyway, why would<br>[35:08] you then add this? Because we can parse<br>[35:11] this. That's the<br>[35:15] the reason for it.<br>[35:18] Uh so we're resolving the short class<br>[35:20] name declaring class. We get the<br>[35:22] declaring class and then we uh do this<br>[35:26] with we catch this. That does make<br>[35:28] sense. Yeah. Um<br>[35:31] and we do this. What's the cache key?<br>[35:33] The claring class name and the short<br>[35:36] name.<br>[35:39] Mhm. Okay.<br>[35:44] Come on, Brand. You work at Jet Brains.<br>[35:46] Just make them support Tempest hashtag<br>[35:48] returns. Yes. So that this is the the<br>[35:50] way to do it. Yes, true. Um<br>[35:54] [laughter]<br>[35:55] but believe me, it's not as easy as just<br>[35:57] making them do it. [laughter] Uh yeah,<br>[36:01] that's uh yeah,<br>[36:05] I do think this is an unfortunate case<br>[36:07] of inconsistency.<br>[36:09] I understand why, but it doesn't feel<br>[36:10] tempesty. Yes. You know what we could do<br>[36:13] is is um<br>[36:17] we actually the right way of doing it<br>[36:19] would would be like this, right? Uh well<br>[36:22] no the the best way of doing it would be<br>[36:25] this<br>[36:26] uh array<br>[36:29] or collection I don't know but of course<br>[36:32] this doesn't work in PHP so we need to<br>[36:34] work around anyway uh we could do it<br>[36:36] like this<br>[36:39] and actually this<br>[36:42] if I'm not mistaken<br>[36:45] uh is already possible<br>[36:49] uh no It's not possible. We we could<br>[36:52] make it work like this and then we could<br>[36:54] have the tempest plugin infer this and<br>[36:57] know that the like the array type should<br>[37:01] be this for example. We could make that<br>[37:04] work but then you would need a a a<br>[37:05] plug-in to do so. So and and the Tempest<br>[37:10] plugin is still very much work in<br>[37:11] progress. Um,<br>[37:14] so yeah,<br>[37:17] I'm not sure to be honest. I wouldn't<br>[37:20] mind the repetition class naming<br>[37:21] attribute and at far as well just for<br>[37:23] IDE support. I'm not sure. I mind the<br>[37:25] repetition<br>[37:27] and you would need a PHP stand rule. PHP<br>[37:29] stand indeed wouldn't understand that as<br>[37:31] well. So it's just it adds a lot of<br>[37:37] it it's not like the a good solution.<br>[37:40] The best solution would just be PHP<br>[37:42] having generics folks and anything else<br>[37:45] is just not really great. [laughter]<br>[37:49] Um,<br>[37:51] repetition could be optional uh like you<br>[37:54] allow it to be passed in the attribute<br>[37:56] but if you prefer you just in infer it<br>[37:58] from atvar.<br>[38:04] Yes.<br>[38:06] Ah yeah. Okay.<br>[38:10] Yeah.<br>[38:11] Yeah, we could.<br>[38:16] And like the reason for this is that we<br>[38:18] wouldn't have to parse dog blocks.<br>[38:19] Basically,<br>[38:24] it would be a pretty simple feature to<br>[38:28] to add. Actually,<br>[38:30] uh<br>[38:32] like<br>[38:34] we we could even do it on this level<br>[38:36] here. And um for for example have an<br>[38:39] interface<br>[38:41] uh interface has iterable type something<br>[38:45] like that and have um uh public<br>[38:51] uh type<br>[38:54] uh type reflector<br>[38:58] uh getable<br>[39:01] type get like this. We could do it like<br>[39:05] this. and then R has many.<br>[39:09] I could implement has iterable type<br>[39:15] and then return like the whatever is<br>[39:18] configured there that that could work.<br>[39:20] And then um over here in get iterable<br>[39:24] type we could easily do if this we are<br>[39:29] in the the property like so has<br>[39:32] attribute has iterable type<br>[39:36] uh<br>[39:38] if<br>[39:41] return this get attribute has ital type<br>[39:45] iterable type something like this that<br>[39:47] would work.<br>[39:52] Um<br>[39:55] yeah, it would be a breaking change<br>[39:57] because um we would change the we would<br>[40:02] have to change the constructor of as<br>[40:03] many because now it just takes owner<br>[40:05] join and relation join. Uh it wouldn't<br>[40:08] be a breaking change if we do it like<br>[40:10] this.<br>[40:12] uh string<br>[40:16] class name.<br>[40:25] Okay. But even if we do that which okay<br>[40:28] might be an interesting feature might be<br>[40:32] um because if you if you were to do it<br>[40:35] then if you were to use this part you<br>[40:37] wouldn't have to rely on dog block<br>[40:39] parsing which is string parsing which<br>[40:42] isn't like it does a regax match it's<br>[40:44] not super performant right um<br>[40:53] I'll make an issue for<br>[40:55] uh support iterable type uh<br>[41:00] for has many I'm just going to paste my<br>[41:04] scratch file here<br>[41:07] just a scratch<br>[41:10] so that I don't forget basically<br>[41:14] and then<br>[41:17] fall back to doc<br>[41:20] block parsing thing.<br>[41:34] PHP stand and repetition are red flag.<br>[41:38] Go with dog block for now.<br>[41:40] [laughter]<br>[41:43] Conflicting opinions here.<br>[41:47] Yeah, but this is ah the PHP stand part<br>[41:50] that's also important. Maybe I'll just<br>[41:52] close my issue.<br>[41:54] No, I'm going to close it.<br>[41:57] [laughter]<br>[41:59] No, I don't think<br>[42:05] I I see I see no I see like no use case<br>[42:11] where you wouldn't add the dog block<br>[42:13] because who wants to work with these<br>[42:16] type of uh typed data objects basically<br>[42:21] without having autocomp completions on<br>[42:22] the array. Keep your issue man up. Keep<br>[42:26] your issues open. Uh [laughter]<br>[42:32] uh<br>[42:35] I'm conflicted about this. Okay, you<br>[42:38] know what? Uh I'll reopen it up for<br>[42:42] discussion.<br>[42:47] [snorts]<br>[42:48] Uh and I'm not going to I'm going to add<br>[42:51] backlog here because I don't actually<br>[42:53] know whether we'll do it or not.<br>[42:55] Regardless of whether we do this or not,<br>[42:58] we'll have to still have the fallback<br>[43:00] for dot block. So, we still need this<br>[43:02] pull request,<br>[43:04] which is a good thing. I also noticed<br>[43:07] that my face is on top of the diff view<br>[43:10] here.<br>[43:14] You can support has iterable type for<br>[43:15] performance and keep the dog block for<br>[43:17] ID support. Yes, I know. But that's<br>[43:19] that's also not a tempest thing to do.<br>[43:22] You know, just write one thing. don't<br>[43:24] don't have like multiple configuration<br>[43:28] options there to to make it all work in<br>[43:30] all cases. That's not a like the frame<br>[43:33] tempest can figure it out based on the<br>[43:34] do block you know why then should you<br>[43:37] write more that's but okay I get the<br>[43:40] argument of it being inconsistent<br>[43:43] uh in this case I think repetition is<br>[43:45] not a bad comp okay you know what you<br>[43:47] know what we're going to do uh Paul uh<br>[43:51] add uh<br>[43:55] has many uh class name<br>[44:00] support or not?<br>[44:03] Yes.<br>[44:05] No. Start.<br>[44:09] Go ahead. And now I need to just make<br>[44:11] sure.<br>[44:14] Can I?<br>[44:19] Oh, it's always good doing a vote.<br>[44:23] [laughter]<br>[44:26] Voted for no.<br>[44:29] Okay. We'll see. We'll see how how this<br>[44:31] evolves. [laughter]<br>[44:33] Um going back to the pull request then.<br>[44:38] So uh we have our get iterable type<br>[44:40] here. We have uh yes we do this which<br>[44:44] isn't correct but okay maybe it's good<br>[44:47] enough otherwise we'll do a resolve<br>[44:50] short class name from uh yes we get the<br>[44:54] declaring class uh the cache key and<br>[44:57] then do resolve. I I don't really like<br>[44:59] this this pattern here, but okay. Um,<br>[45:03] but get a file. And so this is the<br>[45:05] problem with with imports by the way.<br>[45:07] You don't get reflection on them. If we<br>[45:09] got reflection, it wouldn't matter, but<br>[45:10] we actually have to do get the file<br>[45:12] name, right? Uh, and this is why all<br>[45:15] this caching is required as well. Uh,<br>[45:17] will we'll have to parse the use<br>[45:20] statements. And this this will file get<br>[45:22] contents.<br>[45:24] This is so ugly, right?<br>[45:27] uh then we'll tokenize that content then<br>[45:32] so and like we're already going down a<br>[45:35] huge rabbit hole and this this okay we<br>[45:38] have some caching in between but this is<br>[45:39] being done for<br>[45:42] every<br>[45:43] time we we call iterable type right well<br>[45:46] no we do it when there's no backslashes<br>[45:49] in the name okay<br>[45:52] uh so people who decide to use fully<br>[45:54] qualified names won't get affected by<br>[45:56] this.<br>[46:00] And so basically I reckon this pull<br>[46:03] requests then uh this version adds a<br>[46:06] like an actual parser for all of this.<br>[46:17] So this is just okay this this is just<br>[46:19] finding out the the the thing and we<br>[46:22] have we need alias support uh skip<br>[46:25] whites space tokens parse namespace name<br>[46:29] blah blah blah parse alias parse group<br>[46:32] use which is also a thing do you see how<br>[46:34] how like complex all of this becomes get<br>[46:38] short name then [snorts] and now the<br>[46:40] complexity I don't really mind but the<br>[46:41] file get contents<br>[46:44] while this code is running. It's just<br>[46:48] that's that's file IO, right? That's<br>[46:50] that's not good.<br>[46:52] That's not a good idea. Uh where's this<br>[46:55] PHP token class then?<br>[47:02] PHP token.<br>[47:08] Oh, what is this? Is this PHP token?<br>[47:15] Hang on.<br>[47:18] PHP token.<br>[47:20] Is this just built into PHP? Yeah, it<br>[47:24] is. This class provides an alternative<br>[47:26] to token get all while the function<br>[47:28] returns tokens either as a single.<br>[47:32] Okay. I didn't know that was part of<br>[47:33] PHP. But still, I mean, we need to jump<br>[47:36] through a lot of hoops here.<br>[47:42] you can support uh I get your point, but<br>[47:45] we do have to work around PHP's<br>[47:47] limitations and relying on something<br>[47:49] that has poor performance is not great.<br>[47:51] No. So, I don't like parsing fully<br>[47:53] qualified doc blocks. Uh like non fully<br>[47:55] qualified doc blocks and then I format<br>[47:58] the file and remove the fully qualified<br>[48:00] name from dock block.<br>[48:02] Yeah.<br>[48:05] Mhm.<br>[48:07] Okay. So apparently many people like it<br>[48:09] and the poll [laughter]<br>[48:12] um<br>[48:15] let's see we would use a collection for<br>[48:17] a DDD model of an array of emails and<br>[48:20] PHP limitations is what would force us<br>[48:22] to use doc blocks not our own API.<br>[48:26] Yeah. So so you're talking about custom<br>[48:28] collection classes if I'm not mistaken.<br>[48:32] One thing is is telling Tempest how to<br>[48:34] build the model. The other thing is<br>[48:37] telling PHP the IDE how to understand<br>[48:39] it. No, I get that. I get that. It's<br>[48:41] just like just<br>[48:44] you're all right, but just imagine it<br>[48:47] from the user's perspective. Like for<br>[48:49] real, let's let's let's open a um<br>[48:54] uh stitcher here. I I think I have some<br>[48:58] use uh<br>[49:01] uh is<br>[49:03] database model. Uh let's see. Yeah, this<br>[49:06] doesn't have any relations. Uh<br>[49:10] this neither<br>[49:17] also no has many<br>[49:22] also not. Okay, maybe this is too<br>[49:26] too simple an example. Hang on. Uh<br>[49:30] Tempest uh database<br>[49:47] >> [snorts]<br>[49:47] >> So I I already dislike that we have this<br>[49:52] to be honest, but just imagine having to<br>[49:56] write this every time.<br>[49:59] And and no, it's not it's not this. Hang<br>[50:01] on. Hang on. I'm going to show you like<br>[50:03] how stupid it is that you have to write<br>[50:05] this. Like this is exactly the kind of<br>[50:08] thing why why I I started working on<br>[50:11] Tempest because I didn't want uh hang on<br>[50:18] like this is just so stupid to me<br>[50:22] and and I'm sorry but the dog block is<br>[50:25] required like that's that's I I I<br>[50:30] don't agree with anyone saying that they<br>[50:32] don't want this dog block here that<br>[50:34] they're not going to use this. they're<br>[50:35] going to use it because that's like the<br>[50:37] whole reason we have that's the whole<br>[50:40] idea of the OM. You have typed<br>[50:42] properties and you have static insight<br>[50:44] everywhere without having to rely on<br>[50:46] weird uh plugins or IDE helpers. That's<br>[50:49] the core of what this is about. So why<br>[50:53] would you need the repetition here? Like<br>[50:55] and and I I understand that there are<br>[50:57] reasons for it, but I'm just saying like<br>[50:59] this is this is stupid. I don't want<br>[51:01] this. And yes, of course, it is a<br>[51:03] workaround because PHP doesn't have<br>[51:05] generics. I know.<br>[51:12] I know that.<br>[51:25] Dog block should only be for devs, not<br>[51:27] for declaring something. It's docs, not<br>[51:29] code.<br>[51:31] Well,<br>[51:36] so the current state of PHP today<br>[51:41] is that uh we do more with Doug blocks<br>[51:44] than just documentation. That's just a<br>[51:46] fact. Everything with that's doing<br>[51:49] static analysis<br>[51:51] like with more complex typing than<br>[51:54] supported in PHP is defined in docs.<br>[51:57] That's not documentation. At least in my<br>[51:59] opinion, that's not just documentation.<br>[52:00] That's actually an integral part of<br>[52:04] the compiler, which isn't really a thing<br>[52:06] in PHP, but that's just a part of<br>[52:10] your code in my opinion because I find<br>[52:13] these dog blocks like this type<br>[52:15] information to be a that that is a part<br>[52:19] of the language to me. It's unfortunate<br>[52:21] that we have to write it in dog blocks.<br>[52:23] Yes, but it is the only way. So I agree<br>[52:26] that in like the the the like the ideal<br>[52:30] world we wouldn't have to write it in do<br>[52:32] blocks in the ideal world we would have<br>[52:33] generics but we don't so we have to work<br>[52:36] within that boundary. Um so yeah if you<br>[52:40] want to help defs or any static analysis<br>[52:42] tool to help to understand the context<br>[52:44] it's okay but parsing it relying on it<br>[52:46] in my opinion is bad. Yeah. And so so<br>[52:50] Symfony had done this for years with<br>[52:53] annotations before we got attributes in<br>[52:55] PHP.<br>[52:57] And uh Laravel actually also did did<br>[53:00] this at in some places I think I don't<br>[53:03] remember maybe not but um<br>[53:08] and that's that's just us working around<br>[53:11] the limitations of PHP<br>[53:14] but there's like I'm not convinced that<br>[53:17] this is better than this.<br>[53:23] No, except maybe for performance<br>[53:26] reasons,<br>[53:29] but since like we only support fully<br>[53:31] qualified class names at the moment,<br>[53:34] uh there like performance is the<br>[53:37] performance impact is neglig<br>[53:40] ignored. [laughter]<br>[53:43] Um<br>[53:45] it should be far chapter in this<br>[53:47] example. True. True.<br>[53:53] >> [snorts]<br>[53:56] >> having an attribute. This is our way to<br>[53:58] declare something. Doc blocks is just<br>[54:00] support part. No, but this I disagree<br>[54:02] that that static analysis is just the<br>[54:04] support part. I think that's what I'm<br>[54:05] trying to say. I don't agree with that.<br>[54:07] For me, static analysis is um is an<br>[54:11] integral part of the of the language<br>[54:13] itself.<br>[54:18] That's where the confusion lies for<br>[54:19] developers. Is it documentation or is it<br>[54:21] logic that is going to be applied?<br>[54:25] Yeah, I understand that. I know it's a<br>[54:27] workaround, but it's just blurring the<br>[54:29] lines between code and comments. Okay,<br>[54:31] so<br>[54:34] let's make the distinction then between<br>[54:35] runtime and non-runtime code. Maybe that<br>[54:38] is a better better way of thinking about<br>[54:40] it and not documentation versus code,<br>[54:43] but runtime code versus nonruntime code.<br>[54:46] static<br>[54:48] uh<br>[54:50] aesthetic analysis is just a deaf<br>[54:52] process part<br>[54:55] I don't know<br>[54:57] I don't know<br>[55:00] um<br>[55:03] yeah I like the way I think of static<br>[55:06] analysis that's that's not the case but<br>[55:08] I I'm I'm also advocating for making PHP<br>[55:13] um like making the static analysis step<br>[55:18] required. Basically, I want PHP to ship<br>[55:20] with a built-in static analyzer and to<br>[55:22] at least have an option to force your<br>[55:24] code to be statically analyzed before it<br>[55:27] can be run to be compiled basically. So,<br>[55:33] I don't know if null is saying yeah to<br>[55:35] me or saying yeah to Ilmu. Uh could be<br>[55:39] both.<br>[55:40] We we all want PHP to have tools like<br>[55:43] Rust has. [sighs]<br>[55:45] So, circling back to the point that Mar<br>[55:49] made I think was it? Uh,<br>[55:53] no. Uh, the point that Oh, I forgot your<br>[55:56] name. I think you mentioned it in a<br>[55:58] previous stream, right? Um,<br>[56:01] so I I do appreciate people saying that<br>[56:06] this driving runtime code<br>[56:09] is weird. I can see that.<br>[56:13] Admiral Mickey. That was it.<br>[56:21] [snorts]<br>[56:28] So yours is saying this far has many<br>[56:32] actually. Um<br>[56:35] this was let's see<br>[56:40] uh<br>[56:42] I think the very first iteration of the<br>[56:45] RM looked like this<br>[56:52] but that also like<br>[56:57] doesn't there were some problems with<br>[56:59] that approach as<br>[57:03] So all of this let's see I do agree that<br>[57:06] static analysis is basically required<br>[57:08] and atvar is definitely required. My<br>[57:10] point is that requiring users to use<br>[57:12] fully qualified class names is poor dx<br>[57:14] and I'd personally rather be explicit by<br>[57:17] specifying the short class name in<br>[57:18] hashtag has many in addition to addar<br>[57:21] short class name.<br>[57:24] Yeah, I don't know. There is a there<br>[57:27] there like<br>[57:29] uh<br>[57:31] hang on. There is a short fully<br>[57:34] qualified.<br>[57:38] It's in code style somewhere I think.<br>[57:41] PHP doc uh short.<br>[57:49] Oh, now it's<br>[57:51] hang on. Let's search for his PHP doc<br>[57:54] short. No, it's not here. Uh, it's<br>[57:58] annoying that this resets. [laughter]<br>[58:00] Okay, I'll have to read through it. Hang<br>[58:02] on. Um,<br>[58:08] I thought there was an option here<br>[58:12] to Oh, yeah. Yeah, use fully qualified<br>[58:14] class names here. There's a reason this<br>[58:16] this this<br>[58:18] is an option, right? Um,<br>[58:22] and there's a reason we have this option<br>[58:24] in in formatterers as well. Um,<br>[58:30] and<br>[58:36] let's see what else. Whatever. So, so<br>[58:41] we we have two problems, right? We we<br>[58:44] don't have generics, which is always a<br>[58:46] problem. Do you like that? that like my<br>[58:48] one here starts at line number two.<br>[58:52] Um and the other problem is we don't<br>[58:56] have reflection on uh use statements.<br>[59:01] So and these two together are just like<br>[59:03] out of our control. Uh<br>[59:08] it should start with zero.<br>[59:13] Uh and and<br>[59:21] I'm so so from my point of view like I I<br>[59:24] understand that<br>[59:27] it's it's it's poor DX to to not have<br>[59:31] short class names in doc blocks. That's<br>[59:33] poor DX. I agree. But that that has been<br>[59:36] the case in PHP for forever basically<br>[59:40] that that this option is available. use<br>[59:43] fully qualified class names and it's on<br>[59:45] by default in in I I don't know with<br>[59:48] MAGO but with PHP CSS fixer previously<br>[59:51] it was on by default PHPstorm is on by<br>[59:54] default as well because because of like<br>[59:56] this limitation basically um<br>[60:01] so we are we're already making<br>[60:04] compromises<br>[60:06] and then I rather just write it once<br>[60:08] instead of twice<br>[60:15] I rather just write this instead of also<br>[60:18] having to add well I rather no that's me<br>[60:22] of course I rather write this<br>[60:24] then hang on<br>[60:33] Then<br>[60:45] to confuse everything, let's talk about<br>[60:47] VS Code autocomp completion support for<br>[60:48] now. Here's the thing. I gave uh Enzo a<br>[60:51] free license for PHP Storm. uh I told<br>[60:54] him to use it [laughter]<br>[60:56] because like<br>[60:58] I I I feel that that a big part of<br>[61:02] discussion is also driven by people not<br>[61:06] using the right tools<br>[61:09] and and I mean<br>[61:12] Aiden are you still here in chess? Do<br>[61:15] you remember this was at the very start<br>[61:18] of Tempest I think but I was I was<br>[61:20] saying that I want to write a framework<br>[61:24] that that works with the right tools you<br>[61:26] know just just use a proper IDE don't<br>[61:28] don't<br>[61:30] like use a text editor uh [laughter] and<br>[61:34] it could not make me switch yeah and<br>[61:36] then okay but then I can say then you'll<br>[61:38] have to deal with these kinds of things<br>[61:39] and have fun either use the correct<br>[61:43] tools or or I mean I I I just don't want<br>[61:46] to add more<br>[61:49] complications<br>[61:53] but I'll put my faith in Mago and all<br>[61:55] its future LSP. Yeah. Um,<br>[62:01] like at least to me this feels like a<br>[62:03] like a<br>[62:06] a workound on top of a workound and this<br>[62:08] feels like only one workound like one<br>[62:10] level deep of a compromise because we<br>[62:13] don't have generics and this is two<br>[62:14] level deeps to me. I don't know if I<br>[62:16] make sense. Uh, but yeah, I rather would<br>[62:20] like to use attributes declaring it<br>[62:22] straight. This is a relation A has many<br>[62:24] of. Yeah. No. Yeah, I I understand that<br>[62:28] that people say this, but the whole OM<br>[62:30] was kind of designed to not having to<br>[62:32] use attributes. Also, um keep in mind<br>[62:37] that like and this this isn't entirely<br>[62:40] the case because especially for<br>[62:42] databases,<br>[62:44] uh we have we we have the has many<br>[62:45] attributes. Um<br>[62:49] we have has many and we have uh belongs<br>[62:52] to um and that's that's because of or or<br>[62:56] has one we have as well. Um this is<br>[63:00] specifically for database models, right?<br>[63:02] But keep in mind that the whole RM of<br>[63:04] Tempest is designed to to be totally<br>[63:06] independent of databases. You can map<br>[63:09] any type of data into these objects. It<br>[63:11] doesn't have to come from a database. we<br>[63:13] happen to have like a a convenience<br>[63:15] layer on top of it to because um people<br>[63:20] uh like like models are often very often<br>[63:24] stored in in the database. So it makes<br>[63:26] sense to have this layer of convenience<br>[63:28] there. But um<br>[63:32] yeah, I don't know.<br>[63:36] Code in attribute can be the source of<br>[63:38] truth. Maybe then dog blocks can be<br>[63:40] automatically generated and warranted.<br>[63:41] Yeah, but then we're we're into like the<br>[63:44] the IDE helper territory which I also<br>[63:46] don't want to go into. I just want you<br>[63:48] know you're<br>[63:50] you're already writing this doc block.<br>[63:53] We already have it.<br>[63:58] It's it's not popular but it brings<br>[64:00] those attributes to laral eloquent. I<br>[64:03] don't know. I don't know what you mean<br>[64:04] by that.<br>[64:07] We do have attributes at the end of the<br>[64:08] day and that that that is true. And so<br>[64:10] that is true. And the reason we have<br>[64:11] these attributes is specifically for<br>[64:13] database uh queries. You don't need<br>[64:16] these attributes if you're you know<br>[64:18] mapping your um your data from uh from a<br>[64:22] JSON file or an XML file or from an API<br>[64:25] endpoint. Um you only need these<br>[64:28] attributes for the database.<br>[64:34] And so and so that that kind of then<br>[64:36] also brings another layer of confusion,<br>[64:38] right? because suddenly you will have to<br>[64:40] need you you need to use as many uh even<br>[64:42] if your models aren't uh stored in the<br>[64:46] database.<br>[64:53] Is that PHP fart using his personal<br>[64:55] account?<br>[64:57] [laughter]<br>[64:58] Okay,<br>[64:59] could be<br>[65:02] X Haven. I missed almost the entire<br>[65:04] stream again. Why do you assume the<br>[65:05] stream is already ending? We're like<br>[65:07] deep into<br>[65:10] uh<br>[65:13] rent territory here.<br>[65:20] Ah, it was not sending a uh a message.<br>[65:23] Okay, maybe you like that might be spam<br>[65:25] protection from YouTube.<br>[65:29] Now, circling back to all of this,<br>[65:32] I let let's look at at the the<br>[65:35] implementation with PHP parser first<br>[65:40] because this this I don't want honestly.<br>[65:49] So, we kind of do resolve class short<br>[65:52] class name.<br>[66:01] Mhm. Get use statements. Get parse you.<br>[66:03] Okay. Over here, parser factory. Create<br>[66:06] newest supported version. Parse. Um, and<br>[66:09] then we have our a. It's still pretty<br>[66:14] pretty complex. Like, right, we need to<br>[66:16] create a visitor<br>[66:18] for it, which is also what what um<br>[66:21] recctor does. And then uh we'll do some<br>[66:25] stuff here. And so this isn't like this<br>[66:27] isn't easy either, right? It's a bit<br>[66:30] easier, but not really all that great.<br>[66:36] So I don't know.<br>[66:39] I'm saying we just wait for PHP to add<br>[66:41] generics and then this whole debate is<br>[66:43] going away.<br>[66:47] We're deep into something for sure. I'm<br>[66:48] still recovering from the don't use text<br>[66:50] editor. [laughter]<br>[66:52] Uh we need generics in PHP. Yeah. So, so<br>[66:56] if if we I think all of us agree with<br>[66:58] that, right? Hang on, hang on. I've<br>[67:00] discovered this poll option. Do we need<br>[67:04] generics in PHP?<br>[67:07] Yes, no. Start poll. Um, go over to<br>[67:10] YouTube and uh and say yes or no. But if<br>[67:15] if all of us I assume all of us will say<br>[67:19] yes.<br>[67:20] If you're saying no, you have to write<br>[67:22] why in chat. But [snorts]<br>[67:24] um if we<br>[67:28] like we we all agree that generics are<br>[67:31] the solution here. So whatever approach<br>[67:33] we take, it's always a workound. It is<br>[67:36] it it will always be suboptimal. It will<br>[67:38] always kind of suck, you know, and then<br>[67:40] I'd rather have it suck this way than<br>[67:42] another.<br>[67:47] There you<br>[67:58] voted yes on YouTube. So, okay.<br>[68:02] So, this means<br>[68:04] that we're in agreement.<br>[68:06] Uh,<br>[68:08] also like the video to which Thank you.<br>[68:14] Uh,<br>[68:17] now I have to explain this to Oh, no.<br>[68:20] Haven is here, right? Oh, you're here.<br>[68:22] Okay. So, Haven uh he haven, right? Or<br>[68:26] heaven? No, because heaven is Oh,<br>[68:29] heaven.<br>[68:31] Is that how you write heaven?<br>[68:34] Can I just say Mark? Uh,<br>[68:38] I I'm not going to do either of these.<br>[68:40] like I really appreciate like for the<br>[68:43] record uh I really appreciate that uh<br>[68:46] I'll check the link in a second uh uh<br>[68:48] Admiral uh but I really appreciate that<br>[68:51] you spent so much time on this but like<br>[68:57] and yes it's unfortunate<br>[69:00] but<br>[69:03] I don't want to add layers upon layers<br>[69:05] of of dealing with PHP's shortcomings.<br>[69:08] Let's just add generics.<br>[69:14] Hang on. I have to agree with Brent<br>[69:16] here.<br>[69:17] What? [laughter]<br>[69:20] Can you please check the link in Discord<br>[69:22] chat? Let's see.<br>[69:25] Uh this link.<br>[69:30] Yeah, it's the only link here. What does<br>[69:32] this do? Laravel lift. Eloquent models<br>[69:34] on steroids. But hang on, let me first<br>[69:37] uh<br>[69:40] really appreciate the effort. But after<br>[69:45] thinking about it for a very long time,<br>[69:49] I decided to not merge this. It's just<br>[69:54] not worth it.<br>[69:57] All the overhead.<br>[70:00] Let's just use fully qualified class<br>[70:03] names for now and hope PHP gets<br>[70:07] uh generics<br>[70:09] one day. One day<br>[70:17] this is the right one, right? Yeah. Uh<br>[70:20] resolve class short class names invar<br>[70:22] block<br>[70:24] with the Yeah. Okay. Going to close this<br>[70:26] one as well.<br>[70:28] Uh, closing C<br>[70:38] for more info.<br>[70:44] I also Okay, so X heaven agrees. Uh, I I<br>[70:49] mean it fixes the original issue, but it<br>[70:51] didn't feel right even when making it<br>[70:52] happen. Yeah. So, I wonder if generics<br>[70:55] will happen. PHP 10 will have generics.<br>[70:58] My mark my words. Yes, maybe it's<br>[71:04] um<br>[71:06] all compromise. Okay, so I need to check<br>[71:08] the link as well in Discord. Uh<br>[71:12] close.<br>[71:15] And but there's one more thing I had to<br>[71:17] do as well. Yeah, because the original<br>[71:20] issue actually<br>[71:26] can be solved very easily.<br>[71:33] Watch me now. This is like<br>[71:37] uh like big brain coding here. Um we'll<br>[71:40] go to database.md.<br>[71:45] Yes. And then we'll go to has many<br>[71:51] has many.<br>[71:55] Tempest will infer relation based on<br>[71:56] type information it gets from a public<br>[71:58] property with a reference to another<br>[71:59] class will be similar.<br>[72:01] While a property with a dog block that<br>[72:03] defines array types is assumed to be a<br>[72:05] hesmary.<br>[72:07] Uh warning. Look at this. Hello world.<br>[72:12] Uh, Tempest test<br>[72:16] a<br>[72:19] uh, hang on.<br>[72:22] Tempest new window.<br>[72:25] Bun run build. Oh, maybe maybe I should<br>[72:28] pull. Ah, get pull. Of course. Uh, bun<br>[72:32] run build. O, build.<br>[72:40] Yes. Okay.<br>[72:42] Docs database and then<br>[72:47] Okay,<br>[72:50] I'm going to fix this. Hello world. Um,<br>[72:56] types in<br>[72:59] dog blocks<br>[73:01] must always be fully<br>[73:06] fully qualified and not use<br>[73:10] short class names.<br>[73:14] And with that, that issue is solved. Oh,<br>[73:17] no, it's on main.<br>[73:24] Uh<br>[73:27] docs update.<br>[73:31] Uh get Oh, I already<br>[73:41] in rel uh<br>[73:44] relation types in dock blocks like this.<br>[73:47] Like that. Like that. Boom. This<br>[73:52] uh<br>[74:00] Okay,<br>[74:02] I I'll take a look at the window thing.<br>[74:05] By the way, um<br>[74:08] we're only at eight. Yeah. Uh not PHP 10<br>[74:11] yet. Uh hang on, hang on. I I noticed<br>[74:15] something, Enzo. I don't know what the<br>[74:17] problem is, but this says 2.8. 8 and I<br>[74:20] tried to clear the cache and it doesn't<br>[74:22] like it keeps on 2.8 and same over here<br>[74:24] like 1.9 should be 2K. I don't know<br>[74:27] what's happening there. I'll I'll do a<br>[74:29] deploy and you'll see what uh<br>[74:32] um<br>[74:34] like you see it going wrong. Uh let's<br>[74:36] make a uh<br>[74:40] now doc<br>[74:42] I need to look it up. Contributing I<br>[74:45] never know commit descriptions. No<br>[74:47] scopes.<br>[74:49] Docs. It actually is correct. Docs. Um,<br>[74:57] fully qualified<br>[75:00] type. Oh, hang on. Let me get this right<br>[75:03] from the from the start. Warning about<br>[75:06] fully qualified types.<br>[75:08] No, no. Add biring fully con<br>[75:13] in has many<br>[75:16] relations<br>[75:24] ready for a review. This is just a doc<br>[75:25] so I can just merge quick before anyone<br>[75:28] notices.<br>[75:30] It was just docs, right? Yeah. Yeah. Um,<br>[75:37] so I don't know what's what's uh uh<br>[75:39] Tempest<br>[75:40] docs. We should rename the repository<br>[75:43] here actually. But yeah, let's go to our<br>[75:46] actions because that should auto deploy.<br>[75:48] Yeah.<br>[75:54] [snorts]<br>[75:56] Yeah. Let's uh let's do it. Let's wait<br>[75:58] for a second here.<br>[76:01] Um, [sighs]<br>[76:04] and just make sure that it's uh<br>[76:14] model relations. It should end up here,<br>[76:17] right?<br>[76:24] I vote for renaming repositories to<br>[76:26] tempest PHP framework and yeah maybe<br>[76:31] how docs was created. Is it a template<br>[76:33] or not? It's a [snorts]<br>[76:36] it's it's written from not from scratch<br>[76:38] but this is just like a markdown parser<br>[76:41] with some small layer on top of it. Uh<br>[76:45] but it's not like existing documentation<br>[76:47] framework.<br>[76:50] Uh<br>[76:51] yeah, we'll have to wait for like<br>[76:53] another second. But um<br>[76:58] after lots of back and forth,<br>[77:04] I decided that we don't want that we<br>[77:08] that I don't want to support uh non<br>[77:13] fully qualified class names in relation<br>[77:16] doc blocks for now. Um, I've added a<br>[77:20] warning in the docs about this.<br>[77:28] Issue solved,<br>[77:31] I would say. [snorts]<br>[77:33] And here it is.<br>[77:35] So, so the docs. Oh, now it is up there.<br>[77:38] What? No, the homepage. Oh. Huh. I I am<br>[77:44] I'm serious. I deployed<br>[77:47] the docs website like numerous times<br>[77:49] over the past and this oh you know what<br>[77:53] happened<br>[77:55] I know what happened. Oh<br>[77:59] so earlier this day I cleared the cache<br>[78:01] manually. I think that's the problem.<br>[78:05] So I I went onto the server, I cleared<br>[78:07] the cache uh and refreshed and it still<br>[78:10] wasn't changing and then I got<br>[78:11] distracted but I didn't realize these<br>[78:13] pages are statically generated as well.<br>[78:15] So I clear I had to clear the cache and<br>[78:16] then regenerate the pages which is what<br>[78:18] happened now. So I think like deploy<br>[78:21] does does not clear cache<br>[78:25] cache.<br>[78:28] Could that be the issue?<br>[78:32] And should we clear all the whole cache?<br>[78:38] Uh cache clear. Now let's see what we<br>[78:44] do. We do that. That's what<br>[78:50] we do. So, so before static generates.<br>[78:52] So that should<br>[78:55] but when I when I look at this clearing<br>[78:57] the view cache<br>[79:01] see but nothing happens here. So we do<br>[79:05] the indexing then we do vid build.<br>[79:08] We run cache clear but it's not doing<br>[79:10] anything. I think that's I I think<br>[79:13] that's the problem. And I think that<br>[79:14] same problem might be true for<br>[79:16] migrations actually. Um<br>[79:21] uh uh Tempest<br>[79:25] see<br>[79:28] and when you remove the force<br>[79:32] it actually does<br>[79:35] clear the cache. And this is exactly the<br>[79:37] problem we have with migrations as well<br>[79:39] that I noticed. Uh, so I think there's<br>[79:41] something wrong with the d-force.<br>[79:51] Yeah. So, but Enzo is saying in my local<br>[79:54] environment I could not reproduce this<br>[79:56] and I agree. Yeah. Because I also cannot<br>[79:59] reproduce it in uh local environment.<br>[80:05] But if I were to sett<br>[80:10] uh signing key, that's okay. That's not<br>[80:11] a secret uh production.<br>[80:18] See, and it actually it fails. That's<br>[80:21] the problem.<br>[80:23] It doesn't work when environment is<br>[80:25] production,<br>[80:29] which is why we have the forest<br>[80:31] parameter.<br>[80:32] Um,<br>[80:37] does this look like anything? No.<br>[80:43] Interesting, right? Uh, but but this is<br>[80:45] good because uh I can now<br>[80:49] edit only happens when an fire and<br>[80:56] I'll do it like this.<br>[81:00] Interesting, right? I'll I'll look into<br>[81:01] this. Uh not right now, but<br>[81:05] uh and I reckon it's it's broken since<br>[81:08] 2.8 because that was the last version<br>[81:12] on uh on the docs before I manually<br>[81:15] cleared.<br>[81:19] But that's that's actually a pretty<br>[81:21] important issue to fix.<br>[81:24] Um,<br>[81:34] did you already remove it? Awesome.<br>[81:37] [laughter]<br>[81:38] Oh, that's great. Yeah.<br>[81:40] Okay. So, we were looking at Laravel<br>[81:42] Lift and this will be the last thing<br>[81:43] we'll do today actually. Um, Lyft is a<br>[81:45] package that boosts your eloquent models<br>[81:47] in Laravel. It lets you create public<br>[81:49] properties in eloquent models that match<br>[81:51] your table schema. This makes your<br>[81:52] models<br>[81:53] Yeah. So this is basically the way<br>[81:56] Tempest does it, right?<br>[82:00] Is there an example?<br>[82:02] Use Lyft and then what<br>[82:05] if just a small tip for everyone writing<br>[82:08] open source code? If you have like this<br>[82:10] package, something that is super easy to<br>[82:14] do that I think improves engagement is<br>[82:19] just have above the fold a code sample<br>[82:22] of what it does. Show me what this thing<br>[82:24] does, right? And what it looks like in<br>[82:27] practice<br>[82:28] uh without having to Okay, so th this<br>[82:32] just put this on the front page<br>[82:33] basically and then you're good.<br>[82:38] Uh so yeah,<br>[82:41] cast float. But<br>[82:46] why why do we need this if we have this?<br>[82:48] That's that's I do like the the font<br>[82:51] that's being used for Hang on. Sorry,<br>[82:54] I'm getting distracted. But uh<br>[82:58] go. Yeah. Okay. Hang on. Hang on. I'm a<br>[83:02] professional here. Oh, there was my<br>[83:03] Okay, that was on the on the on the<br>[83:06] Uh, computed.<br>[83:08] What font is that? Ah, okay. It's IBM<br>[83:11] Plex mono. I figured.<br>[83:18] Is that like a uh free font? Actually,<br>[83:21] this is so beautiful.<br>[83:25] Yeah. Okay. Um,<br>[83:28] it's free. Okay. I didn't know that.<br>[83:32] H.<br>[83:34] Okay. Okay. But I also like my font.<br>[83:43] Um,<br>[83:46] what dogs builder would you recommend to<br>[83:48] use for open source project? I have no<br>[83:50] clue. Like I just I copied whatever I<br>[83:53] was I I already had. And if you go to um<br>[83:58] uh Tempest Tempest docs, you'll see that<br>[84:00] it's basically it's just a Tempest app.<br>[84:02] And what it does, let me show you, uh,<br>[84:05] in web and in documentation, it has this<br>[84:08] chapter repository. And the only thing<br>[84:11] it does, well, the only thing it does is<br>[84:13] that it, let's see, glob over here. It<br>[84:16] globs all files, all markdown files in a<br>[84:19] specific folder. And it then parses that<br>[84:21] into a document structure. Basically,<br>[84:23] that's it is more than that with some<br>[84:25] beautiful styling created by Enzo that<br>[84:29] is like<br>[84:32] What what is the difference between the<br>[84:34] the cast int and type property? Yes,<br>[84:37] that this is what I don't really<br>[84:38] understand. Why why do you need this if<br>[84:40] you have this?<br>[84:50] So yeah, was there anything particular<br>[84:52] you wanted me to look at? Um relations<br>[84:55] that was a problem. Ah for relations.<br>[84:57] Okay, let's take a look at the<br>[84:58] relations. Yes. Yes. Yes. uh<br>[85:00] relationships<br>[85:02] um hashtag belongs to user.<br>[85:07] So, but then you don't define the<br>[85:09] property. I mean that's weird. No,<br>[85:15] like the whole point is to<br>[85:18] do it through properties also. So why is<br>[85:20] it<br>[85:22] like some asynchronous uh code<br>[85:28] uh code code styling uh thingy going on<br>[85:30] there were there were some unstyled code<br>[85:32] blocks. Mhm. [clears throat]<br>[85:35] Yeah. I don't know. I don't see how this<br>[85:36] is how I would like to use this over<br>[85:39] just having the property there. Um<br>[85:43] the force book is co heaven again is<br>[85:46] caused by the caution middleware<br>[85:48] conflicting with the default false value<br>[85:49] of the confirm method he already fixed<br>[85:52] it.<br>[85:56] Cool.<br>[85:57] Are are you already working on a on a<br>[85:59] pull request for that heaven or or<br>[86:01] anyway I'll I'll<br>[86:03] follow up on it but hello from Brazil. I<br>[86:06] have a question. Do you think tempest<br>[86:07] can grow to laral level or higher or is<br>[86:09] your intention with it something else? I<br>[86:12] don't like<br>[86:14] um<br>[86:19] this is a good question but no<br>[86:23] I I I don't think like I think if<br>[86:25] Laravel 10 years ago had the intention<br>[86:28] to be where it is today then it would<br>[86:30] have never gotten there. Um, [snorts]<br>[86:33] and I have no clue where it is going.<br>[86:36] Honestly, it's it's still in such a very<br>[86:38] early phase. There are still a couple of<br>[86:42] very important features that need to be<br>[86:44] added before we can actually say like,<br>[86:46] okay, this is a like<br>[86:49] fully featured can be used in in real<br>[86:53] projects like bigger projects. Um and<br>[86:57] then there is the matter of of<br>[87:00] the ecosystem as well. It's not just the<br>[87:02] framework, right? The one of the things<br>[87:04] that gives Laravel so much value is the<br>[87:06] whole ecosystem around it and and that<br>[87:09] we also don't yet have. So I have no<br>[87:11] clue. I have no clue if we will ever get<br>[87:14] there or not. But what I do know<br>[87:17] um I started working on this when just<br>[87:20] as as an experiment<br>[87:22] um<br>[87:24] and enough people joined right enough<br>[87:26] people were excited about it that it was<br>[87:29] worth looking further into and investing<br>[87:31] more time into it. Um like up until this<br>[87:35] point we have uh let's see around 70<br>[87:38] contributors something like that 78<br>[87:41] people who have contributed. Um, we<br>[87:46] like it it there are many people who who<br>[87:49] want this and and some people are are<br>[87:51] doing a lot of work. I'm thinking about<br>[87:53] Enzo. I'm also thinking about Haven over<br>[87:55] here. Um, and uh, uh, Traus also did<br>[88:02] like a lot of work with installers<br>[88:03] especially over here. Yeah, I don't know<br>[88:06] their name but uh, and and and uh, Guom<br>[88:09] here as well. Um, oh, Sergio.<br>[88:14] I'm starting to remember these these<br>[88:15] faces. And there are so many more<br>[88:17] people. Of course, I'm just uh um<br>[88:19] cherrypicking a couple here. So, I don't<br>[88:22] know where I hope I really like at this<br>[88:25] point. I hope that it's it's going to be<br>[88:28] uh a super usable and fun framework for<br>[88:31] real life projects. Um<br>[88:36] right now there is no no chance in<br>[88:38] competing with a Symphfony or Laravel<br>[88:41] because they have such a rich ecosystem.<br>[88:43] Um and also 10 to 20 years of like<br>[88:49] fine-tuning and bug fixing their<br>[88:50] framework. Um<br>[88:53] so so yeah, we're just not there yet.<br>[88:58] So, not I I don't want to<br>[89:02] make any bold claims because doing so<br>[89:05] won't get us anywhere. Let's just focus<br>[89:07] on on the value we we can bring and and<br>[89:10] see how it grows. Does Tempest have a<br>[89:12] way to integrate composer packages and<br>[89:14] does it work with discovery? Yes, there<br>[89:16] is a documentation page on this uh uh<br>[89:18] packages package development. Here you<br>[89:21] go. Um<br>[89:24] and and as long as you require tempest<br>[89:28] score<br>[89:30] uh discovery will just work.<br>[89:34] So that's really nice.<br>[89:37] Meanwhile, a haven just uh submitted<br>[89:40] this pull request. Uh<br>[89:44] let's see. Console is forced.<br>[89:48] generic console.<br>[89:53] This is change to the interface, right?<br>[89:55] This break and change.<br>[89:58] Although<br>[90:06] [snorts]<br>[90:13] did we change that at some point that<br>[90:15] the default for confirm is true? Yeah.<br>[90:18] So<br>[90:22] dollar solution would have been to<br>[90:23] default true for confirm. No. Yeah. I<br>[90:25] don't like it either. Uh, okay. I'll I'm<br>[90:28] not going to like insta merge it. I want<br>[90:31] to give it some more thought. But yeah,<br>[90:32] this is indeed a uh solution that would<br>[90:35] work.<br>[90:39] I'll probably merge it, but give me a<br>[90:41] second to think about and give Enzo a<br>[90:44] second to change the name of the pull<br>[90:46] request. So, um, so yeah, what I'm going<br>[90:51] to do, folks, is I'm I'm going to wrap<br>[90:53] up here.<br>[90:54] I think I don't know. We we merged one<br>[90:57] pull request. We closed two pull<br>[90:59] requests. We closed one issue<br>[91:02] and haven't submitted well we found out<br>[91:05] another issue and haven't haven't<br>[91:07] already submitted a pull request for it.<br>[91:08] So okay I would say productive stream.<br>[91:10] Um but I just feel like my voice needs<br>[91:13] some some time off basically. Um<br>[91:17] tomorrow is my last day before my<br>[91:19] holiday and as I mentioned at the start<br>[91:21] of the stream I will be uh taking some<br>[91:23] time off some proper time off. I'm I<br>[91:26] don't want any uh I want to reduce my<br>[91:30] screen time as much as possible. So um I<br>[91:33] will probably gone for three weeks and<br>[91:35] then I will be back. Um<br>[91:39] oh yeah and we had a had a good<br>[91:40] discussion about generics and static<br>[91:42] analysis and the meaning of life. So,<br>[91:45] um,<br>[91:48] uh, so this is this was the the last<br>[91:51] Tempest stream for a while, for a couple<br>[91:52] of weeks, and then we'll be back, uh,<br>[91:55] undoubtfully.<br>[91:57] So, uh, a few weeks going to be boring.<br>[92:00] Uh, heaven says, uh, actually, you know,<br>[92:04] I might<br>[92:06] I'm not going to make any hard promises<br>[92:08] here that I'm not going to do like full<br>[92:11] detox, but uh, we'll see. We'll see. The<br>[92:13] the good thing is when I'm back, I'll be<br>[92:15] so re-energized. And actually, I I would<br>[92:18] advise you to do the same. Like take a<br>[92:20] week, maybe two weeks, and you'll you'll<br>[92:22] just like feel so much more productive<br>[92:24] when you when you'll get back. Um you<br>[92:28] can watch all the streams on YouTube<br>[92:29] again. There are like quite a lot of<br>[92:31] streams [laughter] already.<br>[92:33] Um but uh but yeah, so so that's the<br>[92:37] plan. Tomorrow I will do another live<br>[92:38] stream. It will be on Nuno's channel. Uh<br>[92:41] let me just quickly<br>[92:43] uh show that we're going to continue<br>[92:46] last week our last week's um live<br>[92:48] stream. Nuno. Oh, he's already over<br>[92:51] here. Um last week we did a live stream<br>[92:55] where we discussed best practices in<br>[92:57] Laravel and it was nice because I got to<br>[92:59] mention Tempest here and there as well<br>[93:01] like saying, "Oh yeah, you know, you do<br>[93:03] know with these eloquent models, you<br>[93:04] know how I would do that." [laughter]<br>[93:07] Uh but it was really fun. We're going to<br>[93:08] do the same. Well, we're going to<br>[93:10] continue our story tomorrow. Um Oh,<br>[93:13] there it is already. I don't know what<br>[93:15] he did with with his thumbnail, but uh<br>[93:18] so uh uh yeah, Nuno's last stream was in<br>[93:22] Portuguese. Yeah. Okay. But most of his<br>[93:23] streams are in English. Um<br>[93:26] so, uh I'm asking come from how Tempest<br>[93:29] handles things from creating files to<br>[93:31] setting up routes. It feels like a lot<br>[93:33] more mature than PHP. It also follows<br>[93:36] patterns I really like, especially not<br>[93:37] forced a forcing affixiction structure.<br>[93:40] Yeah, I mean these are things that<br>[93:41] people say they like about Tempest. So<br>[93:43] if you if you want to, you can uh you<br>[93:45] you can definitely use it. People are<br>[93:47] using it for real projects already.<br>[93:49] There's just so much more work to be<br>[93:51] done and if you expect like a full and<br>[93:53] rich ecosystem like Laravel, that's<br>[93:55] that's there is some work to be done<br>[93:57] there. But I mean, everyone's welcome to<br>[94:00] uh to help with that. Um, so yeah,<br>[94:03] that's tomorrow's stream afternoon, my<br>[94:06] time at least. Um, hope to see you<br>[94:08] there. It's always good to have some<br>[94:10] Tempest enthusiasts in chat as well. So,<br>[94:12] if you're there, don't don't don't like<br>[94:14] hesitate dropping the Tempest name here<br>[94:16] and there, you know. Uh, we're we're<br>[94:18] here with mostly Laravel audience, but<br>[94:21] uh uh yeah, always fun, right? Uh so so<br>[94:25] that's for tomorrow and then we'll uh<br>[94:28] we'll see each other in in January.<br>[94:30] Exactly. and definitely um I wish you<br>[94:33] all a a very good end of the year.<br>[94:38] Keep it safe. I don't know what you're<br>[94:39] going to do. Um but uh yeah, just enjoy<br>[94:43] enjoy this time off and and definitely<br>[94:46] like try to take some time off. Read a<br>[94:48] book or something. I have a couple of<br>[94:50] books that you could read. You can find<br>[94:52] those uh on my blog if you want to.<br>[94:56] Okay. Um,<br>[94:58] some of you I'll see you tomorrow at<br>[95:00] Nunos indeed and then we'll uh we'll<br>[95:02] talk soon. Have a good time folks.<br>[95:05] Bye-bye. <!-- deep-read:sections end --> ## ๐Ÿ“บ Video ![](https://www.youtube.com/watch?v=gL3x3AvhBBk) --- # ๐Ÿ“ Full Notes (Deep-Read Analysis) # ๐Ÿท๏ธ Title: The daily open source grind ## ๐Ÿงฐ Action Inbox - [H1] Review pull requests for Tempest framework โ€” 00:00 #pull-request-review - [H2] Fix pagination joins issue โ€” 05:45 #bug-fix - [H3] Debate DocBlock vs Attributes for relation types โ€” 15:30 #architecture ## ๐Ÿงญ Table of Contents - [๐Ÿ“ Summary](#-summary) - [๐Ÿ“– Main Content](#-main-content) - [๐Ÿ—’๏ธ Notes](#๏ธ-notes) - [๐Ÿ“š References](#-references) - [๐Ÿ—ฃ๏ธ Paraphrase](#๏ธ-paraphrase) - [๐Ÿ“ฐ Newsletter](#-newsletter) - [โœ… Action Items](#-action-items) - [๐Ÿงช Hypotheses](#-hypotheses) - [๐Ÿ“Š Methodology](#-methodology) - [โ“ Questions](#-questions) - [๐Ÿ”ฎ Future Research](#-future-research) - [๐Ÿ’ก Implications](#-implications) - [๐Ÿง  Learning Styles Assessment](#-learning-styles-assessment) - [๐Ÿ“Š Accessibility Assessment](#-accessibility-assessment) - [๐ŸŒ DEIB Assessment](#-deib-assessment) - [โœ… Logical Validity](#-logical-validity) - [๐Ÿ›ก๏ธ DARVO Analysis](#-darvo-analysis) - [๐ŸŽฏ Conclusion](#-conclusion) ### ๐Ÿ”— References - [Tempest Framework](https://tempestphp.com) - [Laravel Lift Package](https://github.com/WendellAdriel/laravel-lift) ## ๐Ÿ“ Summary - Brent Roose conducts a live coding session reviewing pull requests for the Tempest PHP framework - Key discussion around DocBlock parsing vs attributes for defining model relations in PHP - Multiple technical challenges addressed including pagination joins and Redis session management - Strong emphasis on code quality, developer experience, and framework architecture decisions - Community engagement through live streaming helps maintain open source momentum ## ๐Ÿ“– Main Content This stream showcases the day-to-day reality of maintaining an open source PHP framework. Brent addresses technical debt, reviews community contributions, and engages in architectural debates about the best approaches for handling PHP's limitations around generics and type hints. The main tension revolves around how to handle relationship definitions in models - whether to use DocBlocks with fully qualified class names, support short class names through complex parsing, or introduce attributes as an alternative approach. Each solution involves trade-offs between developer experience, performance, and code complexity. ## ๐Ÿ—’๏ธ Notes #### โฑ๏ธ [00:00](https://youtu.be/gL3x3AvhBBk?t=0) โ€” [H1] Stream Setup and Personal Updates - Key idea: Brent is sick but continues streaming to maintain consistency - Evidence: "I was considering not streaming today... my daughter is still sick... I'm getting sick as well" #### โฑ๏ธ [02:30](https://youtu.be/gL3x3AvhBBk?t=150) โ€” [H2] Holiday Planning and Work-Life Balance - Key idea: Planning three weeks completely offline to avoid burnout - Evidence: "I plan on doing as little screen time as possible during the holiday... have this GitHub activity chart be completely empty" #### โฑ๏ธ [05:45](https://youtu.be/gL3x3AvhBBk?t=345) โ€” [H1] Pagination Joins Bug Fix - Key idea: Fixed issue where pagination didn't copy joins to count queries - Evidence: "The problem here was something with query builders being cloned and not using the right copying everything over" #### โฑ๏ธ [12:15](https://youtu.be/gL3x3AvhBBk?t=735) โ€” [H2] Redis Session Manager Addition - Key idea: Community contributor added Redis session support - Evidence: "This pull request is adding Redis sessions... we support database sessions and file sessions" #### โฑ๏ธ [18:30](https://youtu.be/gL3x3AvhBBk?t=1110) โ€” [H1] DocBlock Parsing vs PHP Parser Discussion - Key idea: Complex debate about supporting short class names in DocBlocks - Evidence: "The problem here is that we only support fully qualified class names in our DocBlocks" #### โฑ๏ธ [25:20](https://youtu.be/gL3x3AvhBBk?t=1520) โ€” [H2] PHP Generics Wishlist - Key idea: All current solutions are workarounds for PHP's lack of generics - Evidence: "The best solution would just be PHP having generics folks and anything else is just not really great" #### โฑ๏ธ [32:45](https://youtu.be/gL3x3AvhBBk?t=1965) โ€” [H1] IDE Support Philosophy - Key idea: Framework designed to work best with proper IDE tools - Evidence: "I want to write a framework that works with the right tools... just use a proper IDE don't use a text editor" #### โฑ๏ธ [38:10](https://youtu.be/gL3x3AvhBBk?t=2290) โ€” [H2] Static Analysis as Core Language Feature - Key idea: DocBlocks serve as runtime-affecting code, not just documentation - Evidence: "Static analysis is an integral part of the language itself... I want PHP to ship with a built-in static analyzer" #### โฑ๏ธ [45:00](https://youtu.be/gL3x3AvhBBk?t=2700) โ€” [H1] Community Poll on Attribute Support - Key idea: Live polling community about adding attribute-based relation definitions - Evidence: "Add has many class name support or not? Yes. No. Start." #### โฑ๏ธ [52:30](https://youtu.be/gL3x3AvhBBk?t=3150) โ€” [H2] Rejecting Complex Workarounds - Key idea: Decision to reject PHP parser implementation for simplicity - Evidence: "I don't want to add layers upon layers of dealing with PHP's shortcomings" #### โฑ๏ธ [55:15](https://youtu.be/gL3x3AvhBBk?t=3315) โ€” [H1] Documentation Update Solution - Key idea: Simple solution through documentation rather than code complexity - Evidence: "Types in DocBlocks must always be fully qualified and not use short class names" #### โฑ๏ธ [58:45](https://youtu.be/gL3x3AvhBBk?t=3525) โ€” [H2] Framework Growth Discussion - Key idea: Uncertain about Tempest reaching Laravel's scale, focused on current community - Evidence: "I don't think Laravel 10 years ago had the intention to be where it is today... we have around 78 people who have contributed" ## ๐Ÿ“š References - [Tempest Framework Documentation](https://tempestphp.com) - [Laravel Lift Package](https://github.com/WendellAdriel/laravel-lift) - [PHP RFC for Generics](https://wiki.php.net/rfc/generics) ## ๐Ÿ—ฃ๏ธ Paraphrase - Maintaining an open source framework requires balancing technical purity with practical developer experience needs - The PHP ecosystem's limitations around generics force framework authors into complex workarounds that often feel unsatisfying - Community engagement through live coding sessions helps maintain momentum and gather feedback on architectural decisions ## ๐Ÿ“ฐ Newsletter **Tempest Framework Development: Balancing Pragmatism and Principles** The latest Tempest development stream highlighted a common challenge in PHP framework development: working around language limitations while maintaining clean, intuitive APIs. Key developments include fixes for pagination joins, Redis session support, and important architectural decisions about DocBlock parsing. The team chose simplicity over complexity, requiring fully qualified class names in relation DocBlocks rather than implementing complex parsing solutions. This decision reflects a broader philosophy in modern PHP development - sometimes the most maintainable solution isn't the most convenient one for developers. Resources: [Tempest Docs](https://tempestphp.com), [GitHub Repo](https://github.com/tempestphp/tempest-framework), [Community Discord](#) ## โœ… Action Items #### DevRel - Developer advocacy: Continue live streaming development sessions for community engagement - Education: Document architectural decision-making process for framework contributors - Developer experience: Balance framework simplicity with developer convenience #### Community - Maintainers: Establish clear contribution guidelines for complex architectural changes - Contributors: Encourage small, focused pull requests over large refactoring attempts - Ecosystem: Build relationships with IDE tool makers for better framework support #### FAIR - Technical independence: Avoid over-dependence on external parsing libraries - Policies: Maintain clear stance on code quality vs convenience trade-offs ## ๐Ÿงช Hypotheses - Live streaming open source development increases community engagement and contribution quality - Requiring fully qualified class names in DocBlocks will improve framework performance and maintainability - PHP generics support would eliminate most current framework architecture debates - Developer tool quality significantly impacts framework adoption and user satisfaction ### ๐Ÿ“Š Methodology - Community feedback through live chat and polls during development sessions - Performance benchmarking of different DocBlock parsing approaches - Contribution quality analysis before and after implementing stricter guidelines ### โ“ Questions - How can PHP framework authors better advocate for language-level improvements like generics? - What's the optimal balance between developer convenience and code maintainability? - How do live development streams impact open source project sustainability? ### ๐Ÿ”ฎ Future Research - Impact of live development streaming on open source project health - Developer experience metrics for different PHP ORM approaches - Community decision-making processes in technical architecture choices ### ๐Ÿ’ก Implications - Practice: Framework maintainers should prioritize long-term maintainability over short-term convenience - Policy: Open source projects benefit from transparent decision-making processes - Education: Live coding sessions serve as valuable educational content for framework users - Community: Regular engagement helps maintain project momentum during difficult technical decisions ### ๐Ÿง  Learning Styles Assessment Reading level estimate: Grade 12-14 (technical content) #### ๐Ÿ‘€ Visual learners - Present: Code examples, IDE screenshots, GitHub interface - Improve: Architecture diagrams showing framework relationships #### ๐Ÿ”Š Aural learners - Present: Live commentary explaining technical decisions - Improve: Post-stream audio summaries of key decisions #### ๐Ÿ—ฃ๏ธ Verbal learners - Present: Real-time explanations of code concepts and trade-offs - Improve: Glossary of framework-specific terminology #### ๐Ÿงฉ Kinesthetic learners - Present: Live coding demonstrations, interactive problem-solving - Improve: Hands-on exercises for contributing to the framework ### ๐Ÿ“Š Accessibility Assessment #### Screen reader semantics - Present: Clear code structure and verbal descriptions - Improve: Better alt text for code screenshots in documentation #### Keyboard navigation - Present: Standard IDE keyboard shortcuts demonstrated - Improve: Document accessibility features of development setup ### ๐ŸŒ DEIB Assessment #### Cultural breadth - Present: International community participation in live chat - Improve: Consider timezone rotation for live streams #### Inclusive language - Present: Professional, respectful technical discussion - Improve: Avoid dismissive language about different development approaches ### โœ… Logical Validity #### Strong reasoning - Deductive strength: Clear logical progression from PHP limitations to design decisions - Causal reasoning: Well-explained connections between technical choices and outcomes #### Tone of voice - Overall tone: Professional yet conversational, showing both expertise and uncertainty appropriately ### ๐Ÿ›ก๏ธ DARVO Analysis No concerning patterns detected - discussion maintains focus on technical merit rather than personal attacks. ## ๐ŸŽฏ Conclusion This development stream demonstrates the complex balance required in open source framework development. The decision to reject complex DocBlock parsing in favor of simpler, fully-qualified class name requirements reflects a mature approach to technical debt management. The live streaming format provides valuable transparency into decision-making processes while building community engagement. For WordPress developers, similar principles apply when choosing between convenience and maintainability in plugin and theme development. The emphasis on proper development tools and static analysis points toward a future where PHP development becomes more structured and predictable, benefiting the entire ecosystem. ## ๐Ÿงฑ Refactor Appendix ### ๐Ÿ“š Literature Split Pad ### [H1] Open source maintenance requires balancing contributor effort with architectural integrity > [!quote] The daily open source grind by [[Brent Roose]] via [[YouTube]]. Published 2024-12-19. Accessed 2024-12-19. > "I really appreciate that you spent so much time on this but I don't want to add layers upon layers of dealing with PHP's shortcomings." Framework maintainers must sometimes reject well-intentioned contributions to preserve long-term architectural health. [view highlight](https://youtu.be/gL3x3AvhBBk?t=3150#H1) #opensource #architecture ID:rw_001 ### [H2] Live coding builds stronger open source communities > [!quote] The daily open source grind > "We have around 78 people who have contributed... enough people were excited about it that it was worth looking further into." Transparent development processes through streaming create engaged contributor communities around technical projects. [view highlight](https://youtu.be/gL3x3AvhBBk?t=3525#H2) #community #devrel ID:rw_002 --- ### ๐Ÿ”– Atomic Split Pad (Zettel Candidates) #### [Z1] PHP's lack of generics forces architectural compromises - Applies to all PHP frameworks dealing with typed collections - Timestamp: 25:20 - Links: [[PHP-Language-Limitations]] [[Framework-Architecture]] #### [Z2] Developer tooling philosophy affects framework adoption - Quality IDE support can justify more verbose syntax requirements - Timestamp: 32:45 - Links: [[Developer-Experience]] [[Tool-Integration]] --- ### โœ๏ธ Fleeting Queue - [F1] Research IBM Plex Mono font for code display โ€” beautiful monospace option #design #fonts - [F2] Investigate PHPStorm GitHub integration workflow โ€” could improve PR review process #tools #workflow - [F3] Document cache clearing issues in production deployment โ€” affects multiple projects #deployment #debugging --- # ๐Ÿ“„ Full Transcript *Auto-generated from YouTube captions ยท timestamps roughly every 30 seconds ยท [watch on YouTube](https://www.youtube.com/watch?v=gL3x3AvhBBk)* **[00:04]** [music] are [music] **[00:37]** heat. [music] >> [music] [music] **[01:48]** >> Hello. Hello. Hello. Let's post everything everywhere. I made it. Uh, let's see. Hang on a second. I'm just posting everything. [sighs] Pure Tempest stuff today. **[02:25]** Hello, folks. Oh, and I forgot to pop out my chats. And that's all fine. Yeah, folks. It's uh [laughter] I uh was considering not streaming today, actually. Um so my daughter is still sick. Pretty sick actually. She's not getting better. Um but she'll be fine eventually. Uh but I'm getting sick as well. You might hear that actually from my voice. I don't know. Um I hear it. [laughter] So, so yeah, actually I maybe I should **[02:57]** just get a bit closer to my microphone and you know whisper hello. Uh no, that's going to be awkward. Uh [laughter] but um yeah, my uh my throat is uh acting up. So uh yeah, I'll see how uh how far I can uh get along. But I I did want to do some stuff today, so might as well give it a try. Actually, it was my wife saying, "No, don't don't be a baby and just just stream." **[03:29]** Which I guess is a good thing because it means that now I can um uh I I will get my my streak uh two weeks non-stop stream. Well, non-stop streaming every workday. Uh so, uh so yeah, let's see here. It's it's the kids are sick, you'll get it to season. Same same. Yeah. Unfortunately, I wish it was different. But uh I I had a cold for 3 months **[04:02]** non-stop and I actually went to like the the uh specialist for it because I just didn't get better and he was like, "Yeah, just bad luck with kids. Deal with it." No, he gave me some medicine and actually helped. But uh yeah, now it is uh it's back. Ah, well uh did I spam the socials everywhere? I love this GitHub thing. I don't know if ever anyone really sees it or or or whether it's useful, but I just I like it. Uh I just create a release **[04:36]** every time I'm going live and then uh it ends up in people's feed. We'll see. Um what else is there to say? Yeah, posting on LinkedIn now as well. Um, yeah, I want to do some Tempest stuff today. Basically, that's it. There is it's almost my holiday and I plan on doing as little screen time as possible during the holiday. **[05:06]** Um, like I I have three weeks off and I'm really going to try to avoid my my laptop altogether. We'll see how that goes. I'm saying that now but uh I feel like it's uh this is always just such a good refresher you know to uh take real break step back and and you know have this this GitHub um [snorts] the the activity chart be be completely empty. You see, I did it the same uh in January last year. Actually, it was a pretty long period. U this also had to **[05:38]** do with uh being away on an internal gathering with Jet Brains. So, there was some time off here, some additional time off, but you know, this this is this is good. Okay, this is a pretty long period, but um I want to try and do it. As you can see here, uh last year as well, just have some proper time off. Um over here, 2023 was uh this is I think when I started working on Tempest actually. Yeah. **[06:10]** So uh so yeah, I'm just uh going to step away actually. Why is this Oh, this is the future. Okay. Okay, I understand. Um, I'm going to step away for um for 3 weeks and then I'll be back like re-energized, invigorated to uh do some more work. But I also figured I before I leave, I'll have to take a look at this list of pull requests at least. And um because I there are some things waiting **[06:41]** for me basically to uh uh to reply to. So yeah, I I I need to put in the work and uh that's what I want to do today. I have no clue how interesting that will be, but we can chat while I'm doing that. Um I experience has taught me that dur uh doing live streams in general is not really productive time. So uh we'll we'll see how uh how we get along. But yeah, there are some some pull requests here and you know people have have spent **[07:13]** time and effort doing like sending a pull request. The least I can do is give it a review, right? Um and there are some some older ones here as well which I I I'm ashamed to admit that I I've been lacking basically. Um do not disturb please. Yes, there we go. Uh so yeah, that's that's the idea. Uh let's actually start with this one because uh this was an issue I was **[07:43]** running into just earlier today and Enzo already submitted a pull request which is really nice. Uh now the problem is I'll have to be a to um reproduce it. Let's go here. We have our feed controller and uh so what was happening? We've made some changes to our You know what I'm actually going to do because I still have the old code over here. Um, we made some changes in a **[08:14]** recent release and it broke some something and I want to uh to fix that. So, home controller. Uh, let's see. Um, yeah, it's it's I think uh this query over here. Let's see. Um so the difference between uh this one and this query here is that this uses the pagionate function and **[08:46]** there is a problem there. So so let's um let's just see. I think this will crash. I hope it crashes because then I have a uh a reproducible example um feed. Yeah. Okay. So this is good. This is the bug and Enzo has submitted a pull request for it. So let's uh what is pagionation joins composer JSON uh let's do def uh pag uh fe **[09:20]** pagination joints composer up let's see and so the error is gone That is perfect. Yes. Um actually I might as well then fix what I was do. Ah but this is No, I don't want to fix it because I I actually don't want pagionation here. But but okay, that's the uh the thing I had to check. So let's uh revert that. **[09:54]** Let's uh quickly review it as well. Let's check where Enzo didn't do anything weird. I don't think uh um I know what you're missing. Relative line numbers plus Vim motions. Otherwise, your PHP storm setup is superb. Really? It's rel like Vim. What is Vim motions? Uh are commands for fast efficient cursor movement. Yeah. Yeah. Yeah. Uh I don't think I like that. Relative **[10:25]** lines. H maybe that. Is that a plugin? Actually, let's try it out. Oh, and I need to zoom in. I want I want 110% today. I don't know. I want some more uh like a screen estate uh relative. No plugins, please. Line marketplace. Oh, there are like let's see what uh [snorts] replaces the line numbers in the gutter **[10:56]** with values relative to the car position. Okay, so let's install it. Let's let's give it a try, you know. Uh should I Yeah. Okay. I don't know if I like that. There's so much motion now. Like everything's changing. I'll I'll give it a try for uh it's in settings. Is this actually just **[11:29]** in I like line numbers. Oh, it's not even okay. I didn't know. Hey, I work for Jet Brains, but line number. Oh, no. This was part of the This was the plug-in. Okay. Okay. Let's enable it again. Relative line numbers. Boom. Save. Okay. **[12:04]** Uh, yeah. I'm not sure. So, so undefin explain to me why you you like this. Search for show line numbers and then show line numbers. Uh, okay. Yeah. So, it is hang on. So, let's disable the plug-in again. **[12:35]** Uh, relative line numbers. We don't need it anymore. Uh, save. Okay. Yeah. Okay. It's basically the same, right? Um, I'm using Vim, so that's why it's great you know where you'll jump, right? Yeah. Uh, deny. So then you can say, I want to jump to line eight, for example. Like I reckon **[13:08]** you do something like plus eight. I don't know if that Yeah. Uh line. What was it? Show line numbers. And what's hybrid actually? I'm going to do absolute, man. Yeah. No. **[13:41]** Oh, it's still okay, now it's good. Hey, thanks for the distraction. [laughter] Um, we were going to to review this one real quick, right? Uh so um the problem here was something with query builders being cloned and and not using the right um like copying everything over. And on top of that, pagionation uses the count query builder which didn't have joints. **[14:13]** So that's what we're adding here. Uh if source instance of support joins and this is in which method? Yeah. From C. Yeah. Yeah. Yeah. Yeah. Yeah. And then yeah, so there's a new interface uh two new interfaces probably. Um we need to fine-tune this some more. But this is this is the way we're what this is what we're doing right now. That's what we settled on. Uh if joins isn't uh yeah then we'll add a new uh this is in count **[14:46]** statement with joins. [snorts] Oh then we're just copying is Enzo here. Do you ever do pull requests in in PHPstorm? Uh there is a GitHub plugin. No, I don't use it. I like this interface more actually. Um **[15:21]** GitHub uh view pull requests and yeah, we need to look in right authorize. I can show you. Oh, but this is the wrong. I need to go to here, of course. Window GitHub. Oh, it's still indexing here. **[15:53]** Uh, few few pull requests. Origin So this one, right? And then actually what does the does it use the diff viewer here? Huh? Hey, maybe this is a good idea. **[16:24]** But the thing is, can I add review comments? Because I definitely like uh the diff viewer here. It's really nice, but I want to add inline comments. Okay, yours. Uh we'll try it like this. We'll try it like this. So uh and can we then check it if we So what I'm wondering about why uh don't we add the **[16:58]** joins to the existing statement start review over here. Okay. So now I did this one. Okay. Oh, and then I have to submit my review. Okay. So, yeah. Uh, so this is this supports join supports relations. I don't really **[17:29]** like it, but it is what it is. Um, it's okay for now. Uh, we need to make them public, of course. Yes. Okay. Scrolling here. This is Oh, this was just a wrong dog block. Sure. If Yeah. So these are the changes that um just for that and this is just a rename okay based on the interface I reckon uh **[17:59]** let's see supports uh it was probably in this one here get result relations yeah yeah okay so this and then support joins public array joins And then relations get get all resolved relations with our joint statement. Not sure what this then does no mu is here. Who is the author of this pull request? It was an oversight after **[18:31]** I was testing things. I'll clean it up. Okay. What software are you using for streaming OBS? Yesh. Uh uh what's upto? Good to see you and uh riffer rifer rifer 17,0002. Thank you for joining. Um the current relation names requested for eager loading. Okay. And get all **[19:02]** resolved. What are resolved relations? Oh, okay. Relation array. Okay, that makes sense. So that's good. Um yeah. Yeah. And then the count statement also has joins of course. Yeah. Uh which we were just missing basically. And okay, that looks good. And then select query builder. Um it's just a test. Okay, cool. Missing reviewer. Set myself as **[19:33]** reviewer. Submit. Uh request changes. It's pretty cool actually. So, let's go over here because Enzo did in fact um can I now uh can I update this branch changes from **[20:04]** refresh review data? Yeah. Okay. I guess that's it. Yeah. Okay. And then I have this one comment here. Um ah and I guess that's what Ilmu was uh referring to. I hope that's what Ilmu was refer Okay, I'll say Enzo from now because um I hope it is. Enzo, if you if you can give me like a a check that you were **[20:36]** replying to this uh message over here, then I can uh move on with my life basically. Uh and then after that you can merge. Okay, cool. Uh it is in fact the fact. Yes. Cool. Uh [snorts] so I I don't know Enzo if you uh saw it at the start of the stream, but this in fact does my issue. Uh does fix my issue. Wow. Words. Yes. Okay. Good morning. Uh Franken PHP worker mode is my PR still work in progress and then uh Enzo is working on this one. Is there **[21:08]** anything else um I need to resolve this uh problem? Okay. Serializer factory has a for property used in the RM mostly true. Okay, let's re let's do it like this. And uh that means Oh, I'll Yeah, I'll just do it like Oh, now I'm back in GitHub. Stupid **[21:40]** approve. So, this is this is a pretty cool refactor actually. It's one of these things that just had to be done and uh Enzo actually did it which is really nice. uh add reddis session manager. This is also one that's um you know just had to be done. Let's see what's I will give this a try. Which **[22:11]** Reddit client should we support? We already have support through tempest key value store. Uh okay details in the PR. Let's see. Uh because there was some discussion here before questions. Do we need actions in a cleanup function? Uh let's let's just first Okay. Sorry. Let's do it like this. Uh, I'll Can I now search for for this **[22:42]** search? Mhm. View timeline. What does that do? Oh, an AI assistant actually gives like a summary of the Oh, that's that's pretty cool as well. View timeline. Oh, that's probably just this. Okay. Okay. So, uh Reddis session config. Uh let's just take a look at session uh config. Right now, we have file session config, **[23:12]** right? Um so that we only well we support database sessions and file sessions. Uh and and this pull request is adding radius radius sessions. Uh do we yeah okay let's let's first look at this. So config that makes sense in yeah and done. Ah you know what we need to do here because this is in let's take a look. **[23:44]** So this is in HTTP. We actually don't do this in h but this is no this is so the the problem here is that HTTP doesn't have a dependency on radius on tempest key value store right which is **[24:14]** okay if you just install it as a standalone thing then that's fine. Um you only want this class to exist when tempest key value store is available. So what you actually need to do uh yeah this view is read only uh rep with uh guard check so that uh this class is only available when key value store **[24:46]** is installed. Um, where do we do this if class? Yeah. So, uh, see for example. **[25:18]** Mhm. In this case, uh you'd have to wrap it. You have to check for and now let's see in key value store which class makes sense for uh the existence of okay and actually we need to do that for the database session config as well. Ah, but this **[25:50]** no maybe it's not necessary because this is config. Uh, let's see. Let's see. Let's uh go to our pull request again. [snorts] Yeah, because none of this is discovered actually. So I can remove my comment. It's not **[26:20]** it's not a problem. Reddit session test. Yeah, I think this is like assuming all of this works which I assume has been tested. I think that should be fine. Let's see what was uh so questions. Do we need actions in cleanup function when we set the expiration on the Reddit store data? Is the Reddit session config uh the right way to set a prefix for session keys? Do we need multiple tag Reddit setups? How can we set up the Reddis **[26:51]** client to a different database for sessions? In this scenario, [snorts] Laravel uses multiple configuration and treats Reddits as a database. uh the radis cache uh client itself allows to set the prefix for the client as a whole. From my understanding to support that we need a tagged yeah session radis client. I don't understand how to do that without touching the key value store for example. Yeah. Uh let's see what did Enzo say about this. **[27:26]** Good question. And the key value store doesn't support tech configs yet, but this should be the way to go if you want multiple database support. With the prefix, I'd assume it'd be better uh it would be pretty safe to have sessions on the same database as the cache though, but I admit I don't know what are the best practices here. Okay, I'm going to do this in GitHub. **[27:57]** find this for now. Uh I don't think we should uh widen the scope of this PR and just assume one uh radis instance. Uh we can refactor uh we can add uh tagged radice configs later but let's not **[28:31]** complicate this PR with it. Apart from that, all looks fine. [snorts] Um, yeah, **[29:02]** let's approve. Actually, I can just merge this, right? What? No. H this this is this is stupid with the GitHub interface. Now I need to go back here and then I need to uh where where now do I find like that? I never know. There's one request to **[29:33]** change. What is that requested change? How do I show that requested change? Must I like scroll through here? Is there a better way of doing that? Like these are resolved, I reckon. So, what's the request to change? Can I go over here? No. **[30:05]** Yes, but where I know, but where is the request to change? So, I thought there was a way to show it over here with Yeah, because these are the resolved conversations, right? Yeah. Okay. This is what I was looking for. They are all resolved. So, what's the requested change? Enzo, do you know it's your change? But **[30:38]** I Yeah, I'll just tag Enzo. Did you still have a an open change request? If anyone knows, let me like tell me in chat because **[31:09]** few reviewed changes. Boom. This is just uh the diff. Since since I requested changes, GitHub wants me to re-review even though the conversations are resolved. Oh, really? Okay. So, I can basically Okay, you recruit. Okay. I see. It's weird, right? I find it weird, but **[31:43]** it's what it is. Okay. Uh, next one. PHP parser implementation of Yeah. So the problem here is that we don't support okay these are two alternatives. Okay let's see I've managed to make PH um PHP parser implementation which is needless to say much more elegant uh PHP parser implementations here. If someone could perhap benchmark both implementations **[32:14]** I'd be grateful. Okay, so what hap the problem here is that we only support fully qualified class names in our um in our dog blocks and Tempest actually relies on uh some dog blocks for example to determine um relations with with model for model properties and that's because PHP doesn't have generics. It's always generics. Um so this doesn't work **[32:48]** and so here are two solutions and we'll check them out. Uh let's see. So we have uh this is in property reflector right which is the good the right place. Uh use statement cache resolve type. Mhm. Mhm. And so we have this method here get iterable type which will get the doc comment and then do some uh regax matching on it. Mhm. And then **[33:21]** we'll determine the type based on that. But if you have this, the regax will match this. But that's not a valid type because you don't have its fully qualified class name. So what's need what needs to happen over here is if it contains uh backslashes, we'll just assume it's a fully qualified class name, which isn't entirely correct by the way because you can import um namespaces and then type **[33:54]** them from there. But and this is why I say [laughter] do block parsing is is such a mess and I just wanted fully only fully qualified class names. Um [snorts] and and Adrian is saying could be an attribute returns array class name and this is not true Adrian because the reason we're doing it like this is because this way we also get autocomp completion and static analysis on this array. So you you could of course you **[34:26]** could do it like this. Um let me let me copy that uh over here. Uh so you you could define a property like this but then uh you wouldn't have any static insights and and then you would end end up just adding at var uh uh yeah uh reviewer **[34:59]** like this app reviewer for example. then you would add the dog block anyway because you want static analysis. So if you need to write this anyway, why would you then add this? Because we can parse this. That's the the reason for it. Uh so we're resolving the short class name declaring class. We get the declaring class and then we uh do this with we catch this. That does make sense. Yeah. Um **[35:31]** and we do this. What's the cache key? The claring class name and the short name. Mhm. Okay. Come on, Brand. You work at Jet Brains. Just make them support Tempest hashtag returns. Yes. So that this is the the way to do it. Yes, true. Um [laughter] but believe me, it's not as easy as just making them do it. [laughter] Uh yeah, that's uh yeah, **[36:05]** I do think this is an unfortunate case of inconsistency. I understand why, but it doesn't feel tempesty. Yes. You know what we could do is is um we actually the right way of doing it would would be like this, right? Uh well no the the best way of doing it would be this uh array or collection I don't know but of course this doesn't work in PHP so we need to work around anyway uh we could do it **[36:36]** like this and actually this if I'm not mistaken uh is already possible uh no It's not possible. We we could make it work like this and then we could have the tempest plugin infer this and know that the like the array type should be this for example. We could make that work but then you would need a a a plug-in to do so. So and and the Tempest **[37:10]** plugin is still very much work in progress. Um, so yeah, I'm not sure to be honest. I wouldn't mind the repetition class naming attribute and at far as well just for IDE support. I'm not sure. I mind the repetition and you would need a PHP stand rule. PHP stand indeed wouldn't understand that as well. So it's just it adds a lot of it it's not like the a good solution. **[37:40]** The best solution would just be PHP having generics folks and anything else is just not really great. [laughter] Um, repetition could be optional uh like you allow it to be passed in the attribute but if you prefer you just in infer it from atvar. Yes. Ah yeah. Okay. Yeah. **[38:11]** Yeah, we could. And like the reason for this is that we wouldn't have to parse dog blocks. Basically, it would be a pretty simple feature to to add. Actually, uh like we we could even do it on this level here. And um for for example have an interface uh interface has iterable type something **[38:45]** like that and have um uh public uh type reflector uh getable type get like this. We could do it like this. and then R has many. I could implement has iterable type **[39:15]** and then return like the whatever is configured there that that could work. And then um over here in get iterable type we could easily do if this we are in the the property like so has attribute has iterable type uh if return this get attribute has ital type iterable type something like this that **[39:47]** would work. Um yeah, it would be a breaking change because um we would change the we would have to change the constructor of as many because now it just takes owner join and relation join. Uh it wouldn't be a breaking change if we do it like this. uh string class name. **[40:25]** Okay. But even if we do that which okay might be an interesting feature might be um because if you if you were to do it then if you were to use this part you wouldn't have to rely on dog block parsing which is string parsing which isn't like it does a regax match it's not super performant right um I'll make an issue for **[40:55]** uh support iterable type uh for has many I'm just going to paste my scratch file here just a scratch so that I don't forget basically and then fall back to doc block parsing thing. **[41:34]** PHP stand and repetition are red flag. Go with dog block for now. [laughter] Conflicting opinions here. Yeah, but this is ah the PHP stand part that's also important. Maybe I'll just close my issue. No, I'm going to close it. [laughter] No, I don't think **[42:05]** I I see I see no I see like no use case where you wouldn't add the dog block because who wants to work with these type of uh typed data objects basically without having autocomp completions on the array. Keep your issue man up. Keep your issues open. Uh [laughter] uh I'm conflicted about this. Okay, you **[42:38]** know what? Uh I'll reopen it up for discussion. [snorts] Uh and I'm not going to I'm going to add backlog here because I don't actually know whether we'll do it or not. Regardless of whether we do this or not, we'll have to still have the fallback for dot block. So, we still need this pull request, which is a good thing. I also noticed that my face is on top of the diff view **[43:10]** here. You can support has iterable type for performance and keep the dog block for ID support. Yes, I know. But that's that's also not a tempest thing to do. You know, just write one thing. don't don't have like multiple configuration options there to to make it all work in all cases. That's not a like the frame tempest can figure it out based on the do block you know why then should you write more that's but okay I get the **[43:40]** argument of it being inconsistent uh in this case I think repetition is not a bad comp okay you know what you know what we're going to do uh Paul uh add uh has many uh class name support or not? Yes. No. Start. Go ahead. And now I need to just make **[44:11]** sure. Can I? Oh, it's always good doing a vote. [laughter] Voted for no. Okay. We'll see. We'll see how how this evolves. [laughter] Um going back to the pull request then. So uh we have our get iterable type here. We have uh yes we do this which **[44:44]** isn't correct but okay maybe it's good enough otherwise we'll do a resolve short class name from uh yes we get the declaring class uh the cache key and then do resolve. I I don't really like this this pattern here, but okay. Um, but get a file. And so this is the problem with with imports by the way. You don't get reflection on them. If we got reflection, it wouldn't matter, but we actually have to do get the file name, right? Uh, and this is why all **[45:15]** this caching is required as well. Uh, will we'll have to parse the use statements. And this this will file get contents. This is so ugly, right? uh then we'll tokenize that content then so and like we're already going down a huge rabbit hole and this this okay we have some caching in between but this is being done for every time we we call iterable type right well **[45:46]** no we do it when there's no backslashes in the name okay uh so people who decide to use fully qualified names won't get affected by this. And so basically I reckon this pull requests then uh this version adds a like an actual parser for all of this. **[46:17]** So this is just okay this this is just finding out the the the thing and we have we need alias support uh skip whites space tokens parse namespace name blah blah blah parse alias parse group use which is also a thing do you see how how like complex all of this becomes get short name then [snorts] and now the complexity I don't really mind but the file get contents while this code is running. It's just **[46:48]** that's that's file IO, right? That's that's not good. That's not a good idea. Uh where's this PHP token class then? PHP token. Oh, what is this? Is this PHP token? Hang on. **[47:18]** PHP token. Is this just built into PHP? Yeah, it is. This class provides an alternative to token get all while the function returns tokens either as a single. Okay. I didn't know that was part of PHP. But still, I mean, we need to jump through a lot of hoops here. you can support uh I get your point, but we do have to work around PHP's limitations and relying on something **[47:49]** that has poor performance is not great. No. So, I don't like parsing fully qualified doc blocks. Uh like non fully qualified doc blocks and then I format the file and remove the fully qualified name from dock block. Yeah. Mhm. Okay. So apparently many people like it and the poll [laughter] um let's see we would use a collection for a DDD model of an array of emails and **[48:20]** PHP limitations is what would force us to use doc blocks not our own API. Yeah. So so you're talking about custom collection classes if I'm not mistaken. One thing is is telling Tempest how to build the model. The other thing is telling PHP the IDE how to understand it. No, I get that. I get that. It's just like just you're all right, but just imagine it from the user's perspective. Like for real, let's let's let's open a um **[48:54]** uh stitcher here. I I think I have some use uh uh is database model. Uh let's see. Yeah, this doesn't have any relations. Uh this neither also no has many also not. Okay, maybe this is too **[49:26]** too simple an example. Hang on. Uh Tempest uh database >> [snorts] >> So I I already dislike that we have this to be honest, but just imagine having to write this every time. **[49:59]** And and no, it's not it's not this. Hang on. Hang on. I'm going to show you like how stupid it is that you have to write this. Like this is exactly the kind of thing why why I I started working on Tempest because I didn't want uh hang on like this is just so stupid to me and and I'm sorry but the dog block is required like that's that's I I I **[50:30]** don't agree with anyone saying that they don't want this dog block here that they're not going to use this. they're going to use it because that's like the whole reason we have that's the whole idea of the OM. You have typed properties and you have static insight everywhere without having to rely on weird uh plugins or IDE helpers. That's the core of what this is about. So why would you need the repetition here? Like and and I I understand that there are reasons for it, but I'm just saying like this is this is stupid. I don't want **[51:01]** this. And yes, of course, it is a workaround because PHP doesn't have generics. I know. I know that. Dog block should only be for devs, not for declaring something. It's docs, not code. **[51:31]** Well, so the current state of PHP today is that uh we do more with Doug blocks than just documentation. That's just a fact. Everything with that's doing static analysis like with more complex typing than supported in PHP is defined in docs. That's not documentation. At least in my opinion, that's not just documentation. That's actually an integral part of **[52:04]** the compiler, which isn't really a thing in PHP, but that's just a part of your code in my opinion because I find these dog blocks like this type information to be a that that is a part of the language to me. It's unfortunate that we have to write it in dog blocks. Yes, but it is the only way. So I agree that in like the the the like the ideal world we wouldn't have to write it in do blocks in the ideal world we would have generics but we don't so we have to work **[52:36]** within that boundary. Um so yeah if you want to help defs or any static analysis tool to help to understand the context it's okay but parsing it relying on it in my opinion is bad. Yeah. And so so Symfony had done this for years with annotations before we got attributes in PHP. And uh Laravel actually also did did this at in some places I think I don't remember maybe not but um **[53:08]** and that's that's just us working around the limitations of PHP but there's like I'm not convinced that this is better than this. No, except maybe for performance reasons, but since like we only support fully qualified class names at the moment, uh there like performance is the performance impact is neglig **[53:40]** ignored. [laughter] Um it should be far chapter in this example. True. True. >> [snorts] >> having an attribute. This is our way to declare something. Doc blocks is just support part. No, but this I disagree that that static analysis is just the support part. I think that's what I'm trying to say. I don't agree with that. For me, static analysis is um is an **[54:11]** integral part of the of the language itself. That's where the confusion lies for developers. Is it documentation or is it logic that is going to be applied? Yeah, I understand that. I know it's a workaround, but it's just blurring the lines between code and comments. Okay, so let's make the distinction then between runtime and non-runtime code. Maybe that is a better better way of thinking about it and not documentation versus code, **[54:43]** but runtime code versus nonruntime code. static uh aesthetic analysis is just a deaf process part I don't know um yeah I like the way I think of static analysis that's that's not the case but I I'm I'm also advocating for making PHP **[55:13]** um like making the static analysis step required. Basically, I want PHP to ship with a built-in static analyzer and to at least have an option to force your code to be statically analyzed before it can be run to be compiled basically. So, I don't know if null is saying yeah to me or saying yeah to Ilmu. Uh could be both. We we all want PHP to have tools like Rust has. [sighs] **[55:45]** So, circling back to the point that Mar made I think was it? Uh, no. Uh, the point that Oh, I forgot your name. I think you mentioned it in a previous stream, right? Um, so I I do appreciate people saying that this driving runtime code is weird. I can see that. Admiral Mickey. That was it. **[56:21]** [snorts] So yours is saying this far has many actually. Um this was let's see uh I think the very first iteration of the RM looked like this **[56:52]** but that also like doesn't there were some problems with that approach as So all of this let's see I do agree that static analysis is basically required and atvar is definitely required. My point is that requiring users to use fully qualified class names is poor dx and I'd personally rather be explicit by specifying the short class name in hashtag has many in addition to addar short class name. **[57:24]** Yeah, I don't know. There is a there there like uh hang on. There is a short fully qualified. It's in code style somewhere I think. PHP doc uh short. Oh, now it's hang on. Let's search for his PHP doc **[57:54]** short. No, it's not here. Uh, it's annoying that this resets. [laughter] Okay, I'll have to read through it. Hang on. Um, I thought there was an option here to Oh, yeah. Yeah, use fully qualified class names here. There's a reason this this this is an option, right? Um, and there's a reason we have this option **[58:24]** in in formatterers as well. Um, and let's see what else. Whatever. So, so we we have two problems, right? We we don't have generics, which is always a problem. Do you like that? that like my one here starts at line number two. Um and the other problem is we don't **[58:56]** have reflection on uh use statements. So and these two together are just like out of our control. Uh it should start with zero. Uh and and I'm so so from my point of view like I I understand that **[59:27]** it's it's it's poor DX to to not have short class names in doc blocks. That's poor DX. I agree. But that that has been the case in PHP for forever basically that that this option is available. use fully qualified class names and it's on by default in in I I don't know with MAGO but with PHP CSS fixer previously it was on by default PHPstorm is on by default as well because because of like this limitation basically um **[60:01]** so we are we're already making compromises and then I rather just write it once instead of twice I rather just write this instead of also having to add well I rather no that's me of course I rather write this then hang on **[60:33]** Then to confuse everything, let's talk about VS Code autocomp completion support for now. Here's the thing. I gave uh Enzo a free license for PHP Storm. uh I told him to use it [laughter] because like I I I feel that that a big part of discussion is also driven by people not **[61:06]** using the right tools and and I mean Aiden are you still here in chess? Do you remember this was at the very start of Tempest I think but I was I was saying that I want to write a framework that that works with the right tools you know just just use a proper IDE don't don't like use a text editor uh [laughter] and it could not make me switch yeah and **[61:36]** then okay but then I can say then you'll have to deal with these kinds of things and have fun either use the correct tools or or I mean I I I just don't want to add more complications but I'll put my faith in Mago and all its future LSP. Yeah. Um, like at least to me this feels like a like a a workound on top of a workound and this **[62:08]** feels like only one workound like one level deep of a compromise because we don't have generics and this is two level deeps to me. I don't know if I make sense. Uh, but yeah, I rather would like to use attributes declaring it straight. This is a relation A has many of. Yeah. No. Yeah, I I understand that that people say this, but the whole OM was kind of designed to not having to use attributes. Also, um keep in mind that like and this this isn't entirely **[62:40]** the case because especially for databases, uh we have we we have the has many attributes. Um we have has many and we have uh belongs to um and that's that's because of or or has one we have as well. Um this is specifically for database models, right? But keep in mind that the whole RM of Tempest is designed to to be totally independent of databases. You can map any type of data into these objects. It **[63:11]** doesn't have to come from a database. we happen to have like a a convenience layer on top of it to because um people uh like like models are often very often stored in in the database. So it makes sense to have this layer of convenience there. But um yeah, I don't know. Code in attribute can be the source of truth. Maybe then dog blocks can be automatically generated and warranted. Yeah, but then we're we're into like the **[63:44]** the IDE helper territory which I also don't want to go into. I just want you know you're you're already writing this doc block. We already have it. It's it's not popular but it brings those attributes to laral eloquent. I don't know. I don't know what you mean by that. We do have attributes at the end of the day and that that that is true. And so that is true. And the reason we have these attributes is specifically for database uh queries. You don't need **[64:16]** these attributes if you're you know mapping your um your data from uh from a JSON file or an XML file or from an API endpoint. Um you only need these attributes for the database. And so and so that that kind of then also brings another layer of confusion, right? because suddenly you will have to need you you need to use as many uh even if your models aren't uh stored in the database. **[64:53]** Is that PHP fart using his personal account? [laughter] Okay, could be X Haven. I missed almost the entire stream again. Why do you assume the stream is already ending? We're like deep into uh rent territory here. Ah, it was not sending a uh a message. **[65:23]** Okay, maybe you like that might be spam protection from YouTube. Now, circling back to all of this, I let let's look at at the the implementation with PHP parser first because this this I don't want honestly. So, we kind of do resolve class short class name. **[66:01]** Mhm. Get use statements. Get parse you. Okay. Over here, parser factory. Create newest supported version. Parse. Um, and then we have our a. It's still pretty pretty complex. Like, right, we need to create a visitor for it, which is also what what um recctor does. And then uh we'll do some stuff here. And so this isn't like this isn't easy either, right? It's a bit easier, but not really all that great. **[66:36]** So I don't know. I'm saying we just wait for PHP to add generics and then this whole debate is going away. We're deep into something for sure. I'm still recovering from the don't use text editor. [laughter] Uh we need generics in PHP. Yeah. So, so if if we I think all of us agree with that, right? Hang on, hang on. I've discovered this poll option. Do we need generics in PHP? **[67:07]** Yes, no. Start poll. Um, go over to YouTube and uh and say yes or no. But if if all of us I assume all of us will say yes. If you're saying no, you have to write why in chat. But [snorts] um if we like we we all agree that generics are the solution here. So whatever approach we take, it's always a workound. It is it it will always be suboptimal. It will **[67:38]** always kind of suck, you know, and then I'd rather have it suck this way than another. There you voted yes on YouTube. So, okay. So, this means that we're in agreement. Uh, also like the video to which Thank you. **[68:14]** Uh, now I have to explain this to Oh, no. Haven is here, right? Oh, you're here. Okay. So, Haven uh he haven, right? Or heaven? No, because heaven is Oh, heaven. Is that how you write heaven? Can I just say Mark? Uh, I I'm not going to do either of these. like I really appreciate like for the record uh I really appreciate that uh **[68:46]** I'll check the link in a second uh uh Admiral uh but I really appreciate that you spent so much time on this but like and yes it's unfortunate but I don't want to add layers upon layers of of dealing with PHP's shortcomings. Let's just add generics. Hang on. I have to agree with Brent here. **[69:17]** What? [laughter] Can you please check the link in Discord chat? Let's see. Uh this link. Yeah, it's the only link here. What does this do? Laravel lift. Eloquent models on steroids. But hang on, let me first uh really appreciate the effort. But after thinking about it for a very long time, **[69:49]** I decided to not merge this. It's just not worth it. All the overhead. Let's just use fully qualified class names for now and hope PHP gets uh generics one day. One day this is the right one, right? Yeah. Uh **[70:20]** resolve class short class names invar block with the Yeah. Okay. Going to close this one as well. Uh, closing C for more info. I also Okay, so X heaven agrees. Uh, I I mean it fixes the original issue, but it **[70:51]** didn't feel right even when making it happen. Yeah. So, I wonder if generics will happen. PHP 10 will have generics. My mark my words. Yes, maybe it's um all compromise. Okay, so I need to check the link as well in Discord. Uh close. And but there's one more thing I had to do as well. Yeah, because the original issue actually **[71:26]** can be solved very easily. Watch me now. This is like uh like big brain coding here. Um we'll go to database.md. Yes. And then we'll go to has many has many. Tempest will infer relation based on **[71:56]** type information it gets from a public property with a reference to another class will be similar. While a property with a dog block that defines array types is assumed to be a hesmary. Uh warning. Look at this. Hello world. Uh, Tempest test a uh, hang on. Tempest new window. Bun run build. Oh, maybe maybe I should **[72:28]** pull. Ah, get pull. Of course. Uh, bun run build. O, build. Yes. Okay. Docs database and then Okay, I'm going to fix this. Hello world. Um, types in **[72:59]** dog blocks must always be fully fully qualified and not use short class names. And with that, that issue is solved. Oh, no, it's on main. Uh docs update. **[73:31]** Uh get Oh, I already in rel uh relation types in dock blocks like this. Like that. Like that. Boom. This uh Okay, **[74:02]** I I'll take a look at the window thing. By the way, um we're only at eight. Yeah. Uh not PHP 10 yet. Uh hang on, hang on. I I noticed something, Enzo. I don't know what the problem is, but this says 2.8. 8 and I tried to clear the cache and it doesn't like it keeps on 2.8 and same over here like 1.9 should be 2K. I don't know what's happening there. I'll I'll do a deploy and you'll see what uh um **[74:34]** like you see it going wrong. Uh let's make a uh now doc I need to look it up. Contributing I never know commit descriptions. No scopes. Docs. It actually is correct. Docs. Um, fully qualified type. Oh, hang on. Let me get this right from the from the start. Warning about **[75:06]** fully qualified types. No, no. Add biring fully con in has many relations ready for a review. This is just a doc so I can just merge quick before anyone notices. It was just docs, right? Yeah. Yeah. Um, **[75:37]** so I don't know what's what's uh uh Tempest docs. We should rename the repository here actually. But yeah, let's go to our actions because that should auto deploy. Yeah. [snorts] Yeah. Let's uh let's do it. Let's wait for a second here. Um, [sighs] and just make sure that it's uh **[76:14]** model relations. It should end up here, right? I vote for renaming repositories to tempest PHP framework and yeah maybe how docs was created. Is it a template or not? It's a [snorts] it's it's written from not from scratch but this is just like a markdown parser with some small layer on top of it. Uh **[76:45]** but it's not like existing documentation framework. Uh yeah, we'll have to wait for like another second. But um after lots of back and forth, I decided that we don't want that we that I don't want to support uh non fully qualified class names in relation **[77:16]** doc blocks for now. Um, I've added a warning in the docs about this. Issue solved, I would say. [snorts] And here it is. So, so the docs. Oh, now it is up there. What? No, the homepage. Oh. Huh. I I am I'm serious. I deployed **[77:47]** the docs website like numerous times over the past and this oh you know what happened I know what happened. Oh so earlier this day I cleared the cache manually. I think that's the problem. So I I went onto the server, I cleared the cache uh and refreshed and it still wasn't changing and then I got distracted but I didn't realize these pages are statically generated as well. So I clear I had to clear the cache and then regenerate the pages which is what **[78:18]** happened now. So I think like deploy does does not clear cache cache. Could that be the issue? And should we clear all the whole cache? Uh cache clear. Now let's see what we do. We do that. That's what **[78:50]** we do. So, so before static generates. So that should but when I when I look at this clearing the view cache see but nothing happens here. So we do the indexing then we do vid build. We run cache clear but it's not doing anything. I think that's I I think that's the problem. And I think that same problem might be true for migrations actually. Um **[79:21]** uh uh Tempest see and when you remove the force it actually does clear the cache. And this is exactly the problem we have with migrations as well that I noticed. Uh, so I think there's something wrong with the d-force. Yeah. So, but Enzo is saying in my local **[79:54]** environment I could not reproduce this and I agree. Yeah. Because I also cannot reproduce it in uh local environment. But if I were to sett uh signing key, that's okay. That's not a secret uh production. See, and it actually it fails. That's the problem. It doesn't work when environment is **[80:25]** production, which is why we have the forest parameter. Um, does this look like anything? No. Interesting, right? Uh, but but this is good because uh I can now edit only happens when an fire and **[80:56]** I'll do it like this. Interesting, right? I'll I'll look into this. Uh not right now, but uh and I reckon it's it's broken since 2.8 because that was the last version on uh on the docs before I manually cleared. But that's that's actually a pretty important issue to fix. Um, **[81:34]** did you already remove it? Awesome. [laughter] Oh, that's great. Yeah. Okay. So, we were looking at Laravel Lift and this will be the last thing we'll do today actually. Um, Lyft is a package that boosts your eloquent models in Laravel. It lets you create public properties in eloquent models that match your table schema. This makes your models Yeah. So this is basically the way Tempest does it, right? Is there an example? Use Lyft and then what **[82:05]** if just a small tip for everyone writing open source code? If you have like this package, something that is super easy to do that I think improves engagement is just have above the fold a code sample of what it does. Show me what this thing does, right? And what it looks like in practice uh without having to Okay, so th this just put this on the front page basically and then you're good. **[82:38]** Uh so yeah, cast float. But why why do we need this if we have this? That's that's I do like the the font that's being used for Hang on. Sorry, I'm getting distracted. But uh go. Yeah. Okay. Hang on. Hang on. I'm a professional here. Oh, there was my Okay, that was on the on the on the Uh, computed. **[83:08]** What font is that? Ah, okay. It's IBM Plex mono. I figured. Is that like a uh free font? Actually, this is so beautiful. Yeah. Okay. Um, it's free. Okay. I didn't know that. H. Okay. Okay. But I also like my font. **[83:43]** Um, what dogs builder would you recommend to use for open source project? I have no clue. Like I just I copied whatever I was I I already had. And if you go to um uh Tempest Tempest docs, you'll see that it's basically it's just a Tempest app. And what it does, let me show you, uh, in web and in documentation, it has this chapter repository. And the only thing it does, well, the only thing it does is **[84:13]** that it, let's see, glob over here. It globs all files, all markdown files in a specific folder. And it then parses that into a document structure. Basically, that's it is more than that with some beautiful styling created by Enzo that is like What what is the difference between the the cast int and type property? Yes, that this is what I don't really understand. Why why do you need this if you have this? **[84:50]** So yeah, was there anything particular you wanted me to look at? Um relations that was a problem. Ah for relations. Okay, let's take a look at the relations. Yes. Yes. Yes. uh relationships um hashtag belongs to user. So, but then you don't define the property. I mean that's weird. No, like the whole point is to do it through properties also. So why is **[85:20]** it like some asynchronous uh code uh code code styling uh thingy going on there were there were some unstyled code blocks. Mhm. [clears throat] Yeah. I don't know. I don't see how this is how I would like to use this over just having the property there. Um the force book is co heaven again is caused by the caution middleware conflicting with the default false value of the confirm method he already fixed **[85:52]** it. Cool. Are are you already working on a on a pull request for that heaven or or anyway I'll I'll follow up on it but hello from Brazil. I have a question. Do you think tempest can grow to laral level or higher or is your intention with it something else? I don't like um this is a good question but no **[86:23]** I I I don't think like I think if Laravel 10 years ago had the intention to be where it is today then it would have never gotten there. Um, [snorts] and I have no clue where it is going. Honestly, it's it's still in such a very early phase. There are still a couple of very important features that need to be added before we can actually say like, okay, this is a like fully featured can be used in in real **[86:53]** projects like bigger projects. Um and then there is the matter of of the ecosystem as well. It's not just the framework, right? The one of the things that gives Laravel so much value is the whole ecosystem around it and and that we also don't yet have. So I have no clue. I have no clue if we will ever get there or not. But what I do know um I started working on this when just as as an experiment um **[87:24]** and enough people joined right enough people were excited about it that it was worth looking further into and investing more time into it. Um like up until this point we have uh let's see around 70 contributors something like that 78 people who have contributed. Um, we like it it there are many people who who want this and and some people are are doing a lot of work. I'm thinking about Enzo. I'm also thinking about Haven over **[87:55]** here. Um, and uh, uh, Traus also did like a lot of work with installers especially over here. Yeah, I don't know their name but uh, and and and uh, Guom here as well. Um, oh, Sergio. I'm starting to remember these these faces. And there are so many more people. Of course, I'm just uh um cherrypicking a couple here. So, I don't know where I hope I really like at this **[88:25]** point. I hope that it's it's going to be uh a super usable and fun framework for real life projects. Um right now there is no no chance in competing with a Symphfony or Laravel because they have such a rich ecosystem. Um and also 10 to 20 years of like fine-tuning and bug fixing their framework. Um so so yeah, we're just not there yet. **[88:58]** So, not I I don't want to make any bold claims because doing so won't get us anywhere. Let's just focus on on the value we we can bring and and see how it grows. Does Tempest have a way to integrate composer packages and does it work with discovery? Yes, there is a documentation page on this uh uh packages package development. Here you go. Um and and as long as you require tempest **[89:28]** score uh discovery will just work. So that's really nice. Meanwhile, a haven just uh submitted this pull request. Uh let's see. Console is forced. generic console. This is change to the interface, right? This break and change. Although **[90:06]** [snorts] did we change that at some point that the default for confirm is true? Yeah. So dollar solution would have been to default true for confirm. No. Yeah. I don't like it either. Uh, okay. I'll I'm not going to like insta merge it. I want to give it some more thought. But yeah, this is indeed a uh solution that would work. **[90:39]** I'll probably merge it, but give me a second to think about and give Enzo a second to change the name of the pull request. So, um, so yeah, what I'm going to do, folks, is I'm I'm going to wrap up here. I think I don't know. We we merged one pull request. We closed two pull requests. We closed one issue and haven't submitted well we found out another issue and haven't haven't already submitted a pull request for it. So okay I would say productive stream. **[91:10]** Um but I just feel like my voice needs some some time off basically. Um tomorrow is my last day before my holiday and as I mentioned at the start of the stream I will be uh taking some time off some proper time off. I'm I don't want any uh I want to reduce my screen time as much as possible. So um I will probably gone for three weeks and then I will be back. Um oh yeah and we had a had a good discussion about generics and static **[91:42]** analysis and the meaning of life. So, um, uh, so this is this was the the last Tempest stream for a while, for a couple of weeks, and then we'll be back, uh, undoubtfully. So, uh, a few weeks going to be boring. Uh, heaven says, uh, actually, you know, I might I'm not going to make any hard promises here that I'm not going to do like full detox, but uh, we'll see. We'll see. The **[92:13]** the good thing is when I'm back, I'll be so re-energized. And actually, I I would advise you to do the same. Like take a week, maybe two weeks, and you'll you'll just like feel so much more productive when you when you'll get back. Um you can watch all the streams on YouTube again. There are like quite a lot of streams [laughter] already. Um but uh but yeah, so so that's the plan. Tomorrow I will do another live stream. It will be on Nuno's channel. Uh let me just quickly uh show that we're going to continue **[92:46]** last week our last week's um live stream. Nuno. Oh, he's already over here. Um last week we did a live stream where we discussed best practices in Laravel and it was nice because I got to mention Tempest here and there as well like saying, "Oh yeah, you know, you do know with these eloquent models, you know how I would do that." [laughter] Uh but it was really fun. We're going to do the same. Well, we're going to continue our story tomorrow. Um Oh, there it is already. I don't know what he did with with his thumbnail, but uh **[93:18]** so uh uh yeah, Nuno's last stream was in Portuguese. Yeah. Okay. But most of his streams are in English. Um so, uh I'm asking come from how Tempest handles things from creating files to setting up routes. It feels like a lot more mature than PHP. It also follows patterns I really like, especially not forced a forcing affixiction structure. Yeah, I mean these are things that people say they like about Tempest. So if you if you want to, you can uh you you can definitely use it. People are using it for real projects already. **[93:49]** There's just so much more work to be done and if you expect like a full and rich ecosystem like Laravel, that's that's there is some work to be done there. But I mean, everyone's welcome to uh to help with that. Um, so yeah, that's tomorrow's stream afternoon, my time at least. Um, hope to see you there. It's always good to have some Tempest enthusiasts in chat as well. So, if you're there, don't don't don't like hesitate dropping the Tempest name here and there, you know. Uh, we're we're here with mostly Laravel audience, but **[94:21]** uh uh yeah, always fun, right? Uh so so that's for tomorrow and then we'll uh we'll see each other in in January. Exactly. and definitely um I wish you all a a very good end of the year. Keep it safe. I don't know what you're going to do. Um but uh yeah, just enjoy enjoy this time off and and definitely like try to take some time off. Read a book or something. I have a couple of books that you could read. You can find **[94:52]** those uh on my blog if you want to. Okay. Um, some of you I'll see you tomorrow at Nunos indeed and then we'll uh we'll talk soon. Have a good time folks. Bye-bye.