RssCore   A
last analyzed

Complexity

Total Complexity 9

Size/Duplication

Total Lines 109
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 2
Bugs 0 Features 0
Metric Value
eloc 77
c 2
b 0
f 0
dl 0
loc 109
ccs 89
cts 89
cp 1
rs 10
wmc 9

5 Methods

Rating   Name   Duplication   Size   Complexity  
A configureItemOptions() 0 21 1
A getName() 0 2 1
A getNamespace() 0 2 1
A configureChannelOptions() 0 63 3
A shortenDescription() 0 10 3
1
<?php
2
declare(strict_types=1);
3
4
namespace Nexendrie\Rss\Extensions;
5
6
use Nette\Utils\Arrays;
7
use Nexendrie\Rss\CategoriesCollection;
8
use Nexendrie\Rss\Category;
9
use Nexendrie\Rss\Cloud;
10
use Nexendrie\Rss\EnclosuresCollection;
11
use Nexendrie\Rss\Generator;
12
use Nexendrie\Rss\GenericElement;
13
use Nexendrie\Rss\Image;
14
use Nexendrie\Rss\IRssExtension;
15
use Nexendrie\Rss\SkipDaysCollection;
16
use Nexendrie\Rss\SkipHoursCollection;
17
use Nexendrie\Rss\Source;
18
use Nexendrie\Rss\TextInput;
19
use Nexendrie\Utils\Numbers;
20
use Symfony\Component\OptionsResolver\Options;
21
use Symfony\Component\OptionsResolver\OptionsResolver;
22
23
/**
24
 * RssCore
25
 *
26
 * @author Jakub Konečný
27
 */
28 1
final class RssCore implements IRssExtension {
29
  use \Nette\SmartObject;
30
31
  public function getName(): string {
32 1
    return "";
33
  }
34
35
  public function getNamespace(): string {
36 1
    return "";
37
  }
38
39
  public function configureChannelOptions(OptionsResolver $resolver, Generator $generator): void {
40 1
    $resolver->setRequired(["title", "description", "link", "lastBuildDate", ]);
41 1
    $resolver->setAllowedTypes("title", "string");
42 1
    $resolver->setAllowedTypes("description", "string");
43 1
    $resolver->setAllowedTypes("link", "string");
44 1
    $resolver->setAllowedTypes("lastBuildDate", "callable");
45 1
    $resolver->setDefault("lastBuildDate", "time");
46 1
    $resolver->setNormalizer("lastBuildDate", function(Options $options, callable $value) use ($generator): GenericElement {
0 ignored issues
show
introduced by
Line exceeds 120 characters; contains 124 characters
Loading history...
47 1
      $value = call_user_func($value);
48 1
      if(!is_int($value)) {
49 1
        throw new \InvalidArgumentException("Callback for last build date for RSS generator has to return integer.");
50
      }
51 1
      $value = date($generator->dateTimeFormat, $value);
52 1
      return new GenericElement("lastBuildDate", $value);
53 1
    });
54 1
    $resolver->setDefined([
55 1
      "language", "copyright", "managingEditor", "webMaster", "ttl", "pubDate", "rating", "categories", "skipDays",
56
      "skipHours", "image", "cloud", "textInput",
57
    ]);
58 1
    $resolver->setAllowedTypes("language", "string");
59 1
    $resolver->setAllowedTypes("copyright", "string");
60 1
    $resolver->setAllowedTypes("managingEditor", "string");
61 1
    $resolver->setAllowedTypes("webMaster", "string");
62 1
    $resolver->setAllowedTypes("ttl", "int");
63 1
    $resolver->setAllowedValues("ttl", function(int $value): bool {
64 1
      return ($value >= 0);
65 1
    });
66 1
    $resolver->setAllowedTypes("pubDate", "callable");
67 1
    $resolver->setNormalizer("pubDate", function(Options $options, callable $value) use ($generator): GenericElement {
68 1
      $value = call_user_func($value);
69 1
      if(!is_int($value)) {
70 1
        throw new \InvalidArgumentException("Callback for pub date for RSS generator has to return integer.");
71
      }
72 1
      $value = date($generator->dateTimeFormat, $value);
73 1
      return new GenericElement("pubDate", $value);
74 1
    });
75 1
    $resolver->setAllowedTypes("rating", "string");
76 1
    $resolver->setAllowedTypes("categories", Category::class . "[]");
77 1
    $resolver->setNormalizer("categories", function(Options $options, array $value): CategoriesCollection {
78 1
      return CategoriesCollection::fromArray($value);
79 1
    });
80 1
    $resolver->setAllowedTypes("skipDays", "string[]");
81 1
    $resolver->setAllowedValues("skipDays", function(array $value): bool {
82 1
      $allowedValues = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ];
83 1
      return Arrays::every($value, function(string $value) use ($allowedValues): bool {
84 1
        return in_array($value, $allowedValues, true);
85 1
      });
86 1
    });
87 1
    $resolver->setNormalizer("skipDays", function(Options $options, array $value): SkipDaysCollection {
88 1
      return new SkipDaysCollection($value);
89 1
    });
90 1
    $resolver->setAllowedTypes("skipHours", "int[]");
91 1
    $resolver->setAllowedValues("skipHours", function(array $value): bool {
92 1
      return Arrays::every($value, function(int $value): bool {
93 1
        return Numbers::isInRange($value, 0, 23);
94 1
      });
95 1
    });
96 1
    $resolver->setNormalizer("skipHours", function(Options $options, array $value): SkipHoursCollection {
97 1
      return new SkipHoursCollection($value);
98 1
    });
99 1
    $resolver->setAllowedTypes("image", Image::class);
100 1
    $resolver->setAllowedTypes("cloud", Cloud::class);
101 1
    $resolver->setAllowedTypes("textInput", TextInput::class);
102 1
  }
103
104
  public function configureItemOptions(OptionsResolver $resolver, Generator $generator): void {
105 1
    $resolver->setRequired(["title", "description", "link", ]);
106 1
    $resolver->setAllowedTypes("title", "string");
107 1
    $resolver->setAllowedTypes("description", "string");
108 1
    $resolver->setNormalizer("description", function(Options $options, string $value) use ($generator): string {
109 1
      return $this->shortenDescription($value, $generator->shortenDescription);
110 1
    });
111 1
    $resolver->setAllowedTypes("link", "string");
112 1
    $resolver->setDefined([
113 1
      "pubDate", "author", "comments", "guid", "source", "categories", "enclosures",
114
    ]);
115 1
    $resolver->setAllowedTypes("pubDate", "int");
116 1
    $resolver->setNormalizer("pubDate", function(Options $options, int $value) use ($generator): string {
117 1
      return date($generator->dateTimeFormat, $value);
118 1
    });
119 1
    $resolver->setAllowedTypes("author", "string");
120 1
    $resolver->setAllowedTypes("comments", "string");
121 1
    $resolver->setAllowedTypes("guid", "string");
122 1
    $resolver->setAllowedTypes("source", Source::class);
123 1
    $resolver->setAllowedTypes("categories", CategoriesCollection::class);
124 1
    $resolver->setAllowedTypes("enclosures", EnclosuresCollection::class);
125 1
  }
126
127
  protected function shortenDescription(string $description, int $maxLength): string {
128 1
    if($maxLength < 1) {
129 1
      return $description;
130
    }
131 1
    $originalDescription = $description;
132 1
    $description = substr($description, 0, $maxLength);
133 1
    if($description !== $originalDescription) {
134 1
      $description .= "...";
135
    }
136 1
    return $description;
137
  }
138
}
139
?>