<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ahmed Mohamed Abd El Ftah</title>
    <description>The latest articles on Forem by Ahmed Mohamed Abd El Ftah (@amaelftah).</description>
    <link>https://forem.com/amaelftah</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F260067%2F2fb46a99-f967-408a-9a81-328cce0577f4.jpeg</url>
      <title>Forem: Ahmed Mohamed Abd El Ftah</title>
      <link>https://forem.com/amaelftah</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/amaelftah"/>
    <language>en</language>
    <item>
      <title>How To Choose Open Source Package</title>
      <dc:creator>Ahmed Mohamed Abd El Ftah</dc:creator>
      <pubDate>Tue, 19 May 2020 22:02:04 +0000</pubDate>
      <link>https://forem.com/amaelftah/how-to-choose-open-source-package-2jah</link>
      <guid>https://forem.com/amaelftah/how-to-choose-open-source-package-2jah</guid>
      <description>&lt;p&gt;In this post I will show you what consideration to take when &lt;strong&gt;pulling open source packages&lt;/strong&gt; into your project.&lt;/p&gt;

&lt;p&gt;as pulling an unmaintained or badly designed package may be a &lt;strong&gt;costly decision&lt;/strong&gt; for your project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Number Of Stars
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--i1JF02Pp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r8nr9yt93cuo3p4vv4hx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--i1JF02Pp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/r8nr9yt93cuo3p4vv4hx.png" alt="Alt Text" width="880" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I tend to think the number of stars as &lt;strong&gt;likes&lt;/strong&gt; for a tweet. I know there are many unuseful tweets that have tons of likes. but in the dev community, the case is different.&lt;/p&gt;

&lt;p&gt;if you take a look on popular packages like &lt;a href="https://github.com/axios/axios"&gt;axios&lt;/a&gt; , &lt;a href="https://github.com/moment/moment"&gt;moment&lt;/a&gt;, &lt;a href="https://github.com/lodash/lodash"&gt;loadash&lt;/a&gt; . you will find they have tons of &lt;strong&gt;stars (likes)&lt;/strong&gt; which is a good indicator that other developers may have used them and decided to give &lt;strong&gt;star (like)&lt;/strong&gt; for the package.&lt;/p&gt;

&lt;p&gt;so before pulling a package check &lt;strong&gt;Number Of Stars&lt;/strong&gt; . as probably no one would star a package that caused him pain in his project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Number Of Used By
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7593EdEA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hhg6lbe3u2keh1836a84.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7593EdEA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/hhg6lbe3u2keh1836a84.png" alt="Alt Text" width="880" height="86"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;number of used by means other developers have &lt;strong&gt;pulled down&lt;/strong&gt; the package and &lt;strong&gt;used it&lt;/strong&gt; in their projects.&lt;/p&gt;

&lt;p&gt;while this metric &lt;strong&gt;may not be very useful&lt;/strong&gt; . as you may find many &lt;strong&gt;hobby projects&lt;/strong&gt; that pulled down this package for &lt;strong&gt;experimenting&lt;/strong&gt; it. but keep an eye on this metric when choosing a package.&lt;/p&gt;

&lt;h2&gt;
  
  
  Number Of Opened Issues
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gfH4oGcA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/utcfq9jb480zfku4jw8s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gfH4oGcA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/utcfq9jb480zfku4jw8s.png" alt="Alt Text" width="880" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;issues mostly mean &lt;strong&gt;bugs&lt;/strong&gt; that appeared in the package and need to be fixed. but also it could mean a &lt;strong&gt;question&lt;/strong&gt; or &lt;strong&gt;feature suggestion&lt;/strong&gt; or etc...&lt;/p&gt;

&lt;p&gt;the &lt;strong&gt;higher number of opened issues&lt;/strong&gt; may indicate that this package is &lt;strong&gt;less frequently maintained&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;the &lt;strong&gt;lower number of opened issues&lt;/strong&gt; means wither the author of the package is &lt;strong&gt;active and closes them frequently&lt;/strong&gt; or the package is &lt;strong&gt;solid enough&lt;/strong&gt; and it solves the current problem without any further updates.&lt;/p&gt;

&lt;h2&gt;
  
  
  Number Of Opened Pull Requests
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ITleUtYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kqj5m83zpqssvmay4xhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ITleUtYA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/kqj5m83zpqssvmay4xhe.png" alt="Alt Text" width="880" height="62"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;pull request means &lt;strong&gt;other developers are helping the author&lt;/strong&gt; to maintain the package by &lt;strong&gt;fixing bugs&lt;/strong&gt;, &lt;strong&gt;adding new features&lt;/strong&gt;, &lt;strong&gt;enhancing the code quality&lt;/strong&gt;, etc... &lt;/p&gt;

&lt;p&gt;but a &lt;strong&gt;higher number of opened pull requests&lt;/strong&gt; . could mean a &lt;strong&gt;higher number of unsolved bugs&lt;/strong&gt; or the maintainer lost his interest in this package.&lt;/p&gt;

&lt;p&gt;so a lower number of opened pull requests could be a good indicator that the author is &lt;strong&gt;listening to what developers need and accepting their contribution&lt;/strong&gt;. &lt;/p&gt;

&lt;h2&gt;
  
  
  Last Commit Date
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hnjcYOoY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yqcan61a52ubqts4ajic.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hnjcYOoY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yqcan61a52ubqts4ajic.png" alt="Alt Text" width="535" height="73"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;last commit date indicates if this package getting &lt;strong&gt;periodically updates&lt;/strong&gt; and keeping up with what's changing in the dev community or not.&lt;/p&gt;

&lt;p&gt;for example if a package has &lt;strong&gt;last commit a year ago&lt;/strong&gt;. this means you will depend on a package that isn't updated from a year. pulling it may be a &lt;strong&gt;costly decision&lt;/strong&gt;. so make sure to take a look at the last commit date&lt;/p&gt;

&lt;h2&gt;
  
  
  Code Quality
&lt;/h2&gt;

&lt;p&gt;last thing i tend to do is to check if this package has acceptable  quality code for me or not. &lt;/p&gt;

&lt;p&gt;as judging on package quality is &lt;strong&gt;subjective from developer to other&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;but for me i like to check:- &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;wither the package has &lt;strong&gt;tests&lt;/strong&gt; or not .&lt;/li&gt;
&lt;li&gt;is the code easy to &lt;strong&gt;read and understand&lt;/strong&gt; by quickly checking a couple of classes. 
as when the package is written in an understandable way this means the author of the package &lt;strong&gt;can easily update it&lt;/strong&gt;. or even me can contribute to the package .&lt;/li&gt;
&lt;li&gt;the &lt;strong&gt;package API is friendly and flexible&lt;/strong&gt; enough to cover my use case or not.&lt;/li&gt;
&lt;li&gt;last thing if I am not sure to wither pull it or not. I quickly pull it and do some &lt;strong&gt;proof of concept&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;hope you enjoyed these suggestions 😉 and keep your eyes on these metrics when pulling a new package into your project.&lt;/p&gt;

&lt;h4&gt;
  
  
  if you have other opinions or suggestions leave a comment and let's discuss.
&lt;/h4&gt;

</description>
      <category>opensource</category>
      <category>webdev</category>
      <category>tutorial</category>
      <category>git</category>
    </item>
    <item>
      <title>Notable Features In Laravel 7</title>
      <dc:creator>Ahmed Mohamed Abd El Ftah</dc:creator>
      <pubDate>Sat, 15 Feb 2020 21:50:52 +0000</pubDate>
      <link>https://forem.com/amaelftah/notable-features-in-laravel-7-56ke</link>
      <guid>https://forem.com/amaelftah/notable-features-in-laravel-7-56ke</guid>
      <description>&lt;h2&gt;
  
  
  Route Matching Performance
&lt;/h2&gt;

&lt;p&gt;the route matching will be twice faster than laravel 6 when using route:cache. thanks to symfony 5 &lt;a href="https://github.com/laravel/framework/pull/31449"&gt;PR Link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l7WrJyuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zfnbimnc2x8ddw5wfk0z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l7WrJyuL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/zfnbimnc2x8ddw5wfk0z.png" alt="Alt Text" width="475" height="211"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Guzzle Abstraction
&lt;/h2&gt;

&lt;p&gt;Laravel 7 will provide a guzzle abstraction to make most easy use cases easier to be handled through laravel instead of Guzzle &lt;a href="https://github.com/laravel/framework/pull/31449"&gt;PR Link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---W8amY_Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jzgc6njmkag8sr5xr9dv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---W8amY_Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/jzgc6njmkag8sr5xr9dv.png" alt="Guzzle abstraction" width="586" height="553"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Blade X
&lt;/h2&gt;

&lt;p&gt;laravel 7 will provide support for blade x component syntax &lt;a href="https://github.com/laravel/framework/pull/31363"&gt;PR Link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5n9Lujwj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eohp7eenop27m2agsv04.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5n9Lujwj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/eohp7eenop27m2agsv04.png" alt="Blade X" width="589" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizable Stubs
&lt;/h2&gt;

&lt;p&gt;stub files will be customizable &lt;a href="https://github.com/laravel/framework/pull/31054"&gt;PR Link&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--04LQKORg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/875xttk0490d0gagdgq2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--04LQKORg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/875xttk0490d0gagdgq2.png" alt="Alt Text" width="468" height="232"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Custom Cast Types + Object / Value Object Casts .
&lt;/h2&gt;

&lt;p&gt;this means you will be able to define your own custom cast types for Eloquent &lt;a href="https://github.com/laravel/framework/pull/31035"&gt;PR Link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--a8v9YGCu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yllzmez578awau92wed6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--a8v9YGCu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/yllzmez578awau92wed6.png" alt="Custom Cast Types" width="582" height="464"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  View Cache Optimization
&lt;/h2&gt;

&lt;p&gt;there will be a new config option called &lt;code&gt;expires&lt;/code&gt; inside &lt;code&gt;view.php&lt;/code&gt; which skip the check to see if a view has expired to determine if it needs to be recompiled &lt;a href="https://github.com/laravel/framework/pull/31206"&gt;PR Link For Full Benchmark&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--K5cS68Vn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5es5nthw2e9k8x7w3127.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--K5cS68Vn--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/5es5nthw2e9k8x7w3127.png" alt="Alt Text" width="527" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Dynamic Storage Links
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;php artisan storage:link&lt;/code&gt; was liking to &lt;code&gt;public&lt;/code&gt; directory by default . but in laravel 7 developers will define there own storage links dirs &lt;a href="https://github.com/laravel/framework/pull/31355"&gt;PR Link&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hjWZ9Ktz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7xu0zyeyoqq1xfxa33kt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hjWZ9Ktz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/7xu0zyeyoqq1xfxa33kt.png" alt="Alt Text" width="591" height="214"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;hope you enjoyed with these features and eager to upgrade to laravel 7 once it's officially released on march 😉 .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RjR2fM4q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1zc5dnpy2cvl0o359neq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RjR2fM4q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/i/1zc5dnpy2cvl0o359neq.png" alt="Alt Text" width="474" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>laravel</category>
      <category>php</category>
    </item>
  </channel>
</rss>
