{"action":"created","comment":{"url":"https://api.github.com/repos/akeneo/pim-docs/pulls/comments/36407333","id":36407333,"diff_hunk":"@@ -0,0 +1,450 @@\n+Understand the CSV Product Import\n+=================================\n+\n+We'll discuss here how the csv product import works.\n+\n+It's a good start to understand the overall architecture and how to re-use or replace some parts.\n+\n+Definition of the Job\n+---------------------\n+\n+The product import is defined in ``src\\Pim\\Bundle\\ConnectorBundle\\Resources\\config\\batch_jobs.yml``.\n+\n+.. code-block:: yaml\n+\n+    connector:\n+        name: Akeneo CSV Connector\n+        jobs:\n+            csv_product_import:\n+                title: pim_connector.jobs.csv_product_import.title\n+                type:  import\n+                steps:\n+                    validation:\n+                        title: pim_connector.jobs.csv_product_import.validation.title\n+                        class: %pim_connector.step.validator.class%\n+                        services:\n+                            charsetValidator: pim_connector.validator.item.charset_validator\n+                    import:\n+                        title:         pim_connector.jobs.csv_product_import.import.title\n+                        services:\n+                            reader:    pim_connector.reader.file.csv_product\n+                            processor: pim_connector.processor.denormalization.product.flat\n+                            writer:    pim_connector.writer.doctrine.product\n+                    import_associations:\n+                        title:         pim_connector.jobs.csv_product_import.import_associations.title\n+                        services:\n+                            reader:    pim_connector.reader.file.csv_association\n+                            processor: pim_connector.processor.denormalization.product_association.flat\n+                            writer:    pim_connector.writer.doctrine.product_association\n+\n+With the ``type`` parameter, we can see that this job is an import.\n+\n+We can also count 3 defined steps, ``validation``, ``import`` and ``import_associations``.\n+\n+Charset Validation Step\n+-----------------------\n+\n+The purpose of this step it to validate that the input file has the expected encoding (UTF-8 by default).\n+\n+This step is a custom step, not a default ``ItemStep``, so we need to define the custom class to use with the parameter ``class`` and the value ``%pim_connector.step.validator.class%``.\n+\n+.. code-block:: yaml\n+\n+    [...]\n+    validation:\n+        title: pim_connector.jobs.csv_product_import.validation.title\n+        class: %pim_connector.step.validator.class%\n+        services:\n+            charsetValidator: pim_connector.validator.item.charset_validator\n+    [...]\n+\n+This parameter ``pim_connector.step.validator.class`` is defined in ``src\\Pim\\Bundle\\ConnectorBundle\\Resources\\config\\steps.yml``.\n+\n+.. code-block:: yaml\n+\n+    parameters:\n+        pim_connector.step.validator.class: Pim\\Component\\Connector\\Step\\ValidatorStep\n+\n+We can also see that we inject a service ``pim_connector.validator.item.charset_validator`` in this step.\n+\n+This service is defined in ``src\\Pim\\Bundle\\ConnectorBundle\\Resources\\config\\items.yml``.\n+\n+.. code-block:: yaml\n+\n+    parameters:\n+        pim_connector.validator.item.charset_validator.class: Pim\\Component\\Connector\\Item\\CharsetValidator\n+\n+    services:\n+        pim_connector.validator.item.charset_validator:\n+            class: %pim_connector.validator.item.charset_validator.class%\n+\n+\n+The constructor of the ``CharsetValidator`` show that it's configured to check only a file which match some extensions and to check the 'UTF-8' encoding.\n+\n+.. code-block:: php\n+\n+    /**\n+     * @param array  $whiteListExtension\n+     * @param string $charset\n+     * @param int    $maxErrors\n+     */\n+    public function __construct(array $whiteListExtension = ['xls', 'xslx', 'zip'], $charset = 'UTF-8', $maxErrors = 10)\n+    // ...\n+\n+You can define your own service with the same class to validate other kind of files or change the encoding.\n+\n+The ``getConfigurationFields()`` methods indicates that this service needs to be configured with a ``filePath``.\n+\n+.. code-block:: php\n+\n+    /**\n+     * {@inheritdoc}\n+     */\n+    public function getConfigurationFields()\n+    {\n+        return [\n+            'filePath' => [\n+                'options' => [\n+                    'label' => 'pim_connector.import.filePath.label',\n+                    'help'  => 'pim_connector.import.filePath.help'\n+                ]\n+            ],\n+        ];\n+    }\n+\n+As it implements the ``Akeneo\\Bundle\\BatchBundle\\Step\\StepExecutionAwareInterface``, the step execution will be injected and useable during the execution.\n+\n+The ``Akeneo\\Bundle\\BatchBundle\\Entity\\StepExecution`` allows to add information, messages and counters during the execution.\n+\n+.. code-block:: php\n+\n+    // for instance, add a info message when the check is not performed\n+    $this->stepExecution->addSummaryInfo(\n+        'charset_validator.title',\n+        'job_execution.summary.charset_validator.skipped'\n+    );\n+\n+.. note::\n+\n+    This charset validator step can be re-used in other jobs (we use it in all file imports).\n+\n+.. note::\n+\n+    The parsing of the bath_jobs.yml is quite `specific`, you can take a look on this class to understand it ``Akeneo\\Bundle\\BatchBundle\\DependencyInjection\\Compiler\\RegisterJobsPass``.\n+\n+Product Import Step\n+-------------------\n+\n+The purpose of this step it to read input CSV file, to transform lines to product objects, to validate and save them in the PIM.\n+\n+This step is a default step, an ``Akeneo\\Bundle\\BatchBundle\\Step\\ItemStep`` is instanciated and injected.\n+\n+.. code-block:: yaml\n+\n+    [...]\n+    import:\n+        title:         pim_connector.jobs.csv_product_import.import.title\n+        services:\n+            reader:    pim_connector.reader.file.csv_product\n+            processor: pim_connector.processor.denormalization.product.flat\n+            writer:    pim_connector.writer.doctrine.product\n+    [...]\n+\n+An ``ItemStep`` always contains 3 elements, a ``Akeneo\\Bundle\\BatchBundle\\Item\\ItemReaderInterface``, a ``Akeneo\\Bundle\\BatchBundle\\Item\\ItemProcessorInterface`` and a ``Akeneo\\Bundle\\BatchBundle\\Item\\ItemWriterInterface``.\n+\n+We provides here specific implementations for these elements, the services are declared with aliases ``pim_connector.reader.file.csv_product``, ``pim_connector.processor.denormalization.product.flat``, ``pim_connector.writer.doctrine.product``.\n+\n+Product Reader\n+--------------\n+\n+This element reads a CSV file and returns item one by one with the following format (it indexes each CSV line with field names).\n+\n+.. code-block:: php\n+\n+    [\n+      'sku' => \"AKNTS_BPXS\"\n+      'categories' => \"goodies,tshirts\"\n+      'clothing_size' => \"xs\",\n+      'description-en_US-mobile' => \"Akeneo T-Shirt\",\n+    ]\n+\n+The service is defined in ``src\\Pim\\Bundle\\ConnectorBundle\\Resources\\config\\readers.yml``.\n+\n+.. code-block:: yaml\n+\n+    parameters:\n+        pim_connector.reader.file.csv_product.class: Pim\\Component\\Connector\\Reader\\File\\CsvProductReader\n+\n+    services:\n+        pim_connector.reader.file.csv_product:\n+            class: %pim_connector.reader.file.csv_product.class%\n+            arguments:\n+                - '@pim_catalog.repository.attribute'\n+\n+The class ``Pim\\Component\\Connector\\Reader\\File\\CsvProductReader`` extends a basic CsvReader which is used for other imports.\n+\n+.. note::\n+\n+    This step is able to extract a Zip archive which contains a CSV file and a folder for related images or files. The CSV file has to reference the files as relative path.\n+\n+Product Processor - Overview\n+----------------------------\n+\n+This element receives item one by one, fetches or creates the related product, updates and validates it.\n+\n+The service is defined in ``src\\Pim\\Bundle\\ConnectorBundle\\Resources\\config\\processors.yml``.\n+\n+.. code-block:: yaml\n+\n+    parameters:\n+        pim_connector.processor.denormalization.product.class: Pim\\Component\\Connector\\Processor\\Denormalization\\ProductProcessor\n+\n+    services:\n+        pim_connector.processor.denormalization.product.flat:\n+            class: %pim_connector.processor.denormalization.product.class%\n+            arguments:\n+                - '@pim_connector.array_converter.flat.product'\n+                - '@pim_catalog.repository.product'\n+                - '@pim_catalog.builder.product'\n+                - '@pim_catalog.updater.product'\n+                - '@pim_catalog.validator.product'\n+                - '@akeneo_storage_utils.doctrine.object_detacher'\n+                - '@pim_catalog.comparator.filter.product'\n+\n+The class ``Pim\\Component\\Connector\\Processor\\Denormalization\\ProductProcessor`` mainly delegates the operations to different technical and business services.\n+\n+.. code-block:: php\n+\n+    /**\n+     * @param StandardArrayConverterInterface       $arrayConverter array converter\n+     * @param IdentifiableObjectRepositoryInterface $repository     product repository\n+     * @param ProductBuilderInterface               $builder        product builder\n+     * @param ObjectUpdaterInterface                $updater        product updater\n+     * @param ValidatorInterface                    $validator      product validator\n+     * @param ObjectDetacherInterface               $detacher       detacher to remove it from UOW when skip\n+     * @param ProductFilterInterface                $productFilter  product filter\n+     */\n+    public function __construct(\n+        StandardArrayConverterInterface $arrayConverter,\n+        IdentifiableObjectRepositoryInterface $repository,\n+        ProductBuilderInterface $builder,\n+        ObjectUpdaterInterface $updater,\n+        ValidatorInterface $validator,\n+        ObjectDetacherInterface $detacher,\n+        ProductFilterInterface $productFilter\n+    ) {\n+        // ...\n+    }\n+\n+Product Processor - StandardArrayConverterInterface\n+---------------------------------------------------\n+\n+This service allows to transform the CSV array of items to the Standard Format array.\n+\n+.. code-block:: php\n+\n+    // CSV Format\n+    $csvItem = [\n+      'sku'                      => \"AKNTS_BPXS\"\n+      'categories'               => \"goodies,tshirts\"\n+      'clothing_size'            => \"xs\",\n+      'description-en_US-mobile' => \"Akeneo T-Shirt\",\n+    ];\n+\n+    $standardItem = $this->arrayConverter->convert($csvItem);\n+\n+    // Standard Format\n+    [\n+        'sku'           => [ 'data' => \"AKNTS_BPXS\", 'locale' => null, 'scope' => null ],\n+        'categories'    => [ \"goodies\", \"tshirts\" ],\n+        'clothing_size' => [ 'data' => \"xs\", 'locale' => null, 'scope' => null ]\n+    ]\n+\n+The class ``Pim\\Component\\Connector\\ArrayConverter\\Flat\\ProductStandardConverter`` provides a specific implementation to handle product data.\n+\n+.. note:\n+\n+    If you read another kind of file, xls, xml, json, etc, if you manage to convert the input array data to this format, all the other parts of the import will be reusable.\n+\n+.. note:\n+\n+    We tend to use this standard array format everywhere in the PIM, for imports, backend process, product edit form, variant group values, proposals, etc.\n+\n+    The versionning will be reworked in a future version to use it too.\n+\n+Product Processor - IdentifiableObjectRepositoryInterface\n+---------------------------------------------------------\n+\n+This service allows to fetch a product by its identifier (sku by default).\n+\n+.. code-block:: php\n+\n+    $product = $this->repository->findOneByIdentifier($identifier);\n+\n+\n+The ``Pim\\Bundle\\CatalogBundle\\Doctrine\\ORM\\Repository\\ProductRepository`` implements ``Akeneo\\Component\\StorageUtils\\Repository\\IdentifiableObjectRepositoryInterface``\n+\n+Product Processor - ProductBuilderInterface\n+-------------------------------------------\n+\n+If the product doesn't exist yet, we use this service to create it with its identifier and family code.\n+\n+.. code-block:: php\n+\n+    $product = $this->builder->createProduct($identifier, $familyCode);\n+\n+The service uses the class ``̀Pim\\Bundle\\CatalogBundle\\Builder\\ProductBuilder``.\n+\n+Product Processor - ProductFilterInterface\n+------------------------------------------\n+\n+When a product already exists, this service allows to normalize the current product data to the Standard Format array.\n+\n+Then it compares the current data against the update data provided by the StandardArrayConverterInterface to provide only new or changed values.\n+\n+This comparison mode can be enabled or disabled with the configuration parameter ``enabledComparison`` of the product import.\n+\n+.. code-block:: php\n+\n+    $filteredItem = $this->filterIdenticalData($product, $convertedItem);\n+\n+The service uses the class ``Pim\\Component\\Catalog\\Comparator\\Filter\\ProductFilter``.\n+\n+.. note::\n+\n+    This parameter can have a large impact on the performance.\n+\n+    When your import handles a file of existing products with a lot of columns but few updated values, it may divides the execution time by ~2.\n+\n+    When your import handles a file of existing products when all values are changed, it may causes an overhead of ~15%.\n+\n+    Don't hesitate to test and use different configurations for different product imports.\n+\n+Product Processor - ObjectUpdaterInterface\n+------------------------------------------\n+\n+Once fetched or created, this service allows to apply updates on the product.\n+\n+The format used by the update method is the Standard Format array.\n+\n+An important point to understand is that the updates are applied only in memory, nothing is yet saved in database.\n+\n+.. code-block:: php\n+\n+    $this->updater->update($product, $filteredItem);\n+\n+The service uses the class ``Pim\\Component\\Catalog\\Updater\\ProductUpdater``.\n+\n+Product Processor - ValidatorInterface\n+--------------------------------------\n+\n+Once updated, the product is validated by this service.\n+\n+This services uses a ``Symfony\\Component\\Validator\\Validator\\ValidatorInterface``.\n+\n+.. code-block:: php\n+\n+    $violations = $this->validator->validate($product);\n+\n+If violations are encountered, the product is skipped and the violation message is added in the execution report.\n+\n+When an item is skipped, or not returned by the processor, the writer doesn't receive it and it's not saved.\n+\n+.. code-block:: php\n+\n+    if ($violations->count() > 0) {\n+        $this->detachProduct($product);\n+        $this->skipItemWithConstraintViolations($item, $violations);\n+    }\n+\n+.. note::\n+\n+    You can notice here a very specific use of the ``ObjectDetacherInterface``, it allows to detach the product from the Doctrine Unit Of Work to avoid issues with skipped product and the ProductAssociation Step.\n+\n+    This detach operation is not the responsibility of the processor and the use here is a kind of workaround.\n+\n+Product Writer - Overview\n+-------------------------\n+\n+This element receives the validated products and save them to the database.\n+\n+The service is defined in ``src\\Pim\\Bundle\\ConnectorBundle\\Resources\\config\\writers.yml``.\n+\n+.. code-block:: yaml\n+\n+    parameters:\n+        pim_connector.writer.doctrine.product.class:             Pim\\Component\\Connector\\Writer\\Doctrine\\ProductWriter\n+\n+    services:\n+        pim_connector.writer.doctrine.product:\n+            class: %pim_connector.writer.doctrine.product.class%\n+            arguments:\n+                - '@pim_catalog.manager.media'\n+                - '@pim_versioning.manager.version'\n+                - '@pim_catalog.saver.product'\n+                - '@akeneo_storage_utils.doctrine.object_detacher'\n+\n+The class ``Pim\\Component\\Connector\\Writer\\Doctrine\\ProductWriter`` mainly delegates the operations to different technical and business services.\n+\n+.. code-block:: php\n+\n+    /**\n+     * Constructor\n+     *\n+     * @param MediaManager                $mediaManager\n+     * @param VersionManager              $versionManager\n+     * @param BulkSaverInterface          $productSaver\n+     * @param BulkObjectDetacherInterface $detacher\n+     */\n+    public function __construct(\n+        MediaManager $mediaManager,\n+        VersionManager $versionManager,\n+        BulkSaverInterface $productSaver,\n+        BulkObjectDetacherInterface $detacher\n+    ) {\n+        // ...\n+    }\n+\n+Product Writer - BulkSaverInterface\n+-----------------------------------\n+\n+This service allows to save many objects in the database.\n+\n+For the products, the implementation ``Pim\\Bundle\\CatalogBundle\\Doctrine\\Common\\Saver\\ProductSaver`` is used.\n+\n+A dedicated chapter explain how it works.\n+\n+Product Writer - BulkObjectDetacherInterface\n+--------------------------------------------\n+\n+This service allows to detach many objects from the Doctrine Unit Of Work to avoid to keep them in memory.\n+\n+In other terms, it avoids to keep all the processed objects in memory.\n+\n+A dedicated chapter explain how it works.","path":"cookbook/import_export/product-import.rst","position":431,"original_position":424,"commit_id":"a7a2b0226e065fe4901063e6459fdef6c0db107b","original_commit_id":"286d0e043115724ef310f68b980ffdf02cd69f1e","user":{"login":"MarieMinasyan","id":1398717,"avatar_url":"https://avatars.githubusercontent.com/u/1398717?v=3","gravatar_id":"","url":"https://api.github.com/users/MarieMinasyan","html_url":"https://github.com/MarieMinasyan","followers_url":"https://api.github.com/users/MarieMinasyan/followers","following_url":"https://api.github.com/users/MarieMinasyan/following{/other_user}","gists_url":"https://api.github.com/users/MarieMinasyan/gists{/gist_id}","starred_url":"https://api.github.com/users/MarieMinasyan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MarieMinasyan/subscriptions","organizations_url":"https://api.github.com/users/MarieMinasyan/orgs","repos_url":"https://api.github.com/users/MarieMinasyan/repos","events_url":"https://api.github.com/users/MarieMinasyan/events{/privacy}","received_events_url":"https://api.github.com/users/MarieMinasyan/received_events","type":"User","site_admin":false},"body":"\"explains\"","created_at":"2015-08-06T12:19:25Z","updated_at":"2015-08-06T12:19:25Z","html_url":"https://github.com/akeneo/pim-docs/pull/108#discussion_r36407333","pull_request_url":"https://api.github.com/repos/akeneo/pim-docs/pulls/108","_links":{"self":{"href":"https://api.github.com/repos/akeneo/pim-docs/pulls/comments/36407333"},"html":{"href":"https://github.com/akeneo/pim-docs/pull/108#discussion_r36407333"},"pull_request":{"href":"https://api.github.com/repos/akeneo/pim-docs/pulls/108"}}},"pull_request":{"url":"https://api.github.com/repos/akeneo/pim-docs/pulls/108","id":41581358,"html_url":"https://github.com/akeneo/pim-docs/pull/108","diff_url":"https://github.com/akeneo/pim-docs/pull/108.diff","patch_url":"https://github.com/akeneo/pim-docs/pull/108.patch","issue_url":"https://api.github.com/repos/akeneo/pim-docs/issues/108","number":108,"state":"open","locked":false,"title":"PIM-4437 enhance the import chapter","user":{"login":"nidup","id":2104359,"avatar_url":"https://avatars.githubusercontent.com/u/2104359?v=3","gravatar_id":"","url":"https://api.github.com/users/nidup","html_url":"https://github.com/nidup","followers_url":"https://api.github.com/users/nidup/followers","following_url":"https://api.github.com/users/nidup/following{/other_user}","gists_url":"https://api.github.com/users/nidup/gists{/gist_id}","starred_url":"https://api.github.com/users/nidup/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/nidup/subscriptions","organizations_url":"https://api.github.com/users/nidup/orgs","repos_url":"https://api.github.com/users/nidup/repos","events_url":"https://api.github.com/users/nidup/events{/privacy}","received_events_url":"https://api.github.com/users/nidup/received_events","type":"User","site_admin":false},"body":" - introduce a basic chapter on overall batch architecture\r\n - introduce a detailed explaination on csv product import\r\n\r\nfew fixes / enhancement related : https://github.com/akeneo/pim-community-dev/pull/3046 + https://github.com/akeneo/BatchBundle/pull/76\r\n\r\nTODO in another coming PR, explain a basic import, the product export, a basic export and  rework existing parts","created_at":"2015-08-04T15:16:46Z","updated_at":"2015-08-06T12:19:25Z","closed_at":null,"merged_at":null,"merge_commit_sha":"ee694b284d496100ff09ca28021955bffc5ea2ec","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/akeneo/pim-docs/pulls/108/commits","review_comments_url":"https://api.github.com/repos/akeneo/pim-docs/pulls/108/comments","review_comment_url":"https://api.github.com/repos/akeneo/pim-docs/pulls/comments{/number}","comments_url":"https://api.github.com/repos/akeneo/pim-docs/issues/108/comments","statuses_url":"https://api.github.com/repos/akeneo/pim-docs/statuses/a7a2b0226e065fe4901063e6459fdef6c0db107b","head":{"label":"akeneo:PIM-4437-improved-imports","ref":"PIM-4437-improved-imports","sha":"a7a2b0226e065fe4901063e6459fdef6c0db107b","user":{"login":"akeneo","id":2510186,"avatar_url":"https://avatars.githubusercontent.com/u/2510186?v=3","gravatar_id":"","url":"https://api.github.com/users/akeneo","html_url":"https://github.com/akeneo","followers_url":"https://api.github.com/users/akeneo/followers","following_url":"https://api.github.com/users/akeneo/following{/other_user}","gists_url":"https://api.github.com/users/akeneo/gists{/gist_id}","starred_url":"https://api.github.com/users/akeneo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akeneo/subscriptions","organizations_url":"https://api.github.com/users/akeneo/orgs","repos_url":"https://api.github.com/users/akeneo/repos","events_url":"https://api.github.com/users/akeneo/events{/privacy}","received_events_url":"https://api.github.com/users/akeneo/received_events","type":"Organization","site_admin":false},"repo":{"id":12193604,"name":"pim-docs","full_name":"akeneo/pim-docs","owner":{"login":"akeneo","id":2510186,"avatar_url":"https://avatars.githubusercontent.com/u/2510186?v=3","gravatar_id":"","url":"https://api.github.com/users/akeneo","html_url":"https://github.com/akeneo","followers_url":"https://api.github.com/users/akeneo/followers","following_url":"https://api.github.com/users/akeneo/following{/other_user}","gists_url":"https://api.github.com/users/akeneo/gists{/gist_id}","starred_url":"https://api.github.com/users/akeneo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akeneo/subscriptions","organizations_url":"https://api.github.com/users/akeneo/orgs","repos_url":"https://api.github.com/users/akeneo/repos","events_url":"https://api.github.com/users/akeneo/events{/privacy}","received_events_url":"https://api.github.com/users/akeneo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/akeneo/pim-docs","description":"Akeneo PIM documentation","fork":false,"url":"https://api.github.com/repos/akeneo/pim-docs","forks_url":"https://api.github.com/repos/akeneo/pim-docs/forks","keys_url":"https://api.github.com/repos/akeneo/pim-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akeneo/pim-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akeneo/pim-docs/teams","hooks_url":"https://api.github.com/repos/akeneo/pim-docs/hooks","issue_events_url":"https://api.github.com/repos/akeneo/pim-docs/issues/events{/number}","events_url":"https://api.github.com/repos/akeneo/pim-docs/events","assignees_url":"https://api.github.com/repos/akeneo/pim-docs/assignees{/user}","branches_url":"https://api.github.com/repos/akeneo/pim-docs/branches{/branch}","tags_url":"https://api.github.com/repos/akeneo/pim-docs/tags","blobs_url":"https://api.github.com/repos/akeneo/pim-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akeneo/pim-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akeneo/pim-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/akeneo/pim-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akeneo/pim-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/akeneo/pim-docs/languages","stargazers_url":"https://api.github.com/repos/akeneo/pim-docs/stargazers","contributors_url":"https://api.github.com/repos/akeneo/pim-docs/contributors","subscribers_url":"https://api.github.com/repos/akeneo/pim-docs/subscribers","subscription_url":"https://api.github.com/repos/akeneo/pim-docs/subscription","commits_url":"https://api.github.com/repos/akeneo/pim-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/akeneo/pim-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/akeneo/pim-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/akeneo/pim-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/akeneo/pim-docs/contents/{+path}","compare_url":"https://api.github.com/repos/akeneo/pim-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akeneo/pim-docs/merges","archive_url":"https://api.github.com/repos/akeneo/pim-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akeneo/pim-docs/downloads","issues_url":"https://api.github.com/repos/akeneo/pim-docs/issues{/number}","pulls_url":"https://api.github.com/repos/akeneo/pim-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/akeneo/pim-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/akeneo/pim-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akeneo/pim-docs/labels{/name}","releases_url":"https://api.github.com/repos/akeneo/pim-docs/releases{/id}","created_at":"2013-08-18T10:17:30Z","updated_at":"2015-04-29T14:41:33Z","pushed_at":"2015-08-06T12:11:44Z","git_url":"git://github.com/akeneo/pim-docs.git","ssh_url":"git@github.com:akeneo/pim-docs.git","clone_url":"https://github.com/akeneo/pim-docs.git","svn_url":"https://github.com/akeneo/pim-docs","homepage":"","size":3204,"stargazers_count":12,"watchers_count":12,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":24,"mirror_url":null,"open_issues_count":5,"forks":24,"open_issues":5,"watchers":12,"default_branch":"master"}},"base":{"label":"akeneo:master","ref":"master","sha":"d8f1b3d9d5adb5545efa593f65f726f8bcb963ae","user":{"login":"akeneo","id":2510186,"avatar_url":"https://avatars.githubusercontent.com/u/2510186?v=3","gravatar_id":"","url":"https://api.github.com/users/akeneo","html_url":"https://github.com/akeneo","followers_url":"https://api.github.com/users/akeneo/followers","following_url":"https://api.github.com/users/akeneo/following{/other_user}","gists_url":"https://api.github.com/users/akeneo/gists{/gist_id}","starred_url":"https://api.github.com/users/akeneo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akeneo/subscriptions","organizations_url":"https://api.github.com/users/akeneo/orgs","repos_url":"https://api.github.com/users/akeneo/repos","events_url":"https://api.github.com/users/akeneo/events{/privacy}","received_events_url":"https://api.github.com/users/akeneo/received_events","type":"Organization","site_admin":false},"repo":{"id":12193604,"name":"pim-docs","full_name":"akeneo/pim-docs","owner":{"login":"akeneo","id":2510186,"avatar_url":"https://avatars.githubusercontent.com/u/2510186?v=3","gravatar_id":"","url":"https://api.github.com/users/akeneo","html_url":"https://github.com/akeneo","followers_url":"https://api.github.com/users/akeneo/followers","following_url":"https://api.github.com/users/akeneo/following{/other_user}","gists_url":"https://api.github.com/users/akeneo/gists{/gist_id}","starred_url":"https://api.github.com/users/akeneo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/akeneo/subscriptions","organizations_url":"https://api.github.com/users/akeneo/orgs","repos_url":"https://api.github.com/users/akeneo/repos","events_url":"https://api.github.com/users/akeneo/events{/privacy}","received_events_url":"https://api.github.com/users/akeneo/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/akeneo/pim-docs","description":"Akeneo PIM documentation","fork":false,"url":"https://api.github.com/repos/akeneo/pim-docs","forks_url":"https://api.github.com/repos/akeneo/pim-docs/forks","keys_url":"https://api.github.com/repos/akeneo/pim-docs/keys{/key_id}","collaborators_url":"https://api.github.com/repos/akeneo/pim-docs/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/akeneo/pim-docs/teams","hooks_url":"https://api.github.com/repos/akeneo/pim-docs/hooks","issue_events_url":"https://api.github.com/repos/akeneo/pim-docs/issues/events{/number}","events_url":"https://api.github.com/repos/akeneo/pim-docs/events","assignees_url":"https://api.github.com/repos/akeneo/pim-docs/assignees{/user}","branches_url":"https://api.github.com/repos/akeneo/pim-docs/branches{/branch}","tags_url":"https://api.github.com/repos/akeneo/pim-docs/tags","blobs_url":"https://api.github.com/repos/akeneo/pim-docs/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/akeneo/pim-docs/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/akeneo/pim-docs/git/refs{/sha}","trees_url":"https://api.github.com/repos/akeneo/pim-docs/git/trees{/sha}","statuses_url":"https://api.github.com/repos/akeneo/pim-docs/statuses/{sha}","languages_url":"https://api.github.com/repos/akeneo/pim-docs/languages","stargazers_url":"https://api.github.com/repos/akeneo/pim-docs/stargazers","contributors_url":"https://api.github.com/repos/akeneo/pim-docs/contributors","subscribers_url":"https://api.github.com/repos/akeneo/pim-docs/subscribers","subscription_url":"https://api.github.com/repos/akeneo/pim-docs/subscription","commits_url":"https://api.github.com/repos/akeneo/pim-docs/commits{/sha}","git_commits_url":"https://api.github.com/repos/akeneo/pim-docs/git/commits{/sha}","comments_url":"https://api.github.com/repos/akeneo/pim-docs/comments{/number}","issue_comment_url":"https://api.github.com/repos/akeneo/pim-docs/issues/comments{/number}","contents_url":"https://api.github.com/repos/akeneo/pim-docs/contents/{+path}","compare_url":"https://api.github.com/repos/akeneo/pim-docs/compare/{base}...{head}","merges_url":"https://api.github.com/repos/akeneo/pim-docs/merges","archive_url":"https://api.github.com/repos/akeneo/pim-docs/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/akeneo/pim-docs/downloads","issues_url":"https://api.github.com/repos/akeneo/pim-docs/issues{/number}","pulls_url":"https://api.github.com/repos/akeneo/pim-docs/pulls{/number}","milestones_url":"https://api.github.com/repos/akeneo/pim-docs/milestones{/number}","notifications_url":"https://api.github.com/repos/akeneo/pim-docs/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/akeneo/pim-docs/labels{/name}","releases_url":"https://api.github.com/repos/akeneo/pim-docs/releases{/id}","created_at":"2013-08-18T10:17:30Z","updated_at":"2015-04-29T14:41:33Z","pushed_at":"2015-08-06T12:11:44Z","git_url":"git://github.com/akeneo/pim-docs.git","ssh_url":"git@github.com:akeneo/pim-docs.git","clone_url":"https://github.com/akeneo/pim-docs.git","svn_url":"https://github.com/akeneo/pim-docs","homepage":"","size":3204,"stargazers_count":12,"watchers_count":12,"language":"CSS","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":24,"mirror_url":null,"open_issues_count":5,"forks":24,"open_issues":5,"watchers":12,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/akeneo/pim-docs/pulls/108"},"html":{"href":"https://github.com/akeneo/pim-docs/pull/108"},"issue":{"href":"https://api.github.com/repos/akeneo/pim-docs/issues/108"},"comments":{"href":"https://api.github.com/repos/akeneo/pim-docs/issues/108/comments"},"review_comments":{"href":"https://api.github.com/repos/akeneo/pim-docs/pulls/108/comments"},"review_comment":{"href":"https://api.github.com/repos/akeneo/pim-docs/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/akeneo/pim-docs/pulls/108/commits"},"statuses":{"href":"https://api.github.com/repos/akeneo/pim-docs/statuses/a7a2b0226e065fe4901063e6459fdef6c0db107b"}}}}