SlideShare uma empresa Scribd logo
1 de 66
Baixar para ler offline
Mastering Composer
Adán Lobato
What’s up!

•

Soy Adán Lobato


•

Soy de Barcelona


•

Soy software developer


•

Backend Developer en SocialPoint


•

Mi twitter es @adanlobato
Agenda
•

Minimum stability


•

Branch aliases


•

Semantic versioning


•

Private Repositories


•

Installers


•

Embedded Composer


•

Useful links
Parental Advisory
Minimum stability
Minimum stability, the problem
Minimum stability exposed

Stable!
RC
“minimum-stability”:

Beta
Alpha
Dev

@stable
@rc
@beta
@alpha
@dev
minimum-stability, the global solution
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/common": "~2.2",
"twig/twig": "~1.11",
"psr/log": "~1.0"
},
“minimum-stability”: “dev”
}
@stability flags, the specific solution
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/common": “~2.2@dev",
"twig/twig": "~1.11",
"psr/log": "~1.0"
}
}
@stability flags, recursive stability
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/orm": “~2.2",
"doctrine/dbal": “@dev",
"twig/twig": "~1.11",
"psr/log": "~1.0"
}
}
prefer-stable, the “magic” solution
{
"require": {
"php": ">=5.3.3",
"symfony/icu": "~1.0",
"doctrine/common": "~2.2",
"twig/twig": "~1.11",
"psr/log": "~1.0"
},
“prefer-stable”: true
}
Branch aliases
Branch aliases, the problem
Branch aliases, the bad practice

{
"require": {
“welovephp/foobar”: “dev-master”
}
}
Branch aliases, the solution
{
“name”: “welovephp/foobar”
"extra": {
"branch-alias": {
"dev-master": "2.5-dev"
}
}
}
Branch aliases & stability flags

{
"require": {
“welovephp/foobar”: “2.5.*@dev”
}
}
Branch aliases, inline aliases

{
"require": {
“welovephp/foobar”: “my-branch as 2.5-dev”

}
}
Semantic
Versioning
Semantic versioning

X.Y.Z
Semantic versioning

X.Y.Z
Semantic versioning

X.Y.Z
Semantic versioning

X.Y.Z
Semantic versioning

1.*
Semantic versioning

>=1.1,<2.0
Semantic versioning

~1.1
Private

Repositories
Private Repositories, the basics
{
“repositories”: [
{
“type”: “git”,
“url”: “git@github.com/welovephp/foobar.git”
}
]
}
Private Repositories, the basics
{
“repositories”: [
{ “type”: “git”, “url”: “git@github.com/welovephp/foobar.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/foobar-bundle.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/fizz.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/buzz.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/fizzbuzz-bundle.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/qwerty.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/doe.git” }
]
}
Private Repositories, the basics
Private Repositories, the basics
Private Repositories:

Satis
Private Repositories, Satis

$ composer create-project composer/satis
Private Repositories, Satis
// config.json
{
"name": "WelovePhp",
"homepage": "http://packages.welovephp.es",
"require-all": true,
“repositories”: [
{ “type”: “git”, “url”: “git@github.com/welovephp/foobar.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/foobar-bundle.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/fizz.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/buzz.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/fizzbuzz-bundle.git” },
{ “type”: “git”, “url”: “git@github.com/welovephp/qwerty.git” }
]
}
Private Repositories, Satis

$ php bin/satis build config.json web/
Private Repositories, Satis
Private Repositories, Satis
{
"repositories": [
{
"type": "composer",
"url": “http://packages.welovephp.es/“
}
]
}
Private Repositories, Satis
Security:

•

Basic HTTP Authentication


•

SSH


•

Private network

!

Updates

•

CRON job
Private Repositories:

Packagist
Private Repositories, Packagist

•

Packagist is an Open Source project


•

It is built as a Symfony application


•

You can have your own private Packagist


•

Supports Github Webhooks
Private Repositories, Packagist

Requirements:

•

MySQL


•

Redis


•

Solr


•

git / svn / hg
Private Repositories:

Bottlenecks
Private Repositories, the bottlenecks
Installers
Installers, the official ones
•

Wordpress


•

Drupal


•

CakePHP


•

CodeIgniter


•

Laravel


•

Tons more!

http://github.com/composer/installers
Installers, building your own installer
{
"name": "welovephp/blog-module",
"type": “welovephp-module",
"require": {
“welovephp/module-installer-plugin“: "*"
}
}
Installers, building your own installer
{
"name": “welovephp/module-installer-plugin",
"type": "composer-plugin",
"autoload": {
"psr-0": {"WeLovePhpComposer": "src/"}
},
"extra": {
"class": "WeLovePhpComposerModuleInstallerPlugin"
},
"require": { "composer-plugin-api": “1.0.0"
}

}
Installers, building your own installer
namespace WeLovePhpComposer;
class ModuleInstallerPlugin implements PluginInterface
{
public function activate(Composer $composer, IOInterface $io)
{
$installer = new ModuleInstaller($io, $composer);
$composer->getInstallationManager()->addInstaller($installer);
}
}
Installers, building your own installer
namespace phpDocumentorComposer;

!
class ModuleInstaller extends LibraryInstaller
{
public function getPackageBasePath(PackageInterface $package)
{
return 'welovephp/modules/'.$package->getPrettyName();
}

!
public function supports($packageType)
{
return ‘welovephp-module' === $packageType;
}
}
Embedded
Composer
By Beau Simensen
Embedded Composer, the problem
•

You have an application


•

Your application has dependencies


•

Your application can be extended via third-party
plugins


•

Those plugins depend on your app, but can have
other extra dependencies


•

Both, app & plugins dependencies, must be installed
once and be compatible between them
Embedded Composer, the solution

We need to be able to run Composer on runtime
Embedded Composer & Sculpin.io
Commands you
must know
diagnose

$ composer diagnose
Checks common errors to help debugging problems.
—verbose

$ composer command […] -v|vv|vvv
Increase output verbosity. Useful for debugging.
config —global

$ composer config —global […]
Read/Write Composer global settings.
global

$ composer global require phpunit/phpunit
Add COMPOSER_HOME/vendor/bin to PATH

!

Run Composer operations globally. Useful for CLI
tools.
status

$ composer status
Displays a list of dependencies that have been
modified locally.
show

$ composer show package/name
Displays detailed information about a package.
dump-autoload —optimize

$ composer dump-autoload —
optimize
Dumps a classmap for PSR-0 vendors.
Useful links
Useful links
Composer

•

http://getcomposer.org/doc/


•

https://github.com/composer/composer


•

https://packagist.org/


•

#composerphp at twitter


!
Composer Basics

•

http://www.slideshare.net/adanlobato/composer-gestor-de-dependencias-para-php


•

http://www.youtube.com/watch?v=U1dTiDlUUmU


•

http://adanlobato.github.io/composer-2013
Useful links
Minimum stability

•

http://getcomposer.org/doc/04-schema.md#minimum-stability


•

http://getcomposer.org/doc/04-schema.md#package-links


•

https://igor.io/2013/02/07/composer-stability-flags.html


!
Branch alias

•

http://getcomposer.org/doc/articles/aliases.md


•

https://igor.io/2013/01/07/composer-versioning.html


!
Semantic versioning

•

http://semver.org/
Useful links
Private Repositories

•

https://github.com/composer/satis


•

https://github.com/composer/packagist


•

https://help.github.com/articles/post-receive-hooks


!
Installers

•

http://getcomposer.org/doc/articles/custom-installers.md


•

https://github.com/composer/installers


!
Useful links

Embedded Composer

•

https://speakerdeck.com/simensen/embedded-composer-sflive-portland-2013


•

https://github.com/dflydev/dflydev-embedded-composer


•

https://github.com/sculpin


!
That’s all folks!
Questions?

Mais conteúdo relacionado

Mais procurados

Stress Free Deployment - Confoo 2011
Stress Free Deployment  - Confoo 2011Stress Free Deployment  - Confoo 2011
Stress Free Deployment - Confoo 2011
Bachkoutou Toutou
 
Productivity 101: Making a Easily Re-deployable Dev Environment with Subversion
Productivity 101: Making a Easily Re-deployable Dev Environment with SubversionProductivity 101: Making a Easily Re-deployable Dev Environment with Subversion
Productivity 101: Making a Easily Re-deployable Dev Environment with Subversion
ryanduff
 

Mais procurados (19)

Building real time applications with Symfony2
Building real time applications with Symfony2Building real time applications with Symfony2
Building real time applications with Symfony2
 
Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014Big Data! Great! Now What? #SymfonyCon 2014
Big Data! Great! Now What? #SymfonyCon 2014
 
Indexing BackPAN
Indexing BackPANIndexing BackPAN
Indexing BackPAN
 
CommandBox REPL, CLI, and Package Manager
CommandBox REPL, CLI, and Package ManagerCommandBox REPL, CLI, and Package Manager
CommandBox REPL, CLI, and Package Manager
 
CPAN Workshop, Chicago 2014
CPAN Workshop, Chicago 2014CPAN Workshop, Chicago 2014
CPAN Workshop, Chicago 2014
 
CommandBox at CFCamp 2014
CommandBox at CFCamp 2014CommandBox at CFCamp 2014
CommandBox at CFCamp 2014
 
Live Coverage at The New York Times
Live Coverage at The New York TimesLive Coverage at The New York Times
Live Coverage at The New York Times
 
Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...
Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...
Creating a Smooth Development Workflow for High-Quality Modular Open-Source P...
 
PHP Dependency Management with Composer
PHP Dependency Management with ComposerPHP Dependency Management with Composer
PHP Dependency Management with Composer
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansible
 
Stress Free Deployment - Confoo 2011
Stress Free Deployment  - Confoo 2011Stress Free Deployment  - Confoo 2011
Stress Free Deployment - Confoo 2011
 
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
Continuous Integration with Open Source Tools - PHPUgFfm 2014-11-20
 
Untangling fall2017 week1
Untangling fall2017 week1Untangling fall2017 week1
Untangling fall2017 week1
 
Rails on HBase
Rails on HBaseRails on HBase
Rails on HBase
 
Untangling fall2017 week2
Untangling fall2017 week2Untangling fall2017 week2
Untangling fall2017 week2
 
Continuous Delivery and Infrastructure as Code
Continuous Delivery and Infrastructure as CodeContinuous Delivery and Infrastructure as Code
Continuous Delivery and Infrastructure as Code
 
Productivity 101: Making a Easily Re-deployable Dev Environment with Subversion
Productivity 101: Making a Easily Re-deployable Dev Environment with SubversionProductivity 101: Making a Easily Re-deployable Dev Environment with Subversion
Productivity 101: Making a Easily Re-deployable Dev Environment with Subversion
 
REST In Action: The Live Coverage Platform at the New York Times
REST In Action: The Live Coverage Platform at the New York TimesREST In Action: The Live Coverage Platform at the New York Times
REST In Action: The Live Coverage Platform at the New York Times
 
All the Laravel things: up and running to making $$
All the Laravel things: up and running to making $$All the Laravel things: up and running to making $$
All the Laravel things: up and running to making $$
 

Destaque

How Much Does it Cost to Build a Mobile App for iPhone & Android?
How Much Does it Cost to Build a Mobile App for iPhone & Android?How Much Does it Cost to Build a Mobile App for iPhone & Android?
How Much Does it Cost to Build a Mobile App for iPhone & Android?
Alex Sam
 

Destaque (13)

Composer: putting dependencies on the score
Composer: putting dependencies on the scoreComposer: putting dependencies on the score
Composer: putting dependencies on the score
 
Homepage i TOS - #Moja Srbija
Homepage i TOS - #Moja SrbijaHomepage i TOS - #Moja Srbija
Homepage i TOS - #Moja Srbija
 
Android tv market - March 2017 - analysis and commentary
Android tv market -  March 2017 - analysis and commentaryAndroid tv market -  March 2017 - analysis and commentary
Android tv market - March 2017 - analysis and commentary
 
Efficient development workflows with composer
Efficient development workflows with composerEfficient development workflows with composer
Efficient development workflows with composer
 
Ko konkuriše za nagradu EY Preduzetnik godine 2016?
Ko konkuriše za nagradu EY Preduzetnik godine 2016?Ko konkuriše za nagradu EY Preduzetnik godine 2016?
Ko konkuriše za nagradu EY Preduzetnik godine 2016?
 
Design Patterns in Swift ch0 Introduction
Design Patterns in Swift ch0 IntroductionDesign Patterns in Swift ch0 Introduction
Design Patterns in Swift ch0 Introduction
 
Custom Android App Development – Web Animation India
Custom Android App Development – Web Animation IndiaCustom Android App Development – Web Animation India
Custom Android App Development – Web Animation India
 
Android coding guidlines
Android coding guidlinesAndroid coding guidlines
Android coding guidlines
 
PHP Web Programming
PHP Web ProgrammingPHP Web Programming
PHP Web Programming
 
How Much Does it Cost to Build a Mobile App for iPhone & Android?
How Much Does it Cost to Build a Mobile App for iPhone & Android?How Much Does it Cost to Build a Mobile App for iPhone & Android?
How Much Does it Cost to Build a Mobile App for iPhone & Android?
 
Introduction to PHP
Introduction to PHPIntroduction to PHP
Introduction to PHP
 
How to deploy PHP projects with docker
How to deploy PHP projects with dockerHow to deploy PHP projects with docker
How to deploy PHP projects with docker
 
Smart Attendance Management System Using Android WIFI Technology
Smart Attendance Management System Using Android WIFI TechnologySmart Attendance Management System Using Android WIFI Technology
Smart Attendance Management System Using Android WIFI Technology
 

Semelhante a Mastering composer

Practical introduction to dev ops with chef
Practical introduction to dev ops with chefPractical introduction to dev ops with chef
Practical introduction to dev ops with chef
LeanDog
 

Semelhante a Mastering composer (20)

Php Dependency Management with Composer ZendCon 2017
Php Dependency Management with Composer ZendCon 2017Php Dependency Management with Composer ZendCon 2017
Php Dependency Management with Composer ZendCon 2017
 
Development Workflow Tools for Open-Source PHP Libraries
Development Workflow Tools for Open-Source PHP LibrariesDevelopment Workflow Tools for Open-Source PHP Libraries
Development Workflow Tools for Open-Source PHP Libraries
 
Composer
ComposerComposer
Composer
 
ASP.NET 5 auf Raspberry PI & docker
ASP.NET 5 auf Raspberry PI & dockerASP.NET 5 auf Raspberry PI & docker
ASP.NET 5 auf Raspberry PI & docker
 
Habitat Workshop at Velocity London 2017
Habitat Workshop at Velocity London 2017Habitat Workshop at Velocity London 2017
Habitat Workshop at Velocity London 2017
 
Composer Helpdesk
Composer HelpdeskComposer Helpdesk
Composer Helpdesk
 
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
Docker and serverless Randstad Jan 2019: OpenFaaS Serverless: when functions ...
 
Composer the right way [SweetlakePHP]
Composer the right way [SweetlakePHP]Composer the right way [SweetlakePHP]
Composer the right way [SweetlakePHP]
 
Composer JSON kills make files
Composer JSON kills make filesComposer JSON kills make files
Composer JSON kills make files
 
Kinect Workshop Part 1/2
Kinect Workshop Part 1/2Kinect Workshop Part 1/2
Kinect Workshop Part 1/2
 
Composer the right way
Composer the right wayComposer the right way
Composer the right way
 
Everything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPLEverything-as-code. A polyglot adventure. #DevoxxPL
Everything-as-code. A polyglot adventure. #DevoxxPL
 
Everything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventureEverything-as-code - A polyglot adventure
Everything-as-code - A polyglot adventure
 
Practical introduction to dev ops with chef
Practical introduction to dev ops with chefPractical introduction to dev ops with chef
Practical introduction to dev ops with chef
 
WordCamp Sacramento 2019: Modernizing Your Development Workflow Using Composer
WordCamp Sacramento 2019: Modernizing Your Development Workflow Using ComposerWordCamp Sacramento 2019: Modernizing Your Development Workflow Using Composer
WordCamp Sacramento 2019: Modernizing Your Development Workflow Using Composer
 
Composer
ComposerComposer
Composer
 
Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014Dependencies Managers in C/C++. Using stdcpp 2014
Dependencies Managers in C/C++. Using stdcpp 2014
 
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
Chef Fundamentals Training Series Module 3: Setting up Nodes and Cookbook Aut...
 
How to migrate SourcePro apps from Solaris to Linux
How to migrate SourcePro apps from Solaris to LinuxHow to migrate SourcePro apps from Solaris to Linux
How to migrate SourcePro apps from Solaris to Linux
 
DevOps on AWS: Accelerating Software Delivery with the AWS Developer Tools
DevOps on AWS: Accelerating Software Delivery with the AWS Developer ToolsDevOps on AWS: Accelerating Software Delivery with the AWS Developer Tools
DevOps on AWS: Accelerating Software Delivery with the AWS Developer Tools
 

Último

IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
Enterprise Knowledge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
giselly40
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
vu2urc
 

Último (20)

How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Data Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt RobisonData Cloud, More than a CDP by Matt Robison
Data Cloud, More than a CDP by Matt Robison
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
GenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdfGenAI Risks & Security Meetup 01052024.pdf
GenAI Risks & Security Meetup 01052024.pdf
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024Finology Group – Insurtech Innovation Award 2024
Finology Group – Insurtech Innovation Award 2024
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 

Mastering composer