Timber - Version 1.5.0

Version Description

Fixes and improvements - home_url value is now cached, performance win for polylang! #1507 (thanks @oxyc) - Post::$css_class is only fetched if requested #1522 (thanks @ruscon) - Improved flexibility of PostCollection to be filterable #1544 (thanks @gchtr) - More test coverage

Changes for Theme Developers - None! But the above fixes have significant changes in the code which necessitated the ".x" version jump

Download this release

Release Info

Developer jarednova
Plugin Icon 128x128 Timber
Version 1.5.0
Comparing to
See all releases

Code changes from version 1.4.1 to 1.5.0

lib/ImageHelper.php CHANGED
@@ -28,9 +28,13 @@ class ImageHelper {
28
  const BASE_UPLOADS = 1;
29
  const BASE_CONTENT = 2;
30
 
 
 
31
  public static function init() {
32
- self::add_actions();
33
- self::add_filters();
 
 
34
  return true;
35
  }
36
 
@@ -165,34 +169,44 @@ class ImageHelper {
165
  return self::_operate($src, $op, $force);
166
  }
167
 
 
 
168
  /**
169
- * Deletes all resized versions of an image when the source is deleted
170
- * or its meta data is regenerated
 
 
171
  */
172
- protected static function add_actions() {
173
- add_action('delete_attachment', function( $post_id ) {
174
- \Timber\ImageHelper::_delete_generated_if_image($post_id);
175
- } );
176
- add_filter('wp_generate_attachment_metadata', function( $metadata, $post_id ) {
177
- \Timber\ImageHelper::_delete_generated_if_image($post_id);
178
- return $metadata;
179
- }, 10, 2);
180
  }
181
 
 
182
  /**
183
- * adds a 'relative' key to wp_upload_dir() result.
184
- * It will contain the relative url to upload dir.
185
- * @return void
 
 
 
186
  */
187
- static function add_filters() {
188
- add_filter('upload_dir', function( $arr ) {
189
- $arr['relative'] = str_replace(get_home_url(), '', $arr['baseurl']);
190
- return $arr;
191
- } );
192
  }
193
 
194
- //-- end of public methods --//
195
-
 
 
 
 
 
 
 
 
 
 
196
 
197
  /**
198
  * Checks if attachment is an image before deleting generated files
28
  const BASE_UPLOADS = 1;
29
  const BASE_CONTENT = 2;
30
 
31
+ static $home_url;
32
+
33
  public static function init() {
34
+ self::$home_url = get_home_url();
35
+ add_action('delete_attachment', array(__CLASS__, 'delete_attachment'));
36
+ add_filter('wp_generate_attachment_metadata', array(__CLASS__, 'generate_attachment_metadata'), 10, 2);
37
+ add_filter('upload_dir', array(__CLASS__, 'add_relative_upload_dir_key'), 10, 2);
38
  return true;
39
  }
40
 
169
  return self::_operate($src, $op, $force);
170
  }
171
 
172
+ //-- end of public methods --//
173
+
174
  /**
175
+ * Deletes all resized versions of an image when the source is deleted.
176
+ *
177
+ * @since 1.5.0
178
+ * @param int $post_id an attachment post id
179
  */
180
+ public static function delete_attachment( $post_id ) {
181
+ self::_delete_generated_if_image($post_id);
 
 
 
 
 
 
182
  }
183
 
184
+
185
  /**
186
+ * Delete all resized version of an image when its meta data is regenerated.
187
+ *
188
+ * @since 1.5.0
189
+ * @param array $metadata
190
+ * @param int $post_id an attachment post id
191
+ * @return array
192
  */
193
+ public static function generate_attachment_metadata( $metadata, $post_id ) {
194
+ self::_delete_generated_if_image($post_id);
195
+ return $metadata;
 
 
196
  }
197
 
198
+ /**
199
+ * Adds a 'relative' key to wp_upload_dir() result.
200
+ * It will contain the relative url to upload dir.
201
+ *
202
+ * @since 1.5.0
203
+ * @param array $arr
204
+ * @return array
205
+ */
206
+ public static function add_relative_upload_dir_key( $arr ) {
207
+ $arr['relative'] = str_replace(self::$home_url, '', $arr['baseurl']);
208
+ return $arr;
209
+ }
210
 
211
  /**
212
  * Checks if attachment is an image before deleting generated files
lib/MenuItem.php CHANGED
@@ -111,6 +111,7 @@ class MenuItem extends Core implements CoreInterface {
111
  * @internal
112
  * @see TimberMenuItem::link
113
  * @deprecated 1.0
 
114
  * @return string an absolute URL http://example.org/my-page
115
  */
116
  public function get_link() {
@@ -119,6 +120,7 @@ class MenuItem extends Core implements CoreInterface {
119
 
120
  /**
121
  * @internal
 
122
  * @see TimberMenuItem::path()
123
  * @deprecated 1.0
124
  * @return string a relative url /my-page
@@ -263,7 +265,7 @@ class MenuItem extends Core implements CoreInterface {
263
  if ( isset($this->_menu_item_type) && $this->_menu_item_type == 'custom' ) {
264
  $this->url = $this->_menu_item_url;
265
  } else if ( isset($this->menu_object) && method_exists($this->menu_object, 'get_link') ) {
266
- $this->url = $this->menu_object->get_link();
267
  }
268
  }
269
  return $this->url;
@@ -274,6 +276,7 @@ class MenuItem extends Core implements CoreInterface {
274
  * @internal
275
  * @deprecated since 0.21.7 use link instead
276
  * @see link()
 
277
  * @return string a full URL like http://mysite.com/thing/
278
  */
279
  public function permalink() {
@@ -289,7 +292,6 @@ class MenuItem extends Core implements CoreInterface {
289
  * <li><a href="{{ item.path }}">{{ item.title }}</a></li>
290
  * {% endfor %}
291
  * ```
292
- * @see get_path()
293
  * @return string the path of a URL like /foo
294
  */
295
  public function path() {
111
  * @internal
112
  * @see TimberMenuItem::link
113
  * @deprecated 1.0
114
+ * @codeCoverageIgnore
115
  * @return string an absolute URL http://example.org/my-page
116
  */
117
  public function get_link() {
120
 
121
  /**
122
  * @internal
123
+ * @codeCoverageIgnore
124
  * @see TimberMenuItem::path()
125
  * @deprecated 1.0
126
  * @return string a relative url /my-page
265
  if ( isset($this->_menu_item_type) && $this->_menu_item_type == 'custom' ) {
266
  $this->url = $this->_menu_item_url;
267
  } else if ( isset($this->menu_object) && method_exists($this->menu_object, 'get_link') ) {
268
+ $this->url = $this->menu_object->link();
269
  }
270
  }
271
  return $this->url;
276
  * @internal
277
  * @deprecated since 0.21.7 use link instead
278
  * @see link()
279
+ * @codeCoverageIgnore
280
  * @return string a full URL like http://mysite.com/thing/
281
  */
282
  public function permalink() {
292
  * <li><a href="{{ item.path }}">{{ item.title }}</a></li>
293
  * {% endfor %}
294
  * ```
 
295
  * @return string the path of a URL like /foo
296
  */
297
  public function path() {
lib/Post.php CHANGED
@@ -95,10 +95,9 @@ class Post extends Core implements CoreInterface {
95
  protected $_prev = array();
96
 
97
  /**
98
- * @api
99
  * @var string $class stores the CSS classes for the post (ex: "post post-type-book post-123")
100
  */
101
- public $class;
102
 
103
  /**
104
  * @api
@@ -178,6 +177,33 @@ class Post extends Core implements CoreInterface {
178
  $this->init($pid);
179
  }
180
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  /**
182
  * tries to figure out what post you want to get if not explictly defined (or if it is, allows it to be passed through)
183
  * @internal
@@ -192,12 +218,12 @@ class Post extends Core implements CoreInterface {
192
  && isset($wp_query->queried_object)
193
  && is_object($wp_query->queried_object)
194
  && get_class($wp_query->queried_object) == 'WP_Post'
195
- ) {
196
- if ( isset($_GET['preview']) && isset($_GET['preview_nonce']) && wp_verify_nonce($_GET['preview_nonce'], 'post_preview_'.$wp_query->queried_object_id) ) {
197
- $pid = $this->get_post_preview_id($wp_query);
198
- } else if ( !$pid ) {
199
- $pid = $wp_query->queried_object_id;
200
- }
201
  } else if ( $pid === null && $wp_query->is_home && isset($wp_query->queried_object_id) && $wp_query->queried_object_id ) {
202
  //hack for static page as home page
203
  $pid = $wp_query->queried_object_id;
@@ -233,23 +259,23 @@ class Post extends Core implements CoreInterface {
233
 
234
  protected function get_post_preview_id( $query ) {
235
  $can = array(
236
- 'edit_'.$query->queried_object->post_type.'s',
237
- );
238
 
239
- if ( $query->queried_object->author_id !== get_current_user_id() ) {
240
- $can[] = 'edit_others_'.$query->queried_object->post_type.'s';
241
- }
242
 
243
- $can_preview = array();
244
 
245
  foreach ( $can as $type ) {
246
- if ( current_user_can($type) ) {
247
  $can_preview[] = true;
248
- }
249
  }
250
 
251
  if ( count($can_preview) !== count($can) ) {
252
- return;
253
  }
254
 
255
  $revisions = wp_get_post_revisions($query->queried_object_id);
@@ -276,9 +302,6 @@ class Post extends Core implements CoreInterface {
276
  }
277
  $post_info = $this->get_info($pid);
278
  $this->import($post_info);
279
- //cant have a function, so gots to do it this way
280
- $post_class = $this->post_class();
281
- $this->class = $post_class;
282
  }
283
 
284
  /**
@@ -338,7 +361,7 @@ class Post extends Core implements CoreInterface {
338
  return $pid;
339
  }
340
  if ( !is_numeric($pid) && is_string($pid) ) {
341
- $pid = self::get_post_id_by_name($pid);
342
  return $pid;
343
  }
344
  if ( !$pid ) {
@@ -351,17 +374,12 @@ class Post extends Core implements CoreInterface {
351
  /**
352
  * get_post_id_by_name($post_name)
353
  * @internal
 
354
  * @param string $post_name
355
  * @return int
356
  */
357
  public static function get_post_id_by_name( $post_name ) {
358
- global $wpdb;
359
- $query = $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name = %s LIMIT 1", $post_name);
360
- $result = $wpdb->get_row($query);
361
- if ( !$result ) {
362
- return null;
363
- }
364
- return $result->ID;
365
  }
366
 
367
  /**
@@ -539,11 +557,11 @@ class Post extends Core implements CoreInterface {
539
  * ```twig
540
  * <section id="job-feed">
541
  * {% for post in job %}
542
- * <div class="job">
543
- * <h2>{{ post.title }}</h2>
544
- * <p>{{ post.terms('category') | join(', ') }}
545
- * </div>
546
- * {% endfor %}
547
  * </section>
548
  * ```
549
  * ```html
@@ -708,13 +726,12 @@ class Post extends Core implements CoreInterface {
708
  }
709
 
710
  /**
711
- * Get the CSS classes for a post. For usage you should use `{{post.class}}` instead of `{{post.post_class}}`
712
  * @internal
713
  * @param string $class additional classes you want to add
714
- * @see Timber\Post::$class
715
  * @example
716
  * ```twig
717
- * <article class="{{ post.class }}">
718
  * {# Some stuff here #}
719
  * </article>
720
  * ```
@@ -738,6 +755,28 @@ class Post extends Core implements CoreInterface {
738
  return $class_array;
739
  }
740
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
741
  // Docs
742
 
743
  /**
@@ -914,11 +953,11 @@ class Post extends Core implements CoreInterface {
914
  * If the Password form is to be shown, show it!
915
  * @return string|void
916
  */
917
- protected function maybe_show_password_form(){
918
  if ( $this->password_required() ) {
919
  $show_pw = false;
920
  $show_pw = apply_filters('timber/post/content/show_password_form_for_protected', $show_pw);
921
- if ($show_pw) {
922
  return apply_filters('timber/post/content/password_form', get_the_password_form($this->ID), $this);
923
  }
924
  }
@@ -1014,8 +1053,8 @@ class Post extends Core implements CoreInterface {
1014
  */
1015
  public function time( $time_format = '' ) {
1016
  $tf = $time_format ? $time_format : get_option('time_format');
1017
- $the_time = (string) mysql2date($tf, $this->post_date);
1018
- return apply_filters('get_the_time', $the_time, $tf);
1019
  }
1020
 
1021
 
@@ -1061,7 +1100,7 @@ class Post extends Core implements CoreInterface {
1061
  public function format() {
1062
  return get_post_format($this->ID);
1063
  }
1064
-
1065
  /**
1066
  * whether post requires password and correct password has been provided
1067
  * @api
@@ -1189,7 +1228,7 @@ class Post extends Core implements CoreInterface {
1189
  * @param array|WP_Post $data
1190
  * @param string $class
1191
  */
1192
- public function convert( $data, $class ) {
1193
  if ( $data instanceof WP_Post ) {
1194
  $data = new $class($data);
1195
  } else if ( is_array($data) ) {
@@ -1204,7 +1243,6 @@ class Post extends Core implements CoreInterface {
1204
  }
1205
  }
1206
  }
1207
-
1208
  return $data;
1209
  }
1210
 
@@ -1294,7 +1332,7 @@ class Post extends Core implements CoreInterface {
1294
  if ( $tid ) {
1295
  //return new Image($tid);
1296
  return new $this->ImageClass($tid);
1297
- }
1298
  }
1299
 
1300
 
@@ -1391,19 +1429,19 @@ class Post extends Core implements CoreInterface {
1391
  return $this->title();
1392
  }
1393
 
1394
- /**
1395
- * Displays the content of the post with filters, shortcodes and wpautop applied
1396
- * @example
1397
- * ```twig
1398
- * <div class="article-text">{{post.get_content}}</div>
1399
- * ```
1400
- * ```html
1401
- * <div class="article-text"><p>Blah blah blah</p><p>More blah blah blah.</p></div>
1402
- * ```
1403
- * @param int $len
1404
- * @param int $page
1405
- * @return string
1406
- */
1407
  public function get_content( $len = -1, $page = 0 ) {
1408
  if ( $len === 0 ) {
1409
  $len = -1;
@@ -1444,14 +1482,14 @@ class Post extends Core implements CoreInterface {
1444
  return $this->link();
1445
  }
1446
 
1447
- /**
1448
- * @internal
1449
- * @see Timber\Post::date
1450
- * @deprecated since 1.0
1451
- * @codeCoverageIgnore
1452
- * @param string $date_format
1453
- * @return string
1454
- */
1455
  public function get_date( $date_format = '' ) {
1456
  return $this->date($date_format);
1457
  }
@@ -1492,15 +1530,15 @@ class Post extends Core implements CoreInterface {
1492
  return $this->children($post_type, $childPostClass);
1493
  }
1494
 
1495
- /**
1496
- * Get the permalink for a post, but as a relative path
1497
- * For example, where {{post.link}} would return "http://example.org/2015/07/04/my-cool-post"
1498
- * this will return the relative version: "/2015/07/04/my-cool-post"
1499
- * @internal
1500
- * @deprecated since 1.0
1501
- * @codeCoverageIgnore
1502
- * @return string
1503
- */
1504
  public function get_path() {
1505
  return $this->path();
1506
  }
95
  protected $_prev = array();
96
 
97
  /**
 
98
  * @var string $class stores the CSS classes for the post (ex: "post post-type-book post-123")
99
  */
100
+ protected $_css_class;
101
 
102
  /**
103
  * @api
177
  $this->init($pid);
178
  }
179
 
180
+ /**
181
+ * This is helpful for twig to return properties and methods see: https://github.com/fabpot/Twig/issues/2
182
+ * This is also here to ensure that {{ post.class }} remains usable
183
+ * @return mixed
184
+ */
185
+ public function __get( $field ) {
186
+ if ( 'class' === $field ) {
187
+ return $this->css_class();
188
+ }
189
+
190
+ return parent::__get($field);
191
+ }
192
+
193
+ /**
194
+ * This is helpful for twig to return properties and methods see: https://github.com/fabpot/Twig/issues/2
195
+ * This is also here to ensure that {{ post.class }} remains usable
196
+ * @return mixed
197
+ */
198
+ public function __call( $field, $args ) {
199
+ if ( 'class' === $field ) {
200
+ $class = isset($args[0]) ? $args[0] : '';
201
+ return $this->css_class($class);
202
+ }
203
+
204
+ return parent::__call($field, $args);
205
+ }
206
+
207
  /**
208
  * tries to figure out what post you want to get if not explictly defined (or if it is, allows it to be passed through)
209
  * @internal
218
  && isset($wp_query->queried_object)
219
  && is_object($wp_query->queried_object)
220
  && get_class($wp_query->queried_object) == 'WP_Post'
221
+ ) {
222
+ if ( isset($_GET['preview']) && isset($_GET['preview_nonce']) && wp_verify_nonce($_GET['preview_nonce'], 'post_preview_'.$wp_query->queried_object_id) ) {
223
+ $pid = $this->get_post_preview_id($wp_query);
224
+ } else if ( !$pid ) {
225
+ $pid = $wp_query->queried_object_id;
226
+ }
227
  } else if ( $pid === null && $wp_query->is_home && isset($wp_query->queried_object_id) && $wp_query->queried_object_id ) {
228
  //hack for static page as home page
229
  $pid = $wp_query->queried_object_id;
259
 
260
  protected function get_post_preview_id( $query ) {
261
  $can = array(
262
+ 'edit_'.$query->queried_object->post_type.'s',
263
+ );
264
 
265
+ if ( $query->queried_object->author_id !== get_current_user_id() ) {
266
+ $can[] = 'edit_others_'.$query->queried_object->post_type.'s';
267
+ }
268
 
269
+ $can_preview = array();
270
 
271
  foreach ( $can as $type ) {
272
+ if ( current_user_can($type) ) {
273
  $can_preview[] = true;
274
+ }
275
  }
276
 
277
  if ( count($can_preview) !== count($can) ) {
278
+ return;
279
  }
280
 
281
  $revisions = wp_get_post_revisions($query->queried_object_id);
302
  }
303
  $post_info = $this->get_info($pid);
304
  $this->import($post_info);
 
 
 
305
  }
306
 
307
  /**
361
  return $pid;
362
  }
363
  if ( !is_numeric($pid) && is_string($pid) ) {
364
+ $pid = PostGetter::get_post_id_by_name($pid);
365
  return $pid;
366
  }
367
  if ( !$pid ) {
374
  /**
375
  * get_post_id_by_name($post_name)
376
  * @internal
377
+ * @deprecated since 1.5.0
378
  * @param string $post_name
379
  * @return int
380
  */
381
  public static function get_post_id_by_name( $post_name ) {
382
+ return PostGetter::get_post_id_by_name($post_name);
 
 
 
 
 
 
383
  }
384
 
385
  /**
557
  * ```twig
558
  * <section id="job-feed">
559
  * {% for post in job %}
560
+ * <div class="job">
561
+ * <h2>{{ post.title }}</h2>
562
+ * <p>{{ post.terms('category') | join(', ') }}
563
+ * </div>
564
+ * {% endfor %}
565
  * </section>
566
  * ```
567
  * ```html
726
  }
727
 
728
  /**
729
+ * Get the CSS classes for a post without cache. For usage you should use `{{post.class}}`
730
  * @internal
731
  * @param string $class additional classes you want to add
 
732
  * @example
733
  * ```twig
734
+ * <article class="{{ post.post_class }}">
735
  * {# Some stuff here #}
736
  * </article>
737
  * ```
755
  return $class_array;
756
  }
757
 
758
+ /**
759
+ * Get the CSS classes for a post, but with caching css post classes. For usage you should use `{{ post.class }}` instead of `{{post.css_class}}` or `{{post.post_class}}`
760
+ * @internal
761
+ * @param string $class additional classes you want to add
762
+ * @see Timber\Post::$_css_class
763
+ * @example
764
+ * ```twig
765
+ * <article class="{{ post.class }}">
766
+ * {# Some stuff here #}
767
+ * </article>
768
+ * ```
769
+ *
770
+ * @return string a space-seperated list of classes
771
+ */
772
+ public function css_class( $class = '' ) {
773
+ if ( !$this->_css_class ) {
774
+ $this->_css_class = $this->post_class();
775
+ }
776
+
777
+ return trim(sprintf('%s %s', $this->_css_class, $class));
778
+ }
779
+
780
  // Docs
781
 
782
  /**
953
  * If the Password form is to be shown, show it!
954
  * @return string|void
955
  */
956
+ protected function maybe_show_password_form() {
957
  if ( $this->password_required() ) {
958
  $show_pw = false;
959
  $show_pw = apply_filters('timber/post/content/show_password_form_for_protected', $show_pw);
960
+ if ( $show_pw ) {
961
  return apply_filters('timber/post/content/password_form', get_the_password_form($this->ID), $this);
962
  }
963
  }
1053
  */
1054
  public function time( $time_format = '' ) {
1055
  $tf = $time_format ? $time_format : get_option('time_format');
1056
+ $the_time = (string) mysql2date($tf, $this->post_date);
1057
+ return apply_filters('get_the_time', $the_time, $tf);
1058
  }
1059
 
1060
 
1100
  public function format() {
1101
  return get_post_format($this->ID);
1102
  }
1103
+
1104
  /**
1105
  * whether post requires password and correct password has been provided
1106
  * @api
1228
  * @param array|WP_Post $data
1229
  * @param string $class
1230
  */
1231
+ public function convert( $data, $class = '\Timber\Post' ) {
1232
  if ( $data instanceof WP_Post ) {
1233
  $data = new $class($data);
1234
  } else if ( is_array($data) ) {
1243
  }
1244
  }
1245
  }
 
1246
  return $data;
1247
  }
1248
 
1332
  if ( $tid ) {
1333
  //return new Image($tid);
1334
  return new $this->ImageClass($tid);
1335
+ }
1336
  }
1337
 
1338
 
1429
  return $this->title();
1430
  }
1431
 
1432
+ /**
1433
+ * Displays the content of the post with filters, shortcodes and wpautop applied
1434
+ * @example
1435
+ * ```twig
1436
+ * <div class="article-text">{{post.get_content}}</div>
1437
+ * ```
1438
+ * ```html
1439
+ * <div class="article-text"><p>Blah blah blah</p><p>More blah blah blah.</p></div>
1440
+ * ```
1441
+ * @param int $len
1442
+ * @param int $page
1443
+ * @return string
1444
+ */
1445
  public function get_content( $len = -1, $page = 0 ) {
1446
  if ( $len === 0 ) {
1447
  $len = -1;
1482
  return $this->link();
1483
  }
1484
 
1485
+ /**
1486
+ * @internal
1487
+ * @see Timber\Post::date
1488
+ * @deprecated since 1.0
1489
+ * @codeCoverageIgnore
1490
+ * @param string $date_format
1491
+ * @return string
1492
+ */
1493
  public function get_date( $date_format = '' ) {
1494
  return $this->date($date_format);
1495
  }
1530
  return $this->children($post_type, $childPostClass);
1531
  }
1532
 
1533
+ /**
1534
+ * Get the permalink for a post, but as a relative path
1535
+ * For example, where {{post.link}} would return "http://example.org/2015/07/04/my-cool-post"
1536
+ * this will return the relative version: "/2015/07/04/my-cool-post"
1537
+ * @internal
1538
+ * @deprecated since 1.0
1539
+ * @codeCoverageIgnore
1540
+ * @return string
1541
+ */
1542
  public function get_path() {
1543
  return $this->path();
1544
  }
lib/PostCollection.php CHANGED
@@ -6,13 +6,34 @@ use Timber\Helper;
6
  use Timber\Post;
7
 
8
  /**
9
- * PostCollections are internal objects used to hold a collection of posts
 
 
 
 
10
  */
11
  class PostCollection extends \ArrayObject {
12
 
13
  public function __construct( $posts = array(), $post_class = '\Timber\Post' ) {
14
  $returned_posts = self::init($posts, $post_class);
15
- parent::__construct($returned_posts, $flags = 0, 'Timber\PostsIterator');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
17
 
18
  protected static function init( $posts, $post_class ) {
@@ -77,16 +98,6 @@ class PostCollection extends \ArrayObject {
77
 
78
  return $posts;
79
  }
80
-
81
- }
82
-
83
- class PostsIterator extends \ArrayIterator {
84
-
85
- public function current() {
86
- global $post;
87
- $post = parent::current();
88
- return $post;
89
- }
90
  }
91
 
92
  class_alias('Timber\PostCollection', 'Timber\PostsCollection');
6
  use Timber\Post;
7
 
8
  /**
9
+ * Class PostCollection
10
+ *
11
+ * PostCollections are internal objects used to hold a collection of posts.
12
+ *
13
+ * @package Timber
14
  */
15
  class PostCollection extends \ArrayObject {
16
 
17
  public function __construct( $posts = array(), $post_class = '\Timber\Post' ) {
18
  $returned_posts = self::init($posts, $post_class);
19
+
20
+ $posts_iterator = 'Timber\PostsIterator';
21
+
22
+ /**
23
+ * Filters the PostIterator class to use for a PostCollection.
24
+ *
25
+ * This filter is useful if you need to set special values or globals on each post. Because many plugins still
26
+ * rely on The Loop, a custom PostIterator can make it much easier to integrate third party plugins with Timber.
27
+ *
28
+ * @since 1.4.x
29
+ *
30
+ * @param string $posts_iterator The iterator class to use to loop over posts. Default `Timber\PostsIterator`.
31
+ * @param array $returned_posts An array of posts.
32
+ * @param string $post_class The post class to use to extend posts with.
33
+ */
34
+ $posts_iterator = apply_filters('timber/class/posts_iterator', $posts_iterator, $returned_posts, $post_class);
35
+
36
+ parent::__construct($returned_posts, 0, $posts_iterator);
37
  }
38
 
39
  protected static function init( $posts, $post_class ) {
98
 
99
  return $posts;
100
  }
 
 
 
 
 
 
 
 
 
 
101
  }
102
 
103
  class_alias('Timber\PostCollection', 'Timber\PostsCollection');
lib/PostGetter.php CHANGED
@@ -34,6 +34,23 @@ class PostGetter {
34
  return false;
35
  }
36
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
37
  public static function get_posts( $query = false, $PostClass = '\Timber\Post', $return_collection = false ) {
38
  $posts = self::query_posts($query, $PostClass);
39
  return apply_filters('timber_post_getter_get_posts', $posts->get_posts($return_collection));
@@ -121,12 +138,13 @@ class PostGetter {
121
  Helper::error_log('Unexpeted value for PostClass: '.print_r($post_class, true));
122
  }
123
 
124
- $test_post = false;
125
- if ( class_exists($post_class_use) ) {
126
- $test_post = new $post_class_use();
127
  }
128
- if ( !$test_post || !(is_subclass_of($test_post, '\Timber\Post') || is_a($test_post, '\Timber\Post')) ) {
129
- Helper::error_log('Class ' . $post_class_use . ' either does not exist or implement \Timber\Post');
 
 
130
  }
131
 
132
  return $post_class_use;
34
  return false;
35
  }
36
 
37
+ /**
38
+ * get_post_id_by_name($post_name)
39
+ * @internal
40
+ * @since 1.5.0
41
+ * @param string $post_name
42
+ * @return int
43
+ */
44
+ public static function get_post_id_by_name( $post_name ) {
45
+ global $wpdb;
46
+ $query = $wpdb->prepare("SELECT ID FROM $wpdb->posts WHERE post_name = %s LIMIT 1", $post_name);
47
+ $result = $wpdb->get_row($query);
48
+ if ( !$result ) {
49
+ return null;
50
+ }
51
+ return $result->ID;
52
+ }
53
+
54
  public static function get_posts( $query = false, $PostClass = '\Timber\Post', $return_collection = false ) {
55
  $posts = self::query_posts($query, $PostClass);
56
  return apply_filters('timber_post_getter_get_posts', $posts->get_posts($return_collection));
138
  Helper::error_log('Unexpeted value for PostClass: '.print_r($post_class, true));
139
  }
140
 
141
+ if ( $post_class_use === '\Timber\Post' ) {
142
+ return $post_class_use;
 
143
  }
144
+
145
+ if ( !class_exists($post_class_use) || !is_a(new $post_class_use, '\Timber\Post') ) {
146
+ Helper::error_log('Class '.$post_class_use.' either does not exist or implement \Timber\Post');
147
+ return '\Timber\Post';
148
  }
149
 
150
  return $post_class_use;
lib/PostsIterator.php ADDED
@@ -0,0 +1,18 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Timber;
4
+
5
+ /**
6
+ * Class PostsIterator
7
+ *
8
+ * @package Timber
9
+ */
10
+ class PostsIterator extends \ArrayIterator {
11
+
12
+ public function current() {
13
+ global $post;
14
+ $post = parent::current();
15
+ return $post;
16
+ }
17
+
18
+ }
readme.txt CHANGED
@@ -2,7 +2,7 @@
2
  Contributors: jarednova, connorjburton, lggorman
3
  Tags: template engine, templates, twig
4
  Requires at least: 3.7
5
- Stable tag: 1.4.1
6
  Tested up to: 4.8.1
7
  PHP version: 5.3.0 or greater
8
  License: GPLv2 or later
@@ -28,6 +28,25 @@ _Twig is the template language powering Timber; if you need a little background
28
 
29
  == Changelog ==
30
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
31
  = 1.4.1 =
32
 
33
  **Fixes and improvements**
@@ -38,7 +57,7 @@ _Twig is the template language powering Timber; if you need a little background
38
 
39
  **Fixes and Improvements**
40
  - Improve GIF resize performance #1495 (thanks @ahallais)
41
- - Fix for get_host which could generate an unncessary warning #1490 (thanks @ahallais)
42
 
43
  **Changes for Theme Developers**
44
  - Improve loader performance and logic #1476 #1489 #1491 (thanks @heino). This introduces potential changes if you were loading templates in a non-standard way and with multiple sources (ex: from a theme and plugin directory). Non-existing templates are no longer passed all the way to Twig’s `render()`, which currently generates an exception.
2
  Contributors: jarednova, connorjburton, lggorman
3
  Tags: template engine, templates, twig
4
  Requires at least: 3.7
5
+ Stable tag: 1.5.0
6
  Tested up to: 4.8.1
7
  PHP version: 5.3.0 or greater
8
  License: GPLv2 or later
28
 
29
  == Changelog ==
30
 
31
+ = Develop (next release) =
32
+
33
+ **Fixes and improvements**
34
+ - Please add bullet points here with your PR. The heading for this section will get the correct version number once released.
35
+
36
+ **Changes for Theme Developers**
37
+ - Please add any usage changes here so theme developers are informed of changes.
38
+
39
+ = 1.5.0 =
40
+
41
+ **Fixes and improvements**
42
+ - `home_url` value is now cached, performance win for polylang! #1507 (thanks @oxyc)
43
+ - Post::$css_class is only fetched if requested #1522 (thanks @ruscon)
44
+ - Improved flexibility of PostCollection to be filterable #1544 (thanks @gchtr)
45
+ - More test coverage
46
+
47
+ **Changes for Theme Developers**
48
+ - None! But the above fixes have significant changes in the code which necessitated the ".x" version jump
49
+
50
  = 1.4.1 =
51
 
52
  **Fixes and improvements**
57
 
58
  **Fixes and Improvements**
59
  - Improve GIF resize performance #1495 (thanks @ahallais)
60
+ - Fix for get_host which could generate an unnecessary warning #1490 (thanks @ahallais)
61
 
62
  **Changes for Theme Developers**
63
  - Improve loader performance and logic #1476 #1489 #1491 (thanks @heino). This introduces potential changes if you were loading templates in a non-standard way and with multiple sources (ex: from a theme and plugin directory). Non-existing templates are no longer passed all the way to Twig’s `render()`, which currently generates an exception.
timber-starter-theme/humans.txt ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ ## Team
2
+
3
+ Your name or company
4
+ http://yoursite.org
5
+ @you_on_twitter
6
+
7
+
8
+ ## Site
9
+
10
+ Software: Built with [Timber](http://upstatement.com/timber) by Upstatement
timber-starter-theme/templates/html-header.twig CHANGED
@@ -1,10 +1,10 @@
1
  <!doctype html>
2
- <!--[if lt IE 7]><html class="no-js ie ie6 lt-ie9 lt-ie8 lt-ie7" {{site.language_attributes}}> <![endif]-->
3
- <!--[if IE 7]><html class="no-js ie ie7 lt-ie9 lt-ie8" {{site.language_attributes}}> <![endif]-->
4
- <!--[if IE 8]><html class="no-js ie ie8 lt-ie9" {{site.language_attributes}}> <![endif]-->
5
- <!--[if gt IE 8]><!--><html class="no-js" {{site.language_attributes}}> <!--<![endif]-->
6
  <head>
7
- <meta charset="{{site.charset}}" />
8
  <title>
9
  {% if wp_title %}
10
  {{ wp_title }} - {{ site.name }}
@@ -12,10 +12,11 @@
12
  {{ site.name }}
13
  {% endif %}
14
  </title>
15
- <meta name="description" content="{{site.description}}">
16
- <link rel="stylesheet" href="{{site.theme.link}}/style.css" type="text/css" media="screen" />
17
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
18
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
19
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
20
- <link rel="pingback" href="{{site.pingback_url}}" />
 
21
  {{function('wp_head')}}
1
  <!doctype html>
2
+ <!--[if lt IE 7]><html class="no-js ie ie6 lt-ie9 lt-ie8 lt-ie7" {{ site.language_attributes }}> <![endif]-->
3
+ <!--[if IE 7]><html class="no-js ie ie7 lt-ie9 lt-ie8" {{ site.language_attributes }}> <![endif]-->
4
+ <!--[if IE 8]><html class="no-js ie ie8 lt-ie9" {{ site.language_attributes }}> <![endif]-->
5
+ <!--[if gt IE 8]><!--><html class="no-js" {{ site.language_attributes }}> <!--<![endif]-->
6
  <head>
7
+ <meta charset="{{ site.charset }}" />
8
  <title>
9
  {% if wp_title %}
10
  {{ wp_title }} - {{ site.name }}
12
  {{ site.name }}
13
  {% endif %}
14
  </title>
15
+ <meta name="description" content="{{ site.description }}">
16
+ <link rel="stylesheet" href="{{ site.theme.link }}/style.css" type="text/css" media="screen" />
17
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
18
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
19
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
20
+ <link rel="author" href="{{ site.theme.link }}/humans.txt" />
21
+ <link rel="pingback" href="{{ site.pingback_url }}" />
22
  {{function('wp_head')}}
timber.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: Timber
4
  Description: The WordPress Timber Library allows you to write themes using the power of Twig templates.
5
  Plugin URI: http://timber.upstatement.com
6
  Author: Jared Novack + Upstatement
7
- Version: 1.4.1
8
  Author URI: http://upstatement.com/
9
  */
10
  // we look for Composer files first in the plugins dir.
4
  Description: The WordPress Timber Library allows you to write themes using the power of Twig templates.
5
  Plugin URI: http://timber.upstatement.com
6
  Author: Jared Novack + Upstatement
7
+ Version: 1.5.0
8
  Author URI: http://upstatement.com/
9
  */
10
  // we look for Composer files first in the plugins dir.
vendor/autoload.php CHANGED
@@ -4,4 +4,4 @@
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
- return ComposerAutoloaderInitdf0038319ddcc4e70ed54620c71e6bea::getLoader();
4
 
5
  require_once __DIR__ . '/composer' . '/autoload_real.php';
6
 
7
+ return ComposerAutoloaderInite4b27420d2a2e71228ec8df046d75250::getLoader();
vendor/composer/autoload_classmap.php CHANGED
@@ -47,6 +47,7 @@ return array(
47
  'Composer\\Installers\\ElggInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ElggInstaller.php',
48
  'Composer\\Installers\\EliasisInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EliasisInstaller.php',
49
  'Composer\\Installers\\ExpressionEngineInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php',
 
50
  'Composer\\Installers\\FuelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelInstaller.php',
51
  'Composer\\Installers\\FuelphpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php',
52
  'Composer\\Installers\\GravInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/GravInstaller.php',
@@ -59,6 +60,7 @@ return array(
59
  'Composer\\Installers\\KirbyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KirbyInstaller.php',
60
  'Composer\\Installers\\KodiCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php',
61
  'Composer\\Installers\\KohanaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KohanaInstaller.php',
 
62
  'Composer\\Installers\\LaravelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LaravelInstaller.php',
63
  'Composer\\Installers\\LavaLiteInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php',
64
  'Composer\\Installers\\LithiumInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LithiumInstaller.php',
@@ -73,6 +75,7 @@ return array(
73
  'Composer\\Installers\\MoodleInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MoodleInstaller.php',
74
  'Composer\\Installers\\OctoberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OctoberInstaller.php',
75
  'Composer\\Installers\\OntoWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php',
 
76
  'Composer\\Installers\\OxidInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OxidInstaller.php',
77
  'Composer\\Installers\\PPIInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PPIInstaller.php',
78
  'Composer\\Installers\\PhiftyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php',
@@ -97,6 +100,7 @@ return array(
97
  'Composer\\Installers\\TYPO3FlowInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php',
98
  'Composer\\Installers\\TheliaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TheliaInstaller.php',
99
  'Composer\\Installers\\TuskInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TuskInstaller.php',
 
100
  'Composer\\Installers\\VanillaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VanillaInstaller.php',
101
  'Composer\\Installers\\VgmcpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php',
102
  'Composer\\Installers\\WHMCSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php',
@@ -143,7 +147,7 @@ return array(
143
  'Timber\\PostPreview' => $baseDir . '/lib/PostPreview.php',
144
  'Timber\\PostQuery' => $baseDir . '/lib/PostQuery.php',
145
  'Timber\\PostType' => $baseDir . '/lib/PostType.php',
146
- 'Timber\\PostsIterator' => $baseDir . '/lib/PostCollection.php',
147
  'Timber\\QueryIterator' => $baseDir . '/lib/QueryIterator.php',
148
  'Timber\\Request' => $baseDir . '/lib/Request.php',
149
  'Timber\\Site' => $baseDir . '/lib/Site.php',
47
  'Composer\\Installers\\ElggInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ElggInstaller.php',
48
  'Composer\\Installers\\EliasisInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EliasisInstaller.php',
49
  'Composer\\Installers\\ExpressionEngineInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php',
50
+ 'Composer\\Installers\\EzPlatformInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php',
51
  'Composer\\Installers\\FuelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelInstaller.php',
52
  'Composer\\Installers\\FuelphpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php',
53
  'Composer\\Installers\\GravInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/GravInstaller.php',
60
  'Composer\\Installers\\KirbyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KirbyInstaller.php',
61
  'Composer\\Installers\\KodiCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php',
62
  'Composer\\Installers\\KohanaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KohanaInstaller.php',
63
+ 'Composer\\Installers\\LanManagementSystemInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php',
64
  'Composer\\Installers\\LaravelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LaravelInstaller.php',
65
  'Composer\\Installers\\LavaLiteInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php',
66
  'Composer\\Installers\\LithiumInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LithiumInstaller.php',
75
  'Composer\\Installers\\MoodleInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MoodleInstaller.php',
76
  'Composer\\Installers\\OctoberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OctoberInstaller.php',
77
  'Composer\\Installers\\OntoWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php',
78
+ 'Composer\\Installers\\OsclassInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OsclassInstaller.php',
79
  'Composer\\Installers\\OxidInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OxidInstaller.php',
80
  'Composer\\Installers\\PPIInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PPIInstaller.php',
81
  'Composer\\Installers\\PhiftyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php',
100
  'Composer\\Installers\\TYPO3FlowInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php',
101
  'Composer\\Installers\\TheliaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TheliaInstaller.php',
102
  'Composer\\Installers\\TuskInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TuskInstaller.php',
103
+ 'Composer\\Installers\\UserFrostingInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php',
104
  'Composer\\Installers\\VanillaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VanillaInstaller.php',
105
  'Composer\\Installers\\VgmcpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php',
106
  'Composer\\Installers\\WHMCSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php',
147
  'Timber\\PostPreview' => $baseDir . '/lib/PostPreview.php',
148
  'Timber\\PostQuery' => $baseDir . '/lib/PostQuery.php',
149
  'Timber\\PostType' => $baseDir . '/lib/PostType.php',
150
+ 'Timber\\PostsIterator' => $baseDir . '/lib/PostsIterator.php',
151
  'Timber\\QueryIterator' => $baseDir . '/lib/QueryIterator.php',
152
  'Timber\\Request' => $baseDir . '/lib/Request.php',
153
  'Timber\\Site' => $baseDir . '/lib/Site.php',
vendor/composer/autoload_real.php CHANGED
@@ -2,7 +2,7 @@
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
- class ComposerAutoloaderInitdf0038319ddcc4e70ed54620c71e6bea
6
  {
7
  private static $loader;
8
 
@@ -19,9 +19,9 @@ class ComposerAutoloaderInitdf0038319ddcc4e70ed54620c71e6bea
19
  return self::$loader;
20
  }
21
 
22
- spl_autoload_register(array('ComposerAutoloaderInitdf0038319ddcc4e70ed54620c71e6bea', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
- spl_autoload_unregister(array('ComposerAutoloaderInitdf0038319ddcc4e70ed54620c71e6bea', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
2
 
3
  // autoload_real.php @generated by Composer
4
 
5
+ class ComposerAutoloaderInite4b27420d2a2e71228ec8df046d75250
6
  {
7
  private static $loader;
8
 
19
  return self::$loader;
20
  }
21
 
22
+ spl_autoload_register(array('ComposerAutoloaderInite4b27420d2a2e71228ec8df046d75250', 'loadClassLoader'), true, true);
23
  self::$loader = $loader = new \Composer\Autoload\ClassLoader();
24
+ spl_autoload_unregister(array('ComposerAutoloaderInite4b27420d2a2e71228ec8df046d75250', 'loadClassLoader'));
25
 
26
  $map = require __DIR__ . '/autoload_namespaces.php';
27
  foreach ($map as $namespace => $path) {
vendor/composer/installed.json CHANGED
@@ -1,17 +1,17 @@
1
  [
2
  {
3
  "name": "composer/installers",
4
- "version": "v1.3.0",
5
- "version_normalized": "1.3.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/composer/installers.git",
9
- "reference": "79ad876c7498c0bbfe7eed065b8651c93bfd6045"
10
  },
11
  "dist": {
12
  "type": "zip",
13
- "url": "https://api.github.com/repos/composer/installers/zipball/79ad876c7498c0bbfe7eed065b8651c93bfd6045",
14
- "reference": "79ad876c7498c0bbfe7eed065b8651c93bfd6045",
15
  "shasum": ""
16
  },
17
  "require": {
@@ -25,7 +25,7 @@
25
  "composer/composer": "1.0.*@dev",
26
  "phpunit/phpunit": "4.1.*"
27
  },
28
- "time": "2017-04-24 06:37:16",
29
  "type": "composer-plugin",
30
  "extra": {
31
  "class": "Composer\\Installers\\Plugin",
@@ -59,6 +59,7 @@
59
  "Hurad",
60
  "ImageCMS",
61
  "Kanboard",
 
62
  "MODX Evo",
63
  "Mautic",
64
  "Maya",
@@ -82,6 +83,7 @@
82
  "croogo",
83
  "dokuwiki",
84
  "drupal",
 
85
  "elgg",
86
  "expressionengine",
87
  "fuelphp",
@@ -98,6 +100,7 @@
98
  "mediawiki",
99
  "modulework",
100
  "moodle",
 
101
  "phpbb",
102
  "piwik",
103
  "ppi",
@@ -115,6 +118,112 @@
115
  "zikula"
116
  ]
117
  },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
118
  {
119
  "name": "twig/twig",
120
  "version": "v1.34.4",
@@ -237,111 +346,5 @@
237
  "extension",
238
  "twig"
239
  ]
240
- },
241
- {
242
- "name": "altorouter/altorouter",
243
- "version": "v1.1.0",
244
- "version_normalized": "1.1.0.0",
245
- "source": {
246
- "type": "git",
247
- "url": "https://github.com/dannyvankooten/AltoRouter.git",
248
- "reference": "09d9d946c546bae6d22a7654cdb3b825ffda54b4"
249
- },
250
- "dist": {
251
- "type": "zip",
252
- "url": "https://api.github.com/repos/dannyvankooten/AltoRouter/zipball/09d9d946c546bae6d22a7654cdb3b825ffda54b4",
253
- "reference": "09d9d946c546bae6d22a7654cdb3b825ffda54b4",
254
- "shasum": ""
255
- },
256
- "require": {
257
- "php": ">=5.3.0"
258
- },
259
- "time": "2014-04-16 09:44:40",
260
- "type": "library",
261
- "installation-source": "dist",
262
- "autoload": {
263
- "classmap": [
264
- "AltoRouter.php"
265
- ]
266
- },
267
- "notification-url": "https://packagist.org/downloads/",
268
- "license": [
269
- "MIT"
270
- ],
271
- "authors": [
272
- {
273
- "name": "Danny van Kooten",
274
- "email": "dannyvankooten@gmail.com",
275
- "homepage": "http://dannyvankooten.com/"
276
- },
277
- {
278
- "name": "Koen Punt",
279
- "homepage": "https://github.com/koenpunt"
280
- },
281
- {
282
- "name": "niahoo",
283
- "homepage": "https://github.com/niahoo"
284
- }
285
- ],
286
- "description": "A lightning fast router for PHP",
287
- "homepage": "https://github.com/dannyvankooten/AltoRouter",
288
- "keywords": [
289
- "lightweight",
290
- "router",
291
- "routing"
292
- ]
293
- },
294
- {
295
- "name": "upstatement/routes",
296
- "version": "0.4",
297
- "version_normalized": "0.4.0.0",
298
- "source": {
299
- "type": "git",
300
- "url": "https://github.com/Upstatement/routes.git",
301
- "reference": "fae7d46f56e8b5775f072774941a5f0a25cb86f3"
302
- },
303
- "dist": {
304
- "type": "zip",
305
- "url": "https://api.github.com/repos/Upstatement/routes/zipball/fae7d46f56e8b5775f072774941a5f0a25cb86f3",
306
- "reference": "fae7d46f56e8b5775f072774941a5f0a25cb86f3",
307
- "shasum": ""
308
- },
309
- "require": {
310
- "altorouter/altorouter": "1.1.0",
311
- "composer/installers": "~1.0",
312
- "php": ">=5.3.0"
313
- },
314
- "require-dev": {
315
- "phpunit/phpunit": "3.7.*",
316
- "satooshi/php-coveralls": "dev-master",
317
- "wp-cli/wp-cli": "*"
318
- },
319
- "time": "2016-07-06 12:53:24",
320
- "type": "library",
321
- "installation-source": "dist",
322
- "autoload": {
323
- "psr-0": {
324
- "Routes": ""
325
- }
326
- },
327
- "notification-url": "https://packagist.org/downloads/",
328
- "license": [
329
- "MIT"
330
- ],
331
- "authors": [
332
- {
333
- "name": "Jared Novack",
334
- "email": "jared@upstatement.com",
335
- "homepage": "http://upstatement.com"
336
- }
337
- ],
338
- "description": "Manage rewrites and routes in WordPress with this dead-simple plugin",
339
- "homepage": "http://routes.upstatement.com",
340
- "keywords": [
341
- "redirects",
342
- "rewrite",
343
- "routes",
344
- "routing"
345
- ]
346
  }
347
  ]
1
  [
2
  {
3
  "name": "composer/installers",
4
+ "version": "v1.4.0",
5
+ "version_normalized": "1.4.0.0",
6
  "source": {
7
  "type": "git",
8
  "url": "https://github.com/composer/installers.git",
9
+ "reference": "9ce17fb70e9a38dd8acff0636a29f5cf4d575c1b"
10
  },
11
  "dist": {
12
  "type": "zip",
13
+ "url": "https://api.github.com/repos/composer/installers/zipball/9ce17fb70e9a38dd8acff0636a29f5cf4d575c1b",
14
+ "reference": "9ce17fb70e9a38dd8acff0636a29f5cf4d575c1b",
15
  "shasum": ""
16
  },
17
  "require": {
25
  "composer/composer": "1.0.*@dev",
26
  "phpunit/phpunit": "4.1.*"
27
  },
28
+ "time": "2017-08-09 07:53:48",
29
  "type": "composer-plugin",
30
  "extra": {
31
  "class": "Composer\\Installers\\Plugin",
59
  "Hurad",
60
  "ImageCMS",
61
  "Kanboard",
62
+ "Lan Management System",
63
  "MODX Evo",
64
  "Mautic",
65
  "Maya",
83
  "croogo",
84
  "dokuwiki",
85
  "drupal",
86
+ "eZ Platform",
87
  "elgg",
88
  "expressionengine",
89
  "fuelphp",
100
  "mediawiki",
101
  "modulework",
102
  "moodle",
103
+ "osclass",
104
  "phpbb",
105
  "piwik",
106
  "ppi",
118
  "zikula"
119
  ]
120
  },
121
+ {
122
+ "name": "altorouter/altorouter",
123
+ "version": "v1.1.0",
124
+ "version_normalized": "1.1.0.0",
125
+ "source": {
126
+ "type": "git",
127
+ "url": "https://github.com/dannyvankooten/AltoRouter.git",
128
+ "reference": "09d9d946c546bae6d22a7654cdb3b825ffda54b4"
129
+ },
130
+ "dist": {
131
+ "type": "zip",
132
+ "url": "https://api.github.com/repos/dannyvankooten/AltoRouter/zipball/09d9d946c546bae6d22a7654cdb3b825ffda54b4",
133
+ "reference": "09d9d946c546bae6d22a7654cdb3b825ffda54b4",
134
+ "shasum": ""
135
+ },
136
+ "require": {
137
+ "php": ">=5.3.0"
138
+ },
139
+ "time": "2014-04-16 09:44:40",
140
+ "type": "library",
141
+ "installation-source": "dist",
142
+ "autoload": {
143
+ "classmap": [
144
+ "AltoRouter.php"
145
+ ]
146
+ },
147
+ "notification-url": "https://packagist.org/downloads/",
148
+ "license": [
149
+ "MIT"
150
+ ],
151
+ "authors": [
152
+ {
153
+ "name": "Danny van Kooten",
154
+ "email": "dannyvankooten@gmail.com",
155
+ "homepage": "http://dannyvankooten.com/"
156
+ },
157
+ {
158
+ "name": "Koen Punt",
159
+ "homepage": "https://github.com/koenpunt"
160
+ },
161
+ {
162
+ "name": "niahoo",
163
+ "homepage": "https://github.com/niahoo"
164
+ }
165
+ ],
166
+ "description": "A lightning fast router for PHP",
167
+ "homepage": "https://github.com/dannyvankooten/AltoRouter",
168
+ "keywords": [
169
+ "lightweight",
170
+ "router",
171
+ "routing"
172
+ ]
173
+ },
174
+ {
175
+ "name": "upstatement/routes",
176
+ "version": "0.4",
177
+ "version_normalized": "0.4.0.0",
178
+ "source": {
179
+ "type": "git",
180
+ "url": "https://github.com/Upstatement/routes.git",
181
+ "reference": "fae7d46f56e8b5775f072774941a5f0a25cb86f3"
182
+ },
183
+ "dist": {
184
+ "type": "zip",
185
+ "url": "https://api.github.com/repos/Upstatement/routes/zipball/fae7d46f56e8b5775f072774941a5f0a25cb86f3",
186
+ "reference": "fae7d46f56e8b5775f072774941a5f0a25cb86f3",
187
+ "shasum": ""
188
+ },
189
+ "require": {
190
+ "altorouter/altorouter": "1.1.0",
191
+ "composer/installers": "~1.0",
192
+ "php": ">=5.3.0"
193
+ },
194
+ "require-dev": {
195
+ "phpunit/phpunit": "3.7.*",
196
+ "satooshi/php-coveralls": "dev-master",
197
+ "wp-cli/wp-cli": "*"
198
+ },
199
+ "time": "2016-07-06 12:53:24",
200
+ "type": "library",
201
+ "installation-source": "dist",
202
+ "autoload": {
203
+ "psr-0": {
204
+ "Routes": ""
205
+ }
206
+ },
207
+ "notification-url": "https://packagist.org/downloads/",
208
+ "license": [
209
+ "MIT"
210
+ ],
211
+ "authors": [
212
+ {
213
+ "name": "Jared Novack",
214
+ "email": "jared@upstatement.com",
215
+ "homepage": "http://upstatement.com"
216
+ }
217
+ ],
218
+ "description": "Manage rewrites and routes in WordPress with this dead-simple plugin",
219
+ "homepage": "http://routes.upstatement.com",
220
+ "keywords": [
221
+ "redirects",
222
+ "rewrite",
223
+ "routes",
224
+ "routing"
225
+ ]
226
+ },
227
  {
228
  "name": "twig/twig",
229
  "version": "v1.34.4",
346
  "extension",
347
  "twig"
348
  ]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
349
  }
350
  ]
vendor/composer/installers/.travis.yml CHANGED
@@ -1,21 +1,30 @@
1
  language: php
2
 
 
 
 
 
 
 
 
3
  php:
4
- - 5.3
5
  - 5.4
6
  - 5.5
7
  - 5.6
8
  - 7.0
9
  - 7.1
10
  - hhvm
 
11
 
12
  matrix:
 
 
 
13
  fast_finish: true
14
  allow_failures:
15
- - php: 7.0
16
- - php: 7.1
17
 
18
- before_script:
19
  - composer self-update
20
  - composer install
21
 
1
  language: php
2
 
3
+ sudo: false
4
+
5
+ dist: trusty
6
+
7
+ git:
8
+ depth: 5
9
+
10
  php:
 
11
  - 5.4
12
  - 5.5
13
  - 5.6
14
  - 7.0
15
  - 7.1
16
  - hhvm
17
+ - nightly
18
 
19
  matrix:
20
+ include:
21
+ - dist: precise
22
+ php: 5.3
23
  fast_finish: true
24
  allow_failures:
25
+ - php: nightly
 
26
 
27
+ before_script:
28
  - composer self-update
29
  - composer install
30
 
vendor/composer/installers/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
  # Change Log
2
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  ## v1.3.0 - 2017-04-24
4
  ### Added
5
  * Kanboard plugins installer.
@@ -14,9 +26,6 @@
14
  * OntoWiki installer.
15
  * The requirements for contributing (CONTRIBUTING.md).
16
 
17
- ### Changed
18
- * Concrete5: block & theme install location updates.
19
-
20
  ## v1.2.0 - 2016-08-13
21
  ### Added
22
  * Installer for Attogram.
1
  # Change Log
2
 
3
+ ## [Unreleased]
4
+
5
+ ## v1.4.0 - 2017-08-09
6
+ ### Added
7
+ * Installer for eZ Platform.
8
+ * Installer for UserFrosting.
9
+ * Installer for Osclass.
10
+ * Installer for Lan Management System.
11
+
12
+ ### Changed
13
+ * Added vendor name to package path for Lavalite.
14
+
15
  ## v1.3.0 - 2017-04-24
16
  ### Added
17
  * Kanboard plugins installer.
26
  * OntoWiki installer.
27
  * The requirements for contributing (CONTRIBUTING.md).
28
 
 
 
 
29
  ## v1.2.0 - 2016-08-13
30
  ### Added
31
  * Installer for Attogram.
vendor/composer/installers/README.md CHANGED
@@ -55,6 +55,7 @@ is not needed to install packages with these frameworks:
55
  | Elgg | `elgg-plugin`
56
  | Eliasis | `eliasis-module`
57
  | ExpressionEngine 3 | `ee3-addon`<br>`ee3-theme`
 
58
  | FuelPHP v1.x | `fuel-module`<br>`fuel-package`<br/>`fuel-theme`
59
  | FuelPHP v2.x | `fuelphp-component`
60
  | Grav | `grav-plugin`<br>`grav-theme`
@@ -66,6 +67,7 @@ is not needed to install packages with these frameworks:
66
  | Kirby | **`kirby-plugin`**<br>`kirby-field`<br>`kirby-tag`
67
  | KodiCMS | `kodicms-plugin`<br>`kodicms-media`
68
  | Kohana | **`kohana-module`**
 
69
  | Laravel | `laravel-library`
70
  | Lavalite | `lavalite-theme`<br>`lavalite-package`
71
  | Lithium | **`lithium-library`<br>`lithium-source`**
@@ -78,6 +80,7 @@ is not needed to install packages with these frameworks:
78
  | October | **`october-module`<br>`october-plugin`<br>`october-theme`**
79
  | OntoWiki | `ontowiki-extension`<br>`ontowiki-theme`<br>`ontowiki-translation`
80
  | OXID | `oxid-module`<br>`oxid-theme`<br>`oxid-out`
 
81
  | MODULEWork | `modulework-module`
82
  | Moodle | `moodle-*` (Please [check source](https://raw.githubusercontent.com/composer/installers/master/src/Composer/Installers/MoodleInstaller.php) for all supported types)
83
  | Piwik | `piwik-plugin`
@@ -99,6 +102,7 @@ is not needed to install packages with these frameworks:
99
  | Tusk | `tusk-task`<br>`tusk-command`<br>`tusk-asset`
100
  | TYPO3 Flow | `typo3-flow-package`<br>`typo3-flow-framework`<br>`typo3-flow-plugin`<br>`typo3-flow-site`<br>`typo3-flow-boilerplate`<br>`typo3-flow-build`
101
  | TYPO3 CMS | `typo3-cms-extension` (Deprecated in this package, use the [TYPO3 CMS Installers](https://packagist.org/packages/typo3/cms-composer-installers) instead)
 
102
  | Vanilla | `vanilla-plugin`<br>`vanilla-theme`
103
  | Vgmcp | `vgmcp-bundle`<br>`vgmcp-theme`
104
  | Wolf CMS | `wolfcms-plugin`
55
  | Elgg | `elgg-plugin`
56
  | Eliasis | `eliasis-module`
57
  | ExpressionEngine 3 | `ee3-addon`<br>`ee3-theme`
58
+ | eZ Platform | `ezplatform-assets`<br>`ezplatform-meta-assets`
59
  | FuelPHP v1.x | `fuel-module`<br>`fuel-package`<br/>`fuel-theme`
60
  | FuelPHP v2.x | `fuelphp-component`
61
  | Grav | `grav-plugin`<br>`grav-theme`
67
  | Kirby | **`kirby-plugin`**<br>`kirby-field`<br>`kirby-tag`
68
  | KodiCMS | `kodicms-plugin`<br>`kodicms-media`
69
  | Kohana | **`kohana-module`**
70
+ | Lan Management System | `lms-plugin`<br>`lms-template`<br>`lms-document-template`<br>`lms-userpanel-module`
71
  | Laravel | `laravel-library`
72
  | Lavalite | `lavalite-theme`<br>`lavalite-package`
73
  | Lithium | **`lithium-library`<br>`lithium-source`**
80
  | October | **`october-module`<br>`october-plugin`<br>`october-theme`**
81
  | OntoWiki | `ontowiki-extension`<br>`ontowiki-theme`<br>`ontowiki-translation`
82
  | OXID | `oxid-module`<br>`oxid-theme`<br>`oxid-out`
83
+ | Osclass | `osclass-plugin`<br>`osclass-theme`<br>`osclass-language`
84
  | MODULEWork | `modulework-module`
85
  | Moodle | `moodle-*` (Please [check source](https://raw.githubusercontent.com/composer/installers/master/src/Composer/Installers/MoodleInstaller.php) for all supported types)
86
  | Piwik | `piwik-plugin`
102
  | Tusk | `tusk-task`<br>`tusk-command`<br>`tusk-asset`
103
  | TYPO3 Flow | `typo3-flow-package`<br>`typo3-flow-framework`<br>`typo3-flow-plugin`<br>`typo3-flow-site`<br>`typo3-flow-boilerplate`<br>`typo3-flow-build`
104
  | TYPO3 CMS | `typo3-cms-extension` (Deprecated in this package, use the [TYPO3 CMS Installers](https://packagist.org/packages/typo3/cms-composer-installers) instead)
105
+ | UserFrosting | `userfrosting-sprinkle`
106
  | Vanilla | `vanilla-plugin`<br>`vanilla-theme`
107
  | Vgmcp | `vgmcp-bundle`<br>`vgmcp-theme`
108
  | Wolf CMS | `wolfcms-plugin`
vendor/composer/installers/_config.yml ADDED
@@ -0,0 +1 @@
 
1
+ theme: jekyll-theme-cayman
vendor/composer/installers/composer.json CHANGED
@@ -23,6 +23,7 @@
23
  "Elgg",
24
  "Eliasis",
25
  "ExpressionEngine",
 
26
  "FuelPHP",
27
  "Grav",
28
  "Hurad",
@@ -31,6 +32,7 @@
31
  "Joomla",
32
  "Kanboard",
33
  "Kohana",
 
34
  "Laravel",
35
  "Lavalite",
36
  "Lithium",
@@ -41,6 +43,7 @@
41
  "MODX Evo",
42
  "MediaWiki",
43
  "OXID",
 
44
  "MODULEWork",
45
  "Moodle",
46
  "Piwik",
23
  "Elgg",
24
  "Eliasis",
25
  "ExpressionEngine",
26
+ "eZ Platform",
27
  "FuelPHP",
28
  "Grav",
29
  "Hurad",
32
  "Joomla",
33
  "Kanboard",
34
  "Kohana",
35
+ "Lan Management System",
36
  "Laravel",
37
  "Lavalite",
38
  "Lithium",
43
  "MODX Evo",
44
  "MediaWiki",
45
  "OXID",
46
+ "osclass",
47
  "MODULEWork",
48
  "Moodle",
49
  "Piwik",
vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php ADDED
@@ -0,0 +1,10 @@
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class EzPlatformInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'meta-assets' => 'web/assets/ezplatform/',
8
+ 'assets' => 'web/assets/ezplatform/{$name}/',
9
+ );
10
+ }
vendor/composer/installers/src/Composer/Installers/Installer.php CHANGED
@@ -37,6 +37,7 @@ class Installer extends LibraryInstaller
37
  'eliasis' => 'EliasisInstaller',
38
  'ee3' => 'ExpressionEngineInstaller',
39
  'ee2' => 'ExpressionEngineInstaller',
 
40
  'fuel' => 'FuelInstaller',
41
  'fuelphp' => 'FuelphpInstaller',
42
  'grav' => 'GravInstaller',
@@ -48,6 +49,7 @@ class Installer extends LibraryInstaller
48
  'kirby' => 'KirbyInstaller',
49
  'kodicms' => 'KodiCMSInstaller',
50
  'kohana' => 'KohanaInstaller',
 
51
  'laravel' => 'LaravelInstaller',
52
  'lavalite' => 'LavaLiteInstaller',
53
  'lithium' => 'LithiumInstaller',
@@ -63,6 +65,7 @@ class Installer extends LibraryInstaller
63
  'october' => 'OctoberInstaller',
64
  'ontowiki' => 'OntoWikiInstaller',
65
  'oxid' => 'OxidInstaller',
 
66
  'phpbb' => 'PhpBBInstaller',
67
  'pimcore' => 'PimcoreInstaller',
68
  'piwik' => 'PiwikInstaller',
@@ -84,6 +87,7 @@ class Installer extends LibraryInstaller
84
  'tusk' => 'TuskInstaller',
85
  'typo3-cms' => 'TYPO3CmsInstaller',
86
  'typo3-flow' => 'TYPO3FlowInstaller',
 
87
  'vanilla' => 'VanillaInstaller',
88
  'whmcs' => 'WHMCSInstaller',
89
  'wolfcms' => 'WolfCMSInstaller',
37
  'eliasis' => 'EliasisInstaller',
38
  'ee3' => 'ExpressionEngineInstaller',
39
  'ee2' => 'ExpressionEngineInstaller',
40
+ 'ezplatform' => 'EzPlatformInstaller',
41
  'fuel' => 'FuelInstaller',
42
  'fuelphp' => 'FuelphpInstaller',
43
  'grav' => 'GravInstaller',
49
  'kirby' => 'KirbyInstaller',
50
  'kodicms' => 'KodiCMSInstaller',
51
  'kohana' => 'KohanaInstaller',
52
+ 'lms' => 'LanManagementSystemInstaller',
53
  'laravel' => 'LaravelInstaller',
54
  'lavalite' => 'LavaLiteInstaller',
55
  'lithium' => 'LithiumInstaller',
65
  'october' => 'OctoberInstaller',
66
  'ontowiki' => 'OntoWikiInstaller',
67
  'oxid' => 'OxidInstaller',
68
+ 'osclass' => 'OsclassInstaller',
69
  'phpbb' => 'PhpBBInstaller',
70
  'pimcore' => 'PimcoreInstaller',
71
  'piwik' => 'PiwikInstaller',
87
  'tusk' => 'TuskInstaller',
88
  'typo3-cms' => 'TYPO3CmsInstaller',
89
  'typo3-flow' => 'TYPO3FlowInstaller',
90
+ 'userfrosting' => 'UserFrostingInstaller',
91
  'vanilla' => 'VanillaInstaller',
92
  'whmcs' => 'WHMCSInstaller',
93
  'wolfcms' => 'WolfCMSInstaller',
vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php ADDED
@@ -0,0 +1,27 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Composer\Installers;
4
+
5
+ class LanManagementSystemInstaller extends BaseInstaller
6
+ {
7
+
8
+ protected $locations = array(
9
+ 'plugin' => 'plugins/{$name}/',
10
+ 'template' => 'templates/{$name}/',
11
+ 'document-template' => 'documents/templates/{$name}/',
12
+ 'userpanel-module' => 'userpanel/modules/{$name}/',
13
+ );
14
+
15
+ /**
16
+ * Format package name to CamelCase
17
+ */
18
+ public function inflectPackageVars($vars)
19
+ {
20
+ $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name']));
21
+ $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']);
22
+ $vars['name'] = str_replace(' ', '', ucwords($vars['name']));
23
+
24
+ return $vars;
25
+ }
26
+
27
+ }
vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php CHANGED
@@ -4,7 +4,7 @@ namespace Composer\Installers;
4
  class LavaLiteInstaller extends BaseInstaller
5
  {
6
  protected $locations = array(
7
- 'package' => 'packages/{$name}/',
8
  'theme' => 'public/themes/{$name}/',
9
  );
10
  }
4
  class LavaLiteInstaller extends BaseInstaller
5
  {
6
  protected $locations = array(
7
+ 'package' => 'packages/{$vendor}/{$name}/',
8
  'theme' => 'public/themes/{$name}/',
9
  );
10
  }
vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php ADDED
@@ -0,0 +1,14 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+
5
+ class OsclassInstaller extends BaseInstaller
6
+ {
7
+
8
+ protected $locations = array(
9
+ 'plugin' => 'oc-content/plugins/{$name}/',
10
+ 'theme' => 'oc-content/themes/{$name}/',
11
+ 'language' => 'oc-content/languages/{$name}/',
12
+ );
13
+
14
+ }
vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php ADDED
@@ -0,0 +1,9 @@
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Composer\Installers;
3
+
4
+ class UserFrostingInstaller extends BaseInstaller
5
+ {
6
+ protected $locations = array(
7
+ 'sprinkle' => 'app/sprinkles/{$name}/',
8
+ );
9
+ }
vendor/composer/installers/tests/Composer/Installers/Test/InstallerTest.php CHANGED
@@ -124,6 +124,8 @@ class InstallerTest extends TestCase
124
  array('ee2-addon', true),
125
  array('elgg-plugin', true),
126
  array('eliasis-module', true),
 
 
127
  array('fuel-module', true),
128
  array('fuel-package', true),
129
  array('fuel-theme', true),
@@ -138,6 +140,10 @@ class InstallerTest extends TestCase
138
  array('kanboard-plugin', true),
139
  array('kirby-plugin', true),
140
  array('kohana-module', true),
 
 
 
 
141
  array('laravel-library', true),
142
  array('lavalite-theme', true),
143
  array('lavalite-package', true),
@@ -192,6 +198,7 @@ class InstallerTest extends TestCase
192
  array('tusk-asset', true),
193
  array('typo3-flow-plugin', true),
194
  array('typo3-cms-extension', true),
 
195
  array('vanilla-plugin', true),
196
  array('vanilla-theme', true),
197
  array('whmcs-gateway', true),
@@ -207,6 +214,9 @@ class InstallerTest extends TestCase
207
  array('phifty-bundle', true),
208
  array('phifty-library', true),
209
  array('phifty-framework', true),
 
 
 
210
  );
211
  }
212
 
@@ -272,6 +282,8 @@ class InstallerTest extends TestCase
272
  array('ee3-theme', 'themes/user/ee_package/', 'author/ee_package'),
273
  array('ee2-addon', 'system/expressionengine/third_party/ee_theme/', 'author/ee_theme'),
274
  array('ee2-theme', 'themes/third_party/ee_package/', 'author/ee_package'),
 
 
275
  array('fuel-module', 'fuel/app/modules/module/', 'fuel/module'),
276
  array('fuel-package', 'fuel/packages/orm/', 'fuel/orm'),
277
  array('fuel-theme', 'fuel/app/themes/theme/', 'fuel/theme'),
@@ -286,9 +298,17 @@ class InstallerTest extends TestCase
286
  array('kanboard-plugin', 'plugins/my_plugin/', 'shama/my_plugin'),
287
  array('kirby-plugin', 'site/plugins/my_plugin/', 'shama/my_plugin'),
288
  array('kohana-module', 'modules/my_package/', 'shama/my_package'),
 
 
 
 
 
 
 
 
289
  array('laravel-library', 'libraries/my_package/', 'shama/my_package'),
290
  array('lavalite-theme', 'public/themes/my_theme/', 'shama/my_theme'),
291
- array('lavalite-package', 'packages/my_package/', 'shama/my_package'),
292
  array('lithium-library', 'libraries/li3_test/', 'user/li3_test'),
293
  array('magento-library', 'lib/foo/', 'test/foo'),
294
  array('modxevo-snippet', 'assets/snippets/my_snippet/', 'shama/my_snippet'),
@@ -351,6 +371,7 @@ class InstallerTest extends TestCase
351
  array('typo3-flow-package', 'Packages/Application/my_package/', 'shama/my_package'),
352
  array('typo3-flow-build', 'Build/my_package/', 'shama/my_package'),
353
  array('typo3-cms-extension', 'typo3conf/ext/my_extension/', 'shama/my_extension'),
 
354
  array('vanilla-plugin', 'plugins/my_plugin/', 'shama/my_plugin'),
355
  array('vanilla-theme', 'themes/my_theme/', 'shama/my_theme'),
356
  array('whmcs-gateway', 'modules/gateways/gateway_name/', 'vendor/gateway_name'),
@@ -366,6 +387,9 @@ class InstallerTest extends TestCase
366
  array('phifty-library', 'libraries/my-lib/', 'shama/my-lib'),
367
  array('phifty-framework', 'frameworks/my-framework/', 'shama/my-framework'),
368
  array('yawik-module', 'module/MyModule/', 'shama/my_module'),
 
 
 
369
  );
370
  }
371
 
124
  array('ee2-addon', true),
125
  array('elgg-plugin', true),
126
  array('eliasis-module', true),
127
+ array('ezplatform-assets', true),
128
+ array('ezplatform-meta-assets', true),
129
  array('fuel-module', true),
130
  array('fuel-package', true),
131
  array('fuel-theme', true),
140
  array('kanboard-plugin', true),
141
  array('kirby-plugin', true),
142
  array('kohana-module', true),
143
+ array('lms-plugin', true),
144
+ array('lms-template', true),
145
+ array('lms-document-template', true),
146
+ array('lms-userpanel-module', true),
147
  array('laravel-library', true),
148
  array('lavalite-theme', true),
149
  array('lavalite-package', true),
198
  array('tusk-asset', true),
199
  array('typo3-flow-plugin', true),
200
  array('typo3-cms-extension', true),
201
+ array('userfrosting-sprinkle', true),
202
  array('vanilla-plugin', true),
203
  array('vanilla-theme', true),
204
  array('whmcs-gateway', true),
214
  array('phifty-bundle', true),
215
  array('phifty-library', true),
216
  array('phifty-framework', true),
217
+ array('osclass-plugin', true),
218
+ array('osclass-theme', true),
219
+ array('osclass-language', true),
220
  );
221
  }
222
 
282
  array('ee3-theme', 'themes/user/ee_package/', 'author/ee_package'),
283
  array('ee2-addon', 'system/expressionengine/third_party/ee_theme/', 'author/ee_theme'),
284
  array('ee2-theme', 'themes/third_party/ee_package/', 'author/ee_package'),
285
+ array('ezplatform-assets', 'web/assets/ezplatform/ezplatform_comp/', 'author/ezplatform_comp'),
286
+ array('ezplatform-meta-assets', 'web/assets/ezplatform/', 'author/ezplatform_comp'),
287
  array('fuel-module', 'fuel/app/modules/module/', 'fuel/module'),
288
  array('fuel-package', 'fuel/packages/orm/', 'fuel/orm'),
289
  array('fuel-theme', 'fuel/app/themes/theme/', 'fuel/theme'),
298
  array('kanboard-plugin', 'plugins/my_plugin/', 'shama/my_plugin'),
299
  array('kirby-plugin', 'site/plugins/my_plugin/', 'shama/my_plugin'),
300
  array('kohana-module', 'modules/my_package/', 'shama/my_package'),
301
+ array('lms-plugin', 'plugins/MyPackage/', 'shama/MyPackage'),
302
+ array('lms-plugin', 'plugins/MyPackage/', 'shama/my_package'),
303
+ array('lms-template', 'templates/MyPackage/', 'shama/MyPackage'),
304
+ array('lms-template', 'templates/MyPackage/', 'shama/my_package'),
305
+ array('lms-document-template', 'documents/templates/MyPackage/', 'shama/MyPackage'),
306
+ array('lms-document-template', 'documents/templates/MyPackage/', 'shama/my_package'),
307
+ array('lms-userpanel-module', 'userpanel/modules/MyPackage/', 'shama/MyPackage'),
308
+ array('lms-userpanel-module', 'userpanel/modules/MyPackage/', 'shama/my_package'),
309
  array('laravel-library', 'libraries/my_package/', 'shama/my_package'),
310
  array('lavalite-theme', 'public/themes/my_theme/', 'shama/my_theme'),
311
+ array('lavalite-package', 'packages/my_group/my_package/', 'my_group/my_package'),
312
  array('lithium-library', 'libraries/li3_test/', 'user/li3_test'),
313
  array('magento-library', 'lib/foo/', 'test/foo'),
314
  array('modxevo-snippet', 'assets/snippets/my_snippet/', 'shama/my_snippet'),
371
  array('typo3-flow-package', 'Packages/Application/my_package/', 'shama/my_package'),
372
  array('typo3-flow-build', 'Build/my_package/', 'shama/my_package'),
373
  array('typo3-cms-extension', 'typo3conf/ext/my_extension/', 'shama/my_extension'),
374
+ array('userfrosting-sprinkle', 'app/sprinkles/my_sprinkle/', 'shama/my_sprinkle'),
375
  array('vanilla-plugin', 'plugins/my_plugin/', 'shama/my_plugin'),
376
  array('vanilla-theme', 'themes/my_theme/', 'shama/my_theme'),
377
  array('whmcs-gateway', 'modules/gateways/gateway_name/', 'vendor/gateway_name'),
387
  array('phifty-library', 'libraries/my-lib/', 'shama/my-lib'),
388
  array('phifty-framework', 'frameworks/my-framework/', 'shama/my-framework'),
389
  array('yawik-module', 'module/MyModule/', 'shama/my_module'),
390
+ array('osclass-plugin', 'oc-content/plugins/sample_plugin/', 'test/sample_plugin'),
391
+ array('osclass-theme', 'oc-content/themes/sample_theme/', 'test/sample_theme'),
392
+ array('osclass-language', 'oc-content/languages/sample_lang/', 'test/sample_lang'),
393
  );
394
  }
395