{"id":2038,"date":"2017-05-09T18:17:09","date_gmt":"2017-05-09T17:17:09","guid":{"rendered":"https:\/\/www.entropywins.wtf\/blog\/?p=2038"},"modified":"2019-04-27T03:58:24","modified_gmt":"2019-04-27T02:58:24","slug":"oop-file_get_contents","status":"publish","type":"post","link":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/","title":{"rendered":"OOP file_get_contents"},"content":{"rendered":"<p>I&#8217;m happy to announce the immediate availability of <a href=\"https:\/\/github.com\/JeroenDeDauw\/FileFetcher\">FileFetcher<\/a> 4.0.0.<\/p>\n<p>FileFetcher is a small PHP library that provides an OO way to retrieve the contents of files.<\/p>\n<p><strong>What&#8217;s OO about such an interface?<\/strong> You can inject an implementation of it into a class, thus avoiding that the class knows about the details of the implementation, and being able to choose which implementation you provide. Calling <code>file_get_contents<\/code> does not allow changing implementation as it is a procedural\/static call making use of global state.<\/p>\n<p><strong>Library number 8234803417 that does this exact thing? <\/strong>Probably not. The philosophy behind this library is to provide a very basic interface (<a href=\"https:\/\/github.com\/JeroenDeDauw\/FileFetcher\/blob\/master\/src\/FileFetcher.php\"><code>FileFetcher<\/code><\/a>) that while insufficient for plenty of use cases, is ideal for a great many, in particular replacing procedural <code>file_get_contents<\/code> calls. The provided implementations are to facilitate testing and common generic tasks around the actual file fetching. You are encouraged to create your own core file fetching implementation in your codebase, presumably an adapter to a library that focuses on this task such as <a href=\"http:\/\/docs.guzzlephp.org\/en\/latest\/\">Guzzle<\/a>.<\/p>\n<p><strong>So what is in it then?<\/strong> The library provides several trivial implementations of the <code>FileFetcher<\/code> interface at its heart:<\/p>\n<ul>\n<li><code>SimpleFileFetcher<\/code>: <a href=\"https:\/\/en.wikipedia.org\/wiki\/Adapter_pattern\">Adapter<\/a> around <code>file_get_contents<\/code><\/li>\n<li><code>InMemoryFileFetcher<\/code>: Adapter around an array provided to its constructor<\/li>\n<li><code>ThrowingFileFetcher<\/code>: Throws a <code>FileFetchingException<\/code> for all calls (added after 4.0)<\/li>\n<li><code>NullFileFetcher<\/code>: Returns an empty string for all calls (added after 4.0)<\/li>\n<li><code>StubFileFetcher<\/code>: Returns a stub value for all calls (added after 4.0)<\/li>\n<\/ul>\n<p>It also provides a number of generic <a href=\"https:\/\/en.wikipedia.org\/wiki\/Decorator_pattern\">decorators<\/a>:<\/p>\n<ul>\n<li><code>ErrorLoggingFileFetcher<\/code>: Logs errors via the <a href=\"http:\/\/www.php-fig.org\/psr\/psr-3\/\">PSR-3 LoggerInterface<\/a><\/li>\n<li><code>CachingFileFetcher<\/code>: Adds caching capabilities using the <a href=\"https:\/\/github.com\/JeroenDeDauw\/SimpleCache\">SimpleCache library<\/a><\/li>\n<li><code>SpyingFileFetcher<\/code>: A <a href=\"https:\/\/www.entropywins.wtf\/blog\/2016\/05\/13\/5-ways-to-write-better-mocks\/\">spy (test double)<\/a><\/li>\n<\/ul>\n<p><strong>Version 4.0.0 brings PHP7 features<\/strong> (scalar type hints \\o\/) and adds a few extra handy implementations. You can add the library to your composer.json (<code>&lt;a href=\"https:\/\/packagist.org\/packages\/jeroen\/file-fetcher\"&gt;jeroen\/file-fetcher&lt;\/a&gt;<\/code>) or look at the <a href=\"https:\/\/github.com\/JeroenDeDauw\/FileFetcher\">documentation on GitHub<\/a>. You can also read about <a href=\"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/\">its inception in 2013<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m happy to announce the immediate availability of FileFetcher 4.0.0. FileFetcher is a small PHP library that provides an OO&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2}},"categories":[8],"tags":[328,450,149,179,181,195,197,257],"class_list":["post-2038","post","type-post","status-publish","format-standard","hentry","category-software","tag-clean-code","tag-filefetcher","tag-library","tag-oop","tag-open-source","tag-php","tag-planet-wikimedia","tag-testing"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.0 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>OOP file_get_contents - Blog of Jeroen De Dauw<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"OOP file_get_contents - Blog of Jeroen De Dauw\" \/>\n<meta property=\"og:description\" content=\"I&#8217;m happy to announce the immediate availability of FileFetcher 4.0.0. FileFetcher is a small PHP library that provides an OO&hellip;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog of Jeroen De Dauw\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-09T17:17:09+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2019-04-27T02:58:24+00:00\" \/>\n<meta name=\"author\" content=\"Jeroen\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@https:\/\/twitter.com\/JeroenDeDauw\" \/>\n<meta name=\"twitter:site\" content=\"@JeroenDeDauw\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jeroen\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/\"},\"author\":{\"name\":\"Jeroen\",\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"headline\":\"OOP file_get_contents\",\"datePublished\":\"2017-05-09T17:17:09+00:00\",\"dateModified\":\"2019-04-27T02:58:24+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/\"},\"wordCount\":288,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"keywords\":[\"Clean Code\",\"FileFetcher\",\"Library\",\"OOP\",\"Open Source\",\"PHP\",\"Planet Wikimedia\",\"Testing\"],\"articleSection\":[\"Software\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/\",\"url\":\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/\",\"name\":\"OOP file_get_contents - Blog of Jeroen De Dauw\",\"isPartOf\":{\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#website\"},\"datePublished\":\"2017-05-09T17:17:09+00:00\",\"dateModified\":\"2019-04-27T02:58:24+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.entropywins.wtf\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"OOP file_get_contents\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#website\",\"url\":\"https:\/\/www.entropywins.wtf\/blog\/\",\"name\":\"Entropy Wins\",\"description\":\"A blog on Software Architecture, Design and Craftsmanship\",\"publisher\":{\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.entropywins.wtf\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7\",\"name\":\"Jeroen\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g\",\"caption\":\"Jeroen\"},\"logo\":{\"@id\":\"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/image\/\"},\"sameAs\":[\"https:\/\/www.linkedin.com\/in\/jeroendedauw\/\",\"https:\/\/x.com\/https:\/\/twitter.com\/JeroenDeDauw\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"OOP file_get_contents - Blog of Jeroen De Dauw","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/","og_locale":"en_US","og_type":"article","og_title":"OOP file_get_contents - Blog of Jeroen De Dauw","og_description":"I&#8217;m happy to announce the immediate availability of FileFetcher 4.0.0. FileFetcher is a small PHP library that provides an OO&hellip;","og_url":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/","og_site_name":"Blog of Jeroen De Dauw","article_published_time":"2017-05-09T17:17:09+00:00","article_modified_time":"2019-04-27T02:58:24+00:00","author":"Jeroen","twitter_card":"summary_large_image","twitter_creator":"@https:\/\/twitter.com\/JeroenDeDauw","twitter_site":"@JeroenDeDauw","twitter_misc":{"Written by":"Jeroen","Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#article","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/"},"author":{"name":"Jeroen","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"headline":"OOP file_get_contents","datePublished":"2017-05-09T17:17:09+00:00","dateModified":"2019-04-27T02:58:24+00:00","mainEntityOfPage":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/"},"wordCount":288,"commentCount":1,"publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"keywords":["Clean Code","FileFetcher","Library","OOP","Open Source","PHP","Planet Wikimedia","Testing"],"articleSection":["Software"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/","url":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/","name":"OOP file_get_contents - Blog of Jeroen De Dauw","isPartOf":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#website"},"datePublished":"2017-05-09T17:17:09+00:00","dateModified":"2019-04-27T02:58:24+00:00","breadcrumb":{"@id":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.entropywins.wtf\/blog\/2017\/05\/09\/oop-file_get_contents\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.entropywins.wtf\/blog\/"},{"@type":"ListItem","position":2,"name":"OOP file_get_contents"}]},{"@type":"WebSite","@id":"https:\/\/www.entropywins.wtf\/blog\/#website","url":"https:\/\/www.entropywins.wtf\/blog\/","name":"Entropy Wins","description":"A blog on Software Architecture, Design and Craftsmanship","publisher":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.entropywins.wtf\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/4e2ef14f2ca7dc3a0ac137d1692b66b7","name":"Jeroen","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/d62e6b5b8e332335cf17854fac850d9c70ba367c4692872613c3110ebd4e009b?s=96&d=mm&r=g","caption":"Jeroen"},"logo":{"@id":"https:\/\/www.entropywins.wtf\/blog\/#\/schema\/person\/image\/"},"sameAs":["https:\/\/www.linkedin.com\/in\/jeroendedauw\/","https:\/\/x.com\/https:\/\/twitter.com\/JeroenDeDauw"]}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p74TBF-wS","jetpack-related-posts":[{"id":1127,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/14\/parserhooks-declarative-oop-api-for-mediawiki-released\/","url_meta":{"origin":2038,"position":0},"title":"ParserHooks declarative OOP API for MediaWiki released","author":"Jeroen","date":"2013-07-14","format":false,"excerpt":"Yes, there now is a nice OOP API that allows you to create MediaWiki parser hooks in declarative fashion! A few years back, I was sitting in c-base after the 27th Chaos Communication Congress had ended. I decided to quickly hack up a decent SubPageList extension for MediaWiki on top\u2026","rel":"","context":"With 1 comment","block_context":{"text":"With 1 comment","link":"https:\/\/www.entropywins.wtf\/blog\/2013\/07\/14\/parserhooks-declarative-oop-api-for-mediawiki-released\/#comments"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1147,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/11\/17\/ask-1-0-released\/","url_meta":{"origin":2038,"position":1},"title":"Ask 1.0 released!","author":"Jeroen","date":"2013-11-17","format":false,"excerpt":"I\u2019m very happy to announce the first release of the Ask library. The Ask library is a fresh PHP implementation of the Ask query language. This is the query language used by Semantic MediaWiki. At the Wikidata project we aim to provide similar query functionality in our Wikibase software, and\u2026","rel":"","context":"With 3 comments","block_context":{"text":"With 3 comments","link":"https:\/\/www.entropywins.wtf\/blog\/2013\/11\/17\/ask-1-0-released\/#comments"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":622,"url":"https:\/\/www.entropywins.wtf\/blog\/2009\/12\/21\/net-download-library-the-first-results\/","url_meta":{"origin":2038,"position":2},"title":".Net Download Library: the first results","author":"Jeroen","date":"2009-12-21","format":false,"excerpt":"Over the last few days, I've done some work on .Net download library, the successor to my FileDownloader class. I started working on this project about half a year ago, and had quite some difficulties picking up the thread again after GSoC 2009, since I was in the middle of\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1488,"url":"https:\/\/www.entropywins.wtf\/blog\/2015\/11\/14\/entitystore-and-termstore-for-wikibasewikidata\/","url_meta":{"origin":2038,"position":3},"title":"EntityStore and TermStore for Wikibase\/Wikidata","author":"Jeroen","date":"2015-11-14","format":false,"excerpt":"I'm happy to announce the public release of two new PHP libraries that provide services around Wikibase, the software behind Wikidata. They are called QueryR EntityStore and QueryR TermStore. Both these libraries provide persistence and lookup services for specific Wikibase data. These services are build on top of Doctrine DBAL,\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1117,"url":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/","url_meta":{"origin":2038,"position":4},"title":"GitHub extension for MediaWiki and SimpleCache PHP library","author":"Jeroen","date":"2013-06-29","format":false,"excerpt":"Background A few months back I got annoyed at having to maintain some documentation both in README files and on-wiki. I figured I\u2019d be a lot nicer if I could just embed those README files in the wiki and have their contents rendered. I therefore created the GitWeb MediaWiki extension,\u2026","rel":"","context":"With 1 comment","block_context":{"text":"With 1 comment","link":"https:\/\/www.entropywins.wtf\/blog\/2013\/06\/29\/github-extension-for-mediawiki-and-simplecache-php-library\/#comments"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":662,"url":"https:\/\/www.entropywins.wtf\/blog\/2010\/01\/19\/galib-available-now\/","url_meta":{"origin":2038,"position":5},"title":"GALib available now!","author":"Jeroen","date":"2010-01-19","format":false,"excerpt":"Over the past 2 weeks I've been putting time in creating a general purpose Genetic Algorithm (GA) library in C#. It provides the scaffolding for any GA based functionality. Although it's not fully finished yet, it is now available under the GPL licence at SourceForge. What does it provide and\u2026","rel":"","context":"In &quot;Programming&quot;","block_context":{"text":"Programming","link":"https:\/\/www.entropywins.wtf\/blog\/category\/programming\/"},"img":{"alt_text":"Class diagram of GALib by Jeroen De Dauw","src":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/01\/GALib-cd.gif?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/01\/GALib-cd.gif?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/www.entropywins.wtf\/blog\/wp-content\/uploads\/2010\/01\/GALib-cd.gif?resize=525%2C300&ssl=1 1.5x"},"classes":[]}],"jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2038","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/comments?post=2038"}],"version-history":[{"count":7,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2038\/revisions"}],"predecessor-version":[{"id":2193,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/posts\/2038\/revisions\/2193"}],"wp:attachment":[{"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/media?parent=2038"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/categories?post=2038"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.entropywins.wtf\/blog\/wp-json\/wp\/v2\/tags?post=2038"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}