Completed
Push — master ( 092da6...b7a681 )
by Jakub
02:00
created

RssCore   A

Complexity

Total Complexity 9

Size/Duplication

Total Lines 107
Duplicated Lines 0 %

Test Coverage

Coverage 97.75%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 76
c 1
b 0
f 0
dl 0
loc 107
ccs 87
cts 89
cp 0.9775
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
 * @internal
28
 */
29 1
final class RssCore implements IRssExtension {
30
  public function getName(): string {
31
    return "";
32
  }
33
34
  public function getNamespace(): string {
35
    return "";
36
  }
37
38
  public function configureChannelOptions(OptionsResolver $resolver, Generator $generator): void {
39 1
    $resolver->setRequired(["title", "description", "link", "lastBuildDate", ]);
40 1
    $resolver->setAllowedTypes("title", "string");
41 1
    $resolver->setAllowedTypes("description", "string");
42 1
    $resolver->setAllowedTypes("link", "string");
43 1
    $resolver->setAllowedTypes("lastBuildDate", "callable");
44 1
    $resolver->setDefault("lastBuildDate", "time");
45 1
    $resolver->setNormalizer("lastBuildDate", function(Options $options, callable $value) use($generator) {
1 ignored issue
show
introduced by
The method parameter $options is never used
Loading history...
46 1
      $value = call_user_func($value);
47 1
      if(!is_int($value)) {
48 1
        throw new \InvalidArgumentException("Callback for last build date for RSS generator has to return integer.");
49
      }
50 1
      $value = date($generator->dateTimeFormat, $value);
51 1
      return new GenericElement("lastBuildDate", $value);
52 1
    });
53 1
    $resolver->setDefined([
54 1
      "language", "copyright", "managingEditor", "webMaster", "ttl",  "pubDate", "rating", "categories", "skipDays",
55
      "skipHours", "image", "cloud", "textInput",
56
    ]);
57 1
    $resolver->setAllowedTypes("language", "string");
58 1
    $resolver->setAllowedTypes("copyright", "string");
59 1
    $resolver->setAllowedTypes("managingEditor", "string");
60 1
    $resolver->setAllowedTypes("webMaster", "string");
61 1
    $resolver->setAllowedTypes("ttl", "int");
62 1
    $resolver->setAllowedValues("ttl", function(int $value) {
63 1
      return ($value >= 0);
64 1
    });
65 1
    $resolver->setAllowedTypes("pubDate", "callable");
66 1
    $resolver->setNormalizer("pubDate", function(Options $options, callable $value) use($generator) {
1 ignored issue
show
introduced by
The method parameter $options is never used
Loading history...
67 1
      $value = call_user_func($value);
68 1
      if(!is_int($value)) {
69 1
        throw new \InvalidArgumentException("Callback for pub date for RSS generator has to return integer.");
70
      }
71 1
      $value = date($generator->dateTimeFormat, $value);
72 1
      return new GenericElement("pubDate", $value);
73 1
    });
74 1
    $resolver->setAllowedTypes("rating", "string");
75 1
    $resolver->setAllowedTypes("categories", Category::class . "[]");
76 1
    $resolver->setNormalizer("categories", function(Options $options, array $value) {
1 ignored issue
show
introduced by
The method parameter $options is never used
Loading history...
77 1
      return CategoriesCollection::fromArray($value);
78 1
    });
79 1
    $resolver->setAllowedTypes("skipDays", "string[]");
80 1
    $resolver->setAllowedValues("skipDays", function(array $value) {
81 1
      $allowedValues = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday", ];
82 1
      return Arrays::every($value, function(string $value) use($allowedValues) {
83 1
        return in_array($value, $allowedValues, true);
84 1
      });
85 1
    });
86 1
    $resolver->setNormalizer("skipDays", function(Options $options, array $value) {
1 ignored issue
show
introduced by
The method parameter $options is never used
Loading history...
87 1
      return new SkipDaysCollection($value);
88 1
    });
89 1
    $resolver->setAllowedTypes("skipHours", "int[]");
90 1
    $resolver->setAllowedValues("skipHours", function(array $value) {
91 1
      return Arrays::every($value, function(int $value) {
92 1
        return Numbers::isInRange($value, 0, 23);
93 1
      });
94 1
    });
95 1
    $resolver->setNormalizer("skipHours", function(Options $options, array $value) {
1 ignored issue
show
introduced by
The method parameter $options is never used
Loading history...
96 1
      return new SkipHoursCollection($value);
97 1
    });
98 1
    $resolver->setAllowedTypes("image", Image::class);
99 1
    $resolver->setAllowedTypes("cloud", Cloud::class);
100 1
    $resolver->setAllowedTypes("textInput", TextInput::class);
101 1
  }
102
103
  public function configureItemOptions(OptionsResolver $resolver, Generator $generator): void {
104 1
    $resolver->setRequired(["title", "description", "link", ]);
105 1
    $resolver->setAllowedTypes("title", "string");
106 1
    $resolver->setAllowedTypes("description", "string");
107 1
    $resolver->setNormalizer("description", function(Options $options, string $value) use($generator) {
1 ignored issue
show
introduced by
The method parameter $options is never used
Loading history...
108 1
      return $this->shortenDescription($value, $generator->shortenDescription);
109 1
    });
110 1
    $resolver->setAllowedTypes("link", "string");
111 1
    $resolver->setDefined([
112 1
      "pubDate", "author", "comments", "guid", "source", "categories", "enclosures",
113
    ]);
114 1
    $resolver->setAllowedTypes("pubDate", "int");
115 1
    $resolver->setNormalizer("pubDate", function(Options $options, int $value) use($generator) {
1 ignored issue
show
introduced by
The method parameter $options is never used
Loading history...
116 1
      return date($generator->dateTimeFormat, $value);
117 1
    });
118 1
    $resolver->setAllowedTypes("author", "string");
119 1
    $resolver->setAllowedTypes("comments", "string");
120 1
    $resolver->setAllowedTypes("guid", "string");
121 1
    $resolver->setAllowedTypes("source", Source::class);
122 1
    $resolver->setAllowedTypes("categories", CategoriesCollection::class);
123 1
    $resolver->setAllowedTypes("enclosures", EnclosuresCollection::class);
124 1
  }
125
126
  protected function shortenDescription(string $description, int $maxLength): string {
127 1
    if($maxLength < 1) {
128 1
      return $description;
129
    }
130 1
    $originalDescription = $description;
131 1
    $description = substr($description, 0, $maxLength);
132 1
    if($description !== $originalDescription) {
133 1
      $description .= "...";
134
    }
135 1
    return $description;
136
  }
137
}
138
?>