1010abstract class CacheState
1111{
1212 public const TYPE = 'type ' ;
13+ public const DATA = 'data ' ;
1314
1415 public const ORIGINAL_FILE_PATH_KEY = 'originalFilePath ' ;
16+ public const NAMESPACED_CLASS_KEY = 'namespacedClass ' ;
1517 public const MODIFICATION_TIME_KEY = 'modificationTime ' ;
1618
1719 public string $ originalFilePath ;
18- public int $ modificationTime ;
20+ protected string $ namespacedClass ;
21+ protected int $ modificationTime ;
1922
2023 /**
2124 * CacheState constructor.
@@ -80,18 +83,39 @@ public function getRequiredKeys(): array
8083 {
8184 return [
8285 static ::ORIGINAL_FILE_PATH_KEY ,
86+ static ::NAMESPACED_CLASS_KEY ,
8387 static ::MODIFICATION_TIME_KEY ,
8488 ];
8589 }
8690
91+ /**
92+ * Create a cache state if it is valid.
93+ *
94+ * @param array $cacheStateArray
95+ *
96+ * @return self|null
97+ */
98+ public function createIfValid (array $ cacheStateArray ): ?CacheState
99+ {
100+ if (!$ this ->valid ($ cacheStateArray )) {
101+ // @codeCoverageIgnoreStart
102+ return null ;
103+ // @codeCoverageIgnoreEnd
104+ }
105+
106+ $ this ->setData ($ cacheStateArray );
107+
108+ return $ this ;
109+ }
110+
87111 /**
88112 * Validate the cache state.
89113 *
90114 * @param array<string, (string|int|string[])> $cacheStateArray
91115 *
92116 * @return bool
93117 */
94- public function valid (array $ cacheStateArray ): bool
118+ private function valid (array $ cacheStateArray ): bool
95119 {
96120 // Check if all required keys are present
97121 foreach ($ this ->getRequiredKeys () as $ requiredKey ) {
@@ -110,7 +134,7 @@ public function valid(array $cacheStateArray): bool
110134 *
111135 * @param array<string, (string|int|string[])> $cacheStateArray
112136 */
113- public function setData (array $ cacheStateArray ): void
137+ private function setData (array $ cacheStateArray ): void
114138 {
115139 foreach ($ cacheStateArray as $ key => $ value ) {
116140 $ this ->{$ key } = $ value ;
@@ -124,6 +148,12 @@ public function setData(array $cacheStateArray): void
124148 */
125149 public function isFresh (): bool
126150 {
151+ if (!file_exists ($ this ->originalFilePath )) {
152+ // @codeCoverageIgnoreStart
153+ return false ;
154+ // @codeCoverageIgnoreEnd
155+ }
156+
127157 if (filemtime ($ this ->originalFilePath ) > $ this ->modificationTime ) {
128158 return false ;
129159 }
@@ -137,161 +167,4 @@ public function isFresh(): bool
137167 * @return string|null
138168 */
139169 abstract public function getFilePath (): ?string ;
140-
141- // /**
142- // * CacheState constructor.
143- // *
144- // * @param string $originalFilePath
145- // * @param string $className
146- // * @param string|null $cachedFilePath
147- // * @param int|null $transformedTime
148- // * @param string[]|null $transformerFilePaths
149- // */
150- // public function __construct(
151- // public string $originalFilePath,
152- // public string $className,
153- // public ?string $cachedFilePath,
154- // public ?int $transformedTime,
155- // public ?array $transformerFilePaths,
156- // ) {}
157- //
158- // /**
159- // * Use the cached file path if aspects have been applied.
160- // * Otherwise, use the original file path if no aspects have been applied.
161- // *
162- // * @return string
163- // */
164- // public function getFilePath(): string
165- // {
166- // return $this->cachedFilePath ?? $this->originalFilePath;
167- // }
168- //
169- //
170- //
171- //
172- // /**
173- // * Get the cache state as an array.
174- // *
175- // * @return array
176- // */
177- // public function toArray(): array
178- // {
179- // return [
180- // $this->originalFilePath,
181- // $this->className,
182- // $this->cachedFilePath,
183- // $this->transformedTime,
184- // $this->transformerFilePaths,
185- // ];
186- // }
187- //
188- // /**
189- // * Check if the cache is not outdated.
190- // *
191- // * @return bool
192- // */
193- // public function isFresh(): bool
194- // {
195- // // @codeCoverageIgnoreStart
196- // // This should only happen if the project is misconfigured
197- // if ($this->checkInfiniteLoop()) {
198- // return false;
199- // }
200- // // @codeCoverageIgnoreEnd
201- //
202- // $allFiles = array_merge(
203- // [$this->originalFilePath],
204- // $this->transformerFilePaths,
205- // );
206- //
207- // if ($this->checkFilesModified($allFiles)) {
208- // return false;
209- // }
210- //
211- // if ($this->cachedFilePath) {
212- // $allFiles[] = $this->cachedFilePath;
213- // }
214- //
215- // if (!$this->checkFilesExist($allFiles)) {
216- // return false;
217- // }
218- //
219- // if (!$this->checkTransformerCount()) {
220- // return false;
221- // }
222- //
223- // return true;
224- // }
225- //
226- // /**
227- // * Check if the cache is in an infinite loop.
228- // *
229- // * @return bool True if the cache is in an infinite loop
230- // */
231- // protected function checkInfiniteLoop(): bool
232- // {
233- // if ($this->cachedFilePath !== null) {
234- // // Same original file and cached file
235- // if ($this->originalFilePath === $this->cachedFilePath) {
236- // return true;
237- // }
238- // }
239- //
240- // return false;
241- // }
242- //
243- // /**
244- // * Check if the files have been modified.
245- // *
246- // * @param string[] $files
247- // *
248- // * @return bool True if any file has been modified
249- // */
250- // protected function checkFilesModified(array $files): bool
251- // {
252- // $lastModified = max(array_map('filemtime', $files));
253- // if ($lastModified >= $this->transformedTime) {
254- // return true;
255- // }
256- //
257- // return false;
258- // }
259- //
260- // /**
261- // * Check if the files exist.
262- // *
263- // * @param string[] $files
264- // *
265- // * @return bool True if all files exist
266- // */
267- // protected function checkFilesExist(array $files): bool
268- // {
269- // // Check if the cache file exists
270- // foreach ($files as $file) {
271- // if (!file_exists($file)) {
272- // return false;
273- // }
274- // }
275- //
276- // return true;
277- // }
278- //
279- // /**
280- // * Check if the transformer count is the same.
281- // *
282- // * @return bool True if the count is the same
283- // */
284- // protected function checkTransformerCount(): bool
285- // {
286- // // Checking the count alone should be enough
287- // $cachedTransformerCount = count($this->transformerFilePaths);
288- // $currentTransformerCount = count(
289- // $this->transformerMatcher->match($this->className),
290- // );
291- // if ($cachedTransformerCount !== $currentTransformerCount) {
292- // return false;
293- // }
294- //
295- // return true;
296- // }
297170}
0 commit comments