- $HOME/.npm
- $HOME/.yarn-cache
+if: |
+ type = pull_request OR \
+ branch = master
+
php:
- 7.1
- 7.2
- 7.3
- 7.4
- - nightly
node_js:
- "5"
matrix:
fast_finish: true
include:
- - php: 7.2
+ - php: 7.3
env: CS_FIXER=run VALIDATE_TRANSLATION_FILE=run ASSETS=build DB=sqlite
allow_failures:
- php: 7.4
- - php: nightly
# exclude v1 branches
branches:
+++ /dev/null
-set :deploy_config_path, 'app/config/capistrano/deploy.rb'
-set :stage_config_path, 'app/config/capistrano/deploy'
-
-# Load DSL and set up stages
-require 'capistrano/setup'
-
-# Include default deployment tasks
-require 'capistrano/deploy'
-
-require 'capistrano/composer'
-require 'capistrano/file-permissions'
-require 'capistrano/symfony'
-
-# Load custom tasks from `lib/capistrano/tasks` if you have any defined
-Dir.glob('lib/capistrano/tasks/*.rake').each { |r| import r }
+++ /dev/null
-source "https://rubygems.org"
-
-gem 'capistrano', '~> 3.4'
-gem 'capistrano-composer'
-gem 'capistrano-symfony', '~> 1.0.0.rc1'
-gem 'capistrano-file-permissions'
+++ /dev/null
-GEM
- remote: https://rubygems.org/
- specs:
- capistrano (3.4.0)
- i18n
- rake (>= 10.0.0)
- sshkit (~> 1.3)
- capistrano-composer (0.0.6)
- capistrano (>= 3.0.0.pre)
- capistrano-file-permissions (1.0.0)
- capistrano (~> 3.0)
- capistrano-symfony (1.0.0.rc1)
- capistrano (~> 3.1)
- capistrano-composer (~> 0.0.3)
- capistrano-file-permissions (~> 1.0)
- colorize (0.7.7)
- i18n (0.7.0)
- net-scp (1.2.1)
- net-ssh (>= 2.6.5)
- net-ssh (2.9.2)
- rake (10.4.2)
- sshkit (1.7.1)
- colorize (>= 0.7.0)
- net-scp (>= 1.1.2)
- net-ssh (>= 2.8.0)
-
-PLATFORMS
- ruby
-
-DEPENDENCIES
- capistrano (~> 3.4)
- capistrano-composer
- capistrano-file-permissions
- capistrano-symfony (~> 1.0.0.rc1)
-
-BUNDLED WITH
- 1.13.5
+++ /dev/null
-# config valid only for current version of Capistrano
-
-set :application, 'wallabag'
-set :repo_url, 'git@github.com:wallabag/wallabag.git'
-
-set :ssh_user, 'framasoft_bag'
-server '78.46.248.87', user: fetch(:ssh_user), roles: %w{web app db}
-
-set :format, :pretty
-set :log_level, :info
-# set :log_level, :debug
-
-set :composer_install_flags, '--no-dev --prefer-dist --no-interaction --optimize-autoloader'
-
-set :linked_files, %w{app/config/parameters.yml}
-set :linked_dirs, [fetch(:log_path), "var/sessions", "web/uploads", "data"]
-set :keep_releases, 3
-
-after 'deploy:updated', 'symfony:cache:clear'
+++ /dev/null
-set :branch, 'master'
-set :deploy_to, '/var/www/v2.wallabag.org/web/'
},
{
"name": "friendsofsymfony/oauth2-php",
- "version": "1.2.3",
+ "version": "1.3.0",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfSymfony/oauth2-php.git",
- "reference": "a41fef63f81ef2ef632350a6c7dc66d15baa9240"
+ "reference": "606b8ea1c3c927c272ac1409116332ad5a2ed94c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FriendsOfSymfony/oauth2-php/zipball/a41fef63f81ef2ef632350a6c7dc66d15baa9240",
- "reference": "a41fef63f81ef2ef632350a6c7dc66d15baa9240",
+ "url": "https://api.github.com/repos/FriendsOfSymfony/oauth2-php/zipball/606b8ea1c3c927c272ac1409116332ad5a2ed94c",
+ "reference": "606b8ea1c3c927c272ac1409116332ad5a2ed94c",
"shasum": ""
},
"require": {
- "php": "^5.5.9|>=7.0.8",
- "symfony/http-foundation": "~3.0|~4.0"
+ "php": "^5.5.9|^7.0.8|^7.1.3|^7.2.5",
+ "symfony/http-foundation": "~3.0|~4.0|~5.0"
},
"require-dev": {
- "phpunit/phpunit": "~4.0"
+ "phpunit/phpunit": "^4.8 || ^5.0"
},
"type": "library",
"extra": {
"autoload": {
"psr-4": {
"OAuth2\\": "lib/"
- }
+ },
+ "exclude-from-classmap": [
+ "/tests/"
+ ]
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"oauth",
"oauth2"
],
- "time": "2018-01-30T19:58:25+00:00"
+ "time": "2020-03-03T22:14:46+00:00"
},
{
"name": "friendsofsymfony/rest-bundle",
- "version": "2.7.1",
+ "version": "2.7.2",
"source": {
"type": "git",
"url": "https://github.com/FriendsOfSymfony/FOSRestBundle.git",
- "reference": "affb4fe1eb079b9b659656bd548b7089c0a04fb2"
+ "reference": "22fbbc35a2964564bfde765007655174262315c9"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/affb4fe1eb079b9b659656bd548b7089c0a04fb2",
- "reference": "affb4fe1eb079b9b659656bd548b7089c0a04fb2",
+ "url": "https://api.github.com/repos/FriendsOfSymfony/FOSRestBundle/zipball/22fbbc35a2964564bfde765007655174262315c9",
+ "reference": "22fbbc35a2964564bfde765007655174262315c9",
"shasum": ""
},
"require": {
"keywords": [
"rest"
],
- "time": "2020-02-24T09:04:31+00:00"
+ "time": "2020-03-04T21:18:53+00:00"
},
{
"name": "friendsofsymfony/user-bundle",
},
{
"name": "incenteev/composer-parameter-handler",
- "version": "v2.1.3",
+ "version": "v2.1.4",
"source": {
"type": "git",
"url": "https://github.com/Incenteev/ParameterHandler.git",
- "reference": "933c45a34814f27f2345c11c37d46b3ca7303550"
+ "reference": "084befb11ec21faeadcddefb88b66132775ff59b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/933c45a34814f27f2345c11c37d46b3ca7303550",
- "reference": "933c45a34814f27f2345c11c37d46b3ca7303550",
+ "url": "https://api.github.com/repos/Incenteev/ParameterHandler/zipball/084befb11ec21faeadcddefb88b66132775ff59b",
+ "reference": "084befb11ec21faeadcddefb88b66132775ff59b",
"shasum": ""
},
"require": {
"php": ">=5.3.3",
- "symfony/yaml": "^2.3 || ^3.0 || ^4.0"
+ "symfony/yaml": "^2.3 || ^3.0 || ^4.0 || ^5.0"
},
"require-dev": {
"composer/composer": "^1.0@dev",
- "symfony/filesystem": "^2.3 || ^3 || ^4",
- "symfony/phpunit-bridge": "^4.0"
+ "symfony/filesystem": "^2.3 || ^3 || ^4 || ^5",
+ "symfony/phpunit-bridge": "^4.0 || ^5.0"
},
"type": "library",
"extra": {
"keywords": [
"parameters management"
],
- "time": "2018-02-13T18:05:56+00:00"
+ "time": "2020-03-17T21:10:00+00:00"
},
{
"name": "j0k3r/graby",
);
$title = 'Tag ' . $tag->getLabel();
+ } elseif ('search' === $category) {
+ $searchTerm = (isset($request->get('search_entry')['term']) ? $request->get('search_entry')['term'] : '');
+ $currentRoute = (null !== $request->query->get('currentRoute') ? $request->query->get('currentRoute') : '');
+
+ $entries = $repository->getBuilderForSearchByUser(
+ $this->getUser()->getId(),
+ $searchTerm,
+ $currentRoute
+ )->getQuery()
+ ->getResult();
+
+ $title = 'Search ' . $searchTerm;
} else {
$entries = $repository
->$methodBuilder($this->getUser()->getId())
{% if tag is defined %}
{% set currentTag = tag %}
{% endif %}
+ {% set exportSearchTerm = null %}
+ {% if searchTerm is defined %}
+ {% set exportSearchTerm = searchTerm %}
+ {% endif %}
+ {% set previousRoute = app.request.attributes.get('currentRoute') %}
<h2>{{ 'entry.list.export_title'|trans }}</h2>
<a href="javascript: void(null);" id="download-form-close" class="close-button--popup close-button">×</a>
<ul>
- {% if craue_setting('export_epub') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'epub', 'tag' : currentTag }) }}">EPUB</a></li>{% endif %}
- {% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag }) }}">MOBI</a></li>{% endif %}
- {% if craue_setting('export_pdf') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'pdf', 'tag' : currentTag }) }}">PDF</a></li>{% endif %}
- {% if craue_setting('export_json') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'json', 'tag' : currentTag }) }}">JSON</a></li>{% endif %}
- {% if craue_setting('export_csv') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'csv', 'tag' : currentTag }) }}">CSV</a></li>{% endif %}
- {% if craue_setting('export_txt') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'txt', 'tag' : currentTag }) }}">TXT</a></li>{% endif %}
- {% if craue_setting('export_xml') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'xml', 'tag' : currentTag }) }}">XML</a></li>{% endif %}
+ {% if craue_setting('export_epub') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'epub', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">EPUB</a></li>{% endif %}
+ {% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">MOBI</a></li>{% endif %}
+ {% if craue_setting('export_pdf') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'pdf', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">PDF</a></li>{% endif %}
+ {% if craue_setting('export_json') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'json', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">JSON</a></li>{% endif %}
+ {% if craue_setting('export_csv') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'csv', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">CSV</a></li>{% endif %}
+ {% if craue_setting('export_txt') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'txt', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">TXT</a></li>{% endif %}
+ {% if craue_setting('export_xml') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'xml', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">XML</a></li>{% endif %}
</ul>
</aside>
{% if tag is defined %}
{% set currentTag = tag.slug %}
{% endif %}
+ {% set exportSearchTerm = null %}
+ {% if searchTerm is defined %}
+ {% set exportSearchTerm = searchTerm %}
+ {% endif %}
+ {% set previousRoute = app.request.attributes.get('currentRoute') %}
<h4 class="center">{{ 'entry.list.export_title'|trans }}</h4>
<ul>
- {% if craue_setting('export_epub') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'epub', 'tag' : currentTag }) }}">EPUB</a></li>{% endif %}
- {% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag }) }}">MOBI</a></li>{% endif %}
- {% if craue_setting('export_pdf') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'pdf', 'tag' : currentTag }) }}">PDF</a></li>{% endif %}
- {% if craue_setting('export_json') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'json', 'tag' : currentTag }) }}">JSON</a></li>{% endif %}
- {% if craue_setting('export_csv') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'csv', 'tag' : currentTag }) }}">CSV</a></li>{% endif %}
- {% if craue_setting('export_txt') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'txt', 'tag' : currentTag }) }}">TXT</a></li>{% endif %}
- {% if craue_setting('export_xml') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'xml', 'tag' : currentTag }) }}">XML</a></li>{% endif %}
+ {% if craue_setting('export_epub') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'epub', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">EPUB</a></li>{% endif %}
+ {% if craue_setting('export_mobi') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'mobi', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">MOBI</a></li>{% endif %}
+ {% if craue_setting('export_pdf') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'pdf', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">PDF</a></li>{% endif %}
+ {% if craue_setting('export_json') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'json', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">JSON</a></li>{% endif %}
+ {% if craue_setting('export_csv') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'csv', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">CSV</a></li>{% endif %}
+ {% if craue_setting('export_txt') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'txt', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">TXT</a></li>{% endif %}
+ {% if craue_setting('export_xml') %}<li class="bold"><a class="waves-effect" href="{{ path('export_entries', { 'category': currentRoute, 'format': 'xml', 'tag' : currentTag, 'search_entry[term]' : exportSearchTerm, 'currentRoute' : previousRoute }) }}">XML</a></li>{% endif %}
</ul>
</div>
namespace Tests\Wallabag\CoreBundle\Controller;
use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
+use Wallabag\CoreBundle\Entity\Entry;
class ExportControllerTest extends WallabagCoreTestCase
{
+ private $adminEntry;
+ private $bobEntry;
+
public function testLogin()
{
$client = $this->getClient();
$this->assertContains('foo', $content[0]['tags']);
}
+ public function testJsonExportFromSearch()
+ {
+ $this->setUpForJsonExportFromSearch();
+
+ $this->logInAs('admin');
+ $client = $this->getClient();
+
+ ob_start();
+ $crawler = $client->request('GET', '/export/search.json?search_entry[term]=entry+search¤tRoute=homepage');
+ ob_end_clean();
+
+ $this->assertSame(200, $client->getResponse()->getStatusCode());
+
+ $headers = $client->getResponse()->headers;
+ $this->assertSame('application/json', $headers->get('content-type'));
+ $this->assertSame('attachment; filename="Search entry search articles.json"', $headers->get('content-disposition'));
+ $this->assertSame('UTF-8', $headers->get('content-transfer-encoding'));
+
+ $content = json_decode($client->getResponse()->getContent(), true);
+ $this->assertCount(1, $content);
+
+ $this->tearDownForJsonExportFromSearch();
+ }
+
public function testXmlExport()
{
$this->logInAs('admin');
$this->assertNotEmpty('updated_at', (string) $content->entry[0]->updated_at);
}
+ private function setUpForJsonExportFromSearch()
+ {
+ $client = $this->getClient();
+ $em = $this->getEntityManager();
+
+ $userRepository = $client->getContainer()
+ ->get('wallabag_user.user_repository.test');
+
+ $user = $userRepository->findOneByUserName('admin');
+ $this->adminEntry = new Entry($user);
+ $this->adminEntry->setUrl('http://0.0.0.0/entry-search-admin');
+ $this->adminEntry->setTitle('test title entry search admin');
+ $this->adminEntry->setContent('this is my content /o/');
+ $em->persist($this->adminEntry);
+
+ $user = $userRepository->findOneByUserName('bob');
+ $this->bobEntry = new Entry($user);
+ $this->bobEntry->setUrl('http://0.0.0.0/entry-search-bob');
+ $this->bobEntry->setTitle('test title entry search bob');
+ $this->bobEntry->setContent('this is my content /o/');
+ $em->persist($this->bobEntry);
+
+ $em->flush();
+ }
+
+ private function tearDownForJsonExportFromSearch()
+ {
+ $em = $this->getEntityManager();
+
+ $em->remove($this->adminEntry);
+ $em->remove($this->bobEntry);
+
+ $em->flush();
+ }
+
private function getSanitizedFilename($title)
{
return preg_replace('/[^A-Za-z0-9\- \']/', '', iconv('utf-8', 'us-ascii//TRANSLIT', $title));