Completed
Pull Request — master (#18)
by
unknown
08:06
created

Consumer   A

Complexity

Total Complexity 17

Size/Duplication

Total Lines 134
Duplicated Lines 13.43 %

Coupling/Cohesion

Components 1
Dependencies 6

Test Coverage

Coverage 94.74%

Importance

Changes 0
Metric Value
wmc 17
lcom 1
cbo 6
dl 18
loc 134
ccs 54
cts 57
cp 0.9474
rs 10
c 0
b 0
f 0

4 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 6 1
A loadUrl() 0 7 1
A loadHtml() 0 13 3
C extractOpenGraphData() 18 65 12

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
namespace Fusonic\OpenGraph;
4
5
use Fusonic\Linq\Linq;
6
use Fusonic\OpenGraph\Objects\ObjectBase;
7
use Fusonic\OpenGraph\Objects\Website;
8
use GuzzleHttp\Adapter\AdapterInterface;
9
use GuzzleHttp\Client;
10
use Symfony\Component\DomCrawler\Crawler;
11
12
/**
13
 * Consumer that extracts Open Graph data from either a URL or a HTML string.
14
 */
15
class Consumer
16
{
17
    private $client;
18
19
    /**
20
     * When enabled, crawler will read content of title and meta description if no
21
     * Open Graph data is provided by target page.
22
     *
23
     * @var bool
24
     */
25
    public $useFallbackMode = false;
26
27
    /**
28
     * When enabled, crawler will throw exceptions for some crawling errors like unexpected
29
     * Open Graph elements.
30
     *
31
     * @var bool
32
     */
33
    public $debug = false;
34
35
    /**
36
     * @param   AdapterInterface $adapter Guzzle adapter to use for making HTTP requests.
37
     * @param   array            $config  Optional Guzzle config overrides.
38
     */
39 16
    public function __construct(AdapterInterface $adapter = null, array $config = [])
40
    {
41 16
        $config = array_replace_recursive(['adapter' => $adapter], $config);
42
43 16
        $this->client = new Client($config);
44 16
    }
45
46
    /**
47
     * Fetches HTML content from the given URL and then crawls it for Open Graph data.
48
     *
49
     * @param   string  $url            URL to be crawled.
50
     *
51
     * @return  Website
52
     */
53
    public function loadUrl($url)
54
    {
55
        // Fetch HTTP content using Guzzle
56
        $response = $this->client->get($url);
57
58
        return $this->loadHtml($response->getBody()->__toString(), $url);
59
    }
60
61
    /**
62
     * Crawls the given HTML string for OpenGraph data.
63
     *
64
     * @param   string  $html           HTML string, usually whole content of crawled web resource.
65
     * @param   string  $fallbackUrl    URL to use when fallback mode is enabled.
66
     *
67
     * @return  ObjectBase
68
     */
69 16
    public function loadHtml($html, $fallbackUrl = null)
70
    {
71
        // Extract all data that can be found
72 16
        $page = $this->extractOpenGraphData($html);
73
74
        // Use the user's URL as fallback
75 13
        if ($this->useFallbackMode && $page->url === null) {
76 1
            $page->url = $fallbackUrl;
77 1
        }
78
79
        // Return result
80 13
        return $page;
81
    }
82
83 16
    private function extractOpenGraphData($content)
84
    {
85 16
        $crawler = new Crawler($content);
86
87 16
        $properties = [];
88 16
        foreach(['name', 'property'] as $t)
0 ignored issues
show
Coding Style introduced by
Expected 1 space after FOREACH keyword; 0 found
Loading history...
89
        {
90
            // Get all meta-tags starting with "og:"
91 16
            $ogMetaTags = $crawler->filter("meta[{$t}^='og:']");
92
            // Create clean property array
93 16
            $props = Linq::from($ogMetaTags)
94 16
                ->select(
95
                    function (\DOMElement $tag) use ($t) {
96 13
                        $name = strtolower(trim($tag->getAttribute($t)));
97 13
                        $value = trim($tag->getAttribute("content"));
98 13
                        return new Property($name, $value);
99
                    }
100 16
                )
101 16
                ->toArray();
102 16
            $properties = array_merge($properties, $props);
103
          
0 ignored issues
show
Coding Style introduced by
Blank line found at end of control structure
Loading history...
104 16
        }
105
            
106
        // Create new object of the correct type
107 16
        $typeProperty = Linq::from($properties)
108 16
            ->firstOrNull(
109 13
                function (Property $property) {
110 13
                    return $property->key === Property::TYPE;
111
                }
112 16
            );
113 16
        switch ($typeProperty !== null ? $typeProperty->value : null) {
114 16
            default:
0 ignored issues
show
Unused Code introduced by
default: $object = n...s\Website(); break; does not seem to be reachable.

This check looks for unreachable code. It uses sophisticated control flow analysis techniques to find statements which will never be executed.

Unreachable code is most often the result of return, die or exit statements that have been added for debug purposes.

function fx() {
    try {
        doSomething();
        return true;
    }
    catch (\Exception $e) {
        return false;
    }

    return false;
}

In the above example, the last return false will never be executed, because a return statement has already been met in every possible execution path.

Loading history...
115 16
                $object = new Website();
116 16
                break;
117 16
        }
118
119
        // Assign all properties to the object
120 16
        $object->assignProperties($properties, $this->debug);
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
121
122
        // Fallback for url
123 13 View Code Duplication
        if ($this->useFallbackMode && !$object->url) {
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
124 2
            $urlElement = $crawler->filter("link[rel='canonical']")->first();
125 2
            if ($urlElement->count()) {
126 1
                $object->url = trim($urlElement->attr("href"));
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
127 1
            }
128 2
        }
129
130
        // Fallback for title
131 13 View Code Duplication
        if ($this->useFallbackMode && !$object->title) {
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
132 2
            $titleElement = $crawler->filter("title")->first();
133 2
            if ($titleElement) {
134 2
                $object->title = trim($titleElement->text());
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
135 2
            }
136 2
        }
137
138
        // Fallback for description
139 13 View Code Duplication
        if ($this->useFallbackMode && !$object->description) {
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
Duplication introduced by
This code seems to be duplicated across your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
140 2
            $descriptionElement = $crawler->filter("meta[property='description']")->first();
141 2
            if ($descriptionElement) {
142 2
                $object->description = trim($descriptionElement->attr("content"));
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
143 2
            }
144 2
        }
145
146 13
        return $object;
0 ignored issues
show
Bug introduced by
The variable $object seems only to be defined at a later point. Did you maybe move this code here without moving the variable definition?

This error can happen if you refactor code and forget to move the variable initialization.

Let’s take a look at a simple example:

function someFunction() {
    $x = 5;
    echo $x;
}

The above code is perfectly fine. Now imagine that we re-order the statements:

function someFunction() {
    echo $x;
    $x = 5;
}

In that case, $x would be read before it is initialized. This was a very basic example, however the principle is the same for the found issue.

Loading history...
147
    }
148
}
149