cloudinary 1.1.3 → 1.1.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 8c84e7c9af68c85ecdeb1ddd30697cb955f9adec
4
- data.tar.gz: d5cfea39e3837d16d2263219c0f659646744c7e8
3
+ metadata.gz: 40c8821125bf4aa673a4e681867b3544f6a07b8f
4
+ data.tar.gz: 8093407d979244579abefcdff28b689a1ede0911
5
5
  SHA512:
6
- metadata.gz: fde41b6bacc1124a5fc422bceb62a8ba2816092b9449bb7520c86f34e6740dd72985b528d7102246d262a50d43e372c6519b9e7ba4a39536866d1cb575efa39f
7
- data.tar.gz: 869ad3bc70bf3d16dfd448da4de2c9e950e0891547cae4583308a0892f49962001e5a82809a1877003d2659eac84cbfe961603743720853b4809241e132c454d
6
+ metadata.gz: 4b99e1b9657ce647e83af64300d134da80fe46e8cf22f0e379b966b7d548f2a004c659ebce923805aeedcdb32031d131e06bcffc8db7c1003546cafd02d8b647
7
+ data.tar.gz: 494b6a5c1934cd0074047c37f6d9ee1e4506c08f97d9db02706b71dee4a970c23c710bf91f43a1b67509793a7a7780597cf8f01a80f3bde7b9f5e1699caae0ce
data/CHANGELOG.md CHANGED
@@ -1,4 +1,17 @@
1
1
 
2
+ 1.1.4 / 2016-03-22
3
+ ==================
4
+
5
+ New functionality and features
6
+ ------------------------------
7
+
8
+ * Add conditional transformation
9
+
10
+ Other Changes
11
+ -------------
12
+
13
+ * Fix direct upload in the sample project
14
+
2
15
  1.1.3 / 2016-03-16
3
16
  ==================
4
17
 
@@ -10,7 +10,24 @@ class Cloudinary::Utils
10
10
  # @deprecated Use Cloudinary::SHARED_CDN
11
11
  SHARED_CDN = Cloudinary::SHARED_CDN
12
12
  DEFAULT_RESPONSIVE_WIDTH_TRANSFORMATION = {:width => :auto, :crop => :limit}
13
-
13
+ CONDITIONAL_OPERATORS = {
14
+ "=" => 'eq',
15
+ "!=" => 'ne',
16
+ "<" => 'lt',
17
+ ">" => 'gt',
18
+ "<=" => 'lte',
19
+ ">=" => 'gte',
20
+ "&&" => 'and',
21
+ "||" => 'or'
22
+ }
23
+
24
+ CONDITIONAL_PARAMETERS = {
25
+ "width" => "w",
26
+ "height" => "h",
27
+ "aspect_ratio" => "ar",
28
+ "page_count" => "pc",
29
+ "face_count" => "fc"
30
+ }
14
31
  # Warning: options are being destructively updated!
15
32
  def self.generate_transformation_string(options={}, allow_implicit_crop_mode = false)
16
33
  # allow_implicit_crop_mode was added to support height and width parameters without specifying a crop mode.
@@ -75,6 +92,7 @@ class Cloudinary::Utils
75
92
 
76
93
  overlay = process_layer(options.delete(:overlay))
77
94
  underlay = process_layer(options.delete(:underlay))
95
+ ifValue = process_if(options.delete(:if))
78
96
 
79
97
  params = {
80
98
  :a => angle,
@@ -125,9 +143,11 @@ class Cloudinary::Utils
125
143
  params[range_value] = norm_range_value params[range_value] if params[range_value].present?
126
144
  end
127
145
 
128
- transformation = params.reject{|_k,v| v.blank?}.map{|k,v| "#{k}_#{v}"}.sort.join(",")
129
146
  raw_transformation = options.delete(:raw_transformation)
130
- transformation = [transformation, raw_transformation].reject(&:blank?).join(",")
147
+ transformation = params.reject{|_k,v| v.blank?}.map{|k,v| "#{k}_#{v}"}.sort
148
+ transformation = transformation.join(",")
149
+ transformation = [ifValue, transformation, raw_transformation].reject(&:blank?).join(",")
150
+
131
151
  transformations = base_transformations << transformation
132
152
  if responsive_width
133
153
  responsive_width_transformation = Cloudinary.config.responsive_width_transformation || DEFAULT_RESPONSIVE_WIDTH_TRANSFORMATION
@@ -144,6 +164,21 @@ class Cloudinary::Utils
144
164
  transformations.reject(&:blank?).join("/")
145
165
  end
146
166
 
167
+ # Parse "if" parameter
168
+ # Translates the condition if provided.
169
+ # @return [string] "if_" + ifValue
170
+ # @private
171
+ def self.process_if(ifValue)
172
+ if ifValue
173
+ ifValue = ifValue.gsub(
174
+ /(#{CONDITIONAL_PARAMETERS.keys.join("|")}|[=<>&|!]+)/,
175
+ CONDITIONAL_PARAMETERS.merge(CONDITIONAL_OPERATORS))
176
+ .gsub(/[ _]+/, "_")
177
+
178
+ ifValue = "if_" + ifValue
179
+ end
180
+ end
181
+
147
182
  # Parse layer options
148
183
  # @return [string] layer transformation string
149
184
  # @private
@@ -1,4 +1,4 @@
1
1
  # Copyright Cloudinary
2
2
  module Cloudinary
3
- VERSION = "1.1.3"
3
+ VERSION = "1.1.4"
4
4
  end
data/spec/utils_spec.rb CHANGED
@@ -391,13 +391,13 @@ describe Cloudinary::Utils do
391
391
  describe param do
392
392
  let(:root_path) { "http://res.cloudinary.com/#{cloud_name}" }
393
393
  let(:layers_options) { [
394
- # [name, options, result]
395
- ["string", "text:hello", "text:hello"],
396
- ["public_id", { "public_id" => "logo" }, "logo"],
397
- ["public_id with folder", { "public_id" => "folder/logo" }, "folder:logo"],
398
- ["private", { "public_id" => "logo", "type" => "private" }, "private:logo"],
399
- ["format", { "public_id" => "logo", "format" => "png" }, "logo.png"],
400
- ["video", { "resource_type" => "video", "public_id" => "cat" }, "video:cat"],
394
+ # [name, options, result]
395
+ ["string", "text:hello", "text:hello"],
396
+ ["public_id", { "public_id" => "logo" }, "logo"],
397
+ ["public_id with folder", { "public_id" => "folder/logo" }, "folder:logo"],
398
+ ["private", { "public_id" => "logo", "type" => "private" }, "private:logo"],
399
+ ["format", { "public_id" => "logo", "format" => "png" }, "logo.png"],
400
+ ["video", { "resource_type" => "video", "public_id" => "cat" }, "video:cat"],
401
401
  ] }
402
402
  it "should support #{param}" do
403
403
  layers_options.each do |name, options, result|
@@ -667,5 +667,69 @@ describe Cloudinary::Utils do
667
667
  expect(Cloudinary::Utils.encode_double_array([[1, 2, 3, 4], [5, 6, 7, 8]])).to eq("1,2,3,4|5,6,7,8")
668
668
  end
669
669
 
670
+ describe ":if" do
671
+ describe 'with literal condition string' do
672
+ it "should include the if parameter as the first component in the transformation string" do
673
+ expect(["sample", { if: "w_lt_200", crop: "fill", height: 120, width: 80 }])
674
+ .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/sample")
675
+ expect(["sample", { crop: "fill", height: 120, if: "w_lt_200", width: 80 }])
676
+ .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/sample")
670
677
 
678
+ end
679
+ it "should allow multiple conditions when chaining transformations " do
680
+ expect(["sample", transformation: [{ if: "w_lt_200", crop: "fill", height: 120, width: 80 },
681
+ { if: "w_gt_400", crop: "fit", width: 150, height: 150 },
682
+ { effect: "sepia" }]])
683
+ .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/if_w_gt_400,c_fit,h_150,w_150/e_sepia/sample")
684
+ end
685
+
686
+ describe "including spaces and operators" do
687
+ it "should translate operators" do
688
+ expect(["sample", { if: "w < 200", crop: "fill", height: 120, width: 80 }])
689
+ .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/sample")
690
+ end
691
+ end
692
+
693
+ describe 'if end' do
694
+ it "should include the if_end as the last parameter in its component" do
695
+ expect(["sample", transformation: [{ if: "w_lt_200" },
696
+ { crop: "fill", height: 120, width: 80, effect: "sharpen" },
697
+ { effect: "brightness:50" },
698
+ { effect: "shadow", color: "red" },
699
+ { if: "end" }]])
700
+ .to produce_url("#{upload_path}/if_w_lt_200/c_fill,e_sharpen,h_120,w_80/e_brightness:50/co_red,e_shadow/if_end/sample")
701
+ end
702
+ it "should support if_else with transformation parameters" do
703
+ expect(["sample", transformation: [{ if: "w_lt_200", crop: "fill", height: 120, width: 80 },
704
+ { if: "else", crop: "fill", height: 90, width: 100 }]])
705
+ .to produce_url("#{upload_path}/if_w_lt_200,c_fill,h_120,w_80/if_else,c_fill,h_90,w_100/sample")
706
+ end
707
+ it "if_else should be without any transformation parameters" do
708
+ expect(["sample", transformation: [{ if: "w_lt_200" },
709
+ { crop: "fill", height: 120, width: 80 },
710
+ { if: "else" },
711
+ { crop: "fill", height: 90, width: 100 }]])
712
+ .to produce_url("#{upload_path}/if_w_lt_200/c_fill,h_120,w_80/if_else/c_fill,h_90,w_100/sample")
713
+ end
714
+ end
715
+ it "should support and translate operators: '=', '!=', '<', '>', '<=', '>=', '&&', '||'" do
716
+
717
+ allOperators =
718
+ 'if_' +
719
+ 'w_eq_0_and' +
720
+ '_w_ne_0_or' +
721
+ '_h_lt_0_and' +
722
+ '_ar_gt_0_and' +
723
+ '_pc_lte_0_and' +
724
+ '_fc_gte_0' +
725
+ ',e_grayscale'
726
+
727
+ expect( ["sample",
728
+ :if =>"width = 0 && w != 0 || height < 0 and aspect_ratio > 0 and page_count <= 0 and face_count >= 0",
729
+ :effect =>"grayscale"])
730
+ .to produce_url("#{upload_path}/#{allOperators}/sample")
731
+ end
732
+
733
+ end
734
+ end
671
735
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  /**
3
- * Cloudinary's JavaScript library - Version 2.0.7
3
+ * Cloudinary's JavaScript library - Version 2.0.8
4
4
  * Copyright Cloudinary
5
5
  * see https://github.com/cloudinary/cloudinary_js
6
6
  *
@@ -778,6 +778,19 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
778
778
  "||": 'or'
779
779
  };
780
780
 
781
+ Condition.PARAMETERS = {
782
+ "width": "w",
783
+ "height": "h",
784
+ "aspect_ratio": "ar",
785
+ "aspectRatio": "ar",
786
+ "page_count": "pc",
787
+ "pageCount": "pc",
788
+ "face_count": "fc",
789
+ "faceCount": "fc"
790
+ };
791
+
792
+ Condition.BOUNDRY = "[ _]+";
793
+
781
794
 
782
795
  /**
783
796
  * Represents a transformation condition
@@ -829,22 +842,12 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
829
842
  */
830
843
 
831
844
  Condition.prototype.normalize = function(value) {
832
- var list, v;
833
- list = value.split(/[ _]+/);
834
- list = (function() {
835
- var j, len, results;
836
- results = [];
837
- for (j = 0, len = list.length; j < len; j++) {
838
- v = list[j];
839
- if (Condition.OPERATORS[v] != null) {
840
- results.push(Condition.OPERATORS[v]);
841
- } else {
842
- results.push(v);
843
- }
844
- }
845
- return results;
846
- })();
847
- return list.join('_');
845
+ var replaceRE;
846
+ replaceRE = new RegExp("(" + Object.keys(Condition.PARAMETERS).join("|") + "|[=<>&|!]+)", "g");
847
+ value = value.replace(replaceRE, function(match) {
848
+ return Condition.OPERATORS[match] || Condition.PARAMETERS[match];
849
+ });
850
+ return value.replace(/[ _]+/g, '_');
848
851
  };
849
852
 
850
853
 
@@ -969,8 +972,8 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
969
972
  * @return {Condition} this condition
970
973
  */
971
974
 
972
- Condition.prototype.pages = function(operator, value) {
973
- return this.predicate("pg", operator, value);
975
+ Condition.prototype.pageCount = function(operator, value) {
976
+ return this.predicate("pc", operator, value);
974
977
  };
975
978
 
976
979
 
@@ -981,8 +984,8 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
981
984
  * @return {Condition} this condition
982
985
  */
983
986
 
984
- Condition.prototype.faces = function(operator, value) {
985
- return this.predicate("faces", operator, value);
987
+ Condition.prototype.faceCount = function(operator, value) {
988
+ return this.predicate("fc", operator, value);
986
989
  };
987
990
 
988
991
  return Condition;
@@ -1859,12 +1862,12 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
1859
1862
 
1860
1863
  DEFAULT_CONFIGURATION_PARAMS = {
1861
1864
  responsive_class: 'cld-responsive',
1862
- responsive_use_stoppoints: true,
1865
+ responsive_use_breakpoints: true,
1863
1866
  round_dpr: true,
1864
1867
  secure: (typeof window !== "undefined" && window !== null ? (ref = window.location) != null ? ref.protocol : void 0 : void 0) === 'https:'
1865
1868
  };
1866
1869
 
1867
- Configuration.CONFIG_PARAMS = ["api_key", "api_secret", "cdn_subdomain", "cloud_name", "cname", "private_cdn", "protocol", "resource_type", "responsive_class", "responsive_use_stoppoints", "responsive_width", "round_dpr", "secure", "secure_cdn_subdomain", "secure_distribution", "shorten", "type", "url_suffix", "use_root_path", "version"];
1870
+ Configuration.CONFIG_PARAMS = ["api_key", "api_secret", "cdn_subdomain", "cloud_name", "cname", "private_cdn", "protocol", "resource_type", "responsive_class", "responsive_use_breakpoints", "responsive_width", "round_dpr", "secure", "secure_cdn_subdomain", "secure_distribution", "shorten", "type", "url_suffix", "use_root_path", "version"];
1868
1871
 
1869
1872
 
1870
1873
  /**
@@ -2471,7 +2474,7 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
2471
2474
  Cloudinary = (function() {
2472
2475
  var AKAMAI_SHARED_CDN, CF_SHARED_CDN, DEFAULT_POSTER_OPTIONS, DEFAULT_VIDEO_SOURCE_TYPES, OLD_AKAMAI_SHARED_CDN, SHARED_CDN, VERSION, absolutize, applyBreakpoints, cdnSubdomainNumber, closestAbove, cloudinaryUrlPrefix, defaultBreakpoints, finalizeResourceType, parentWidth;
2473
2476
 
2474
- VERSION = "2.0.7";
2477
+ VERSION = "2.0.8";
2475
2478
 
2476
2479
  CF_SHARED_CDN = "d3jpl91pxevbkh.cloudfront.net";
2477
2480
 
@@ -3651,7 +3654,7 @@ var extend = function(child, parent) { for (var key in parent) { if (hasProp.cal
3651
3654
  ImageTag: ImageTag,
3652
3655
  VideoTag: VideoTag,
3653
3656
  Cloudinary: Cloudinary,
3654
- VERSION: "2.0.7",
3657
+ VERSION: "2.0.8",
3655
3658
  CloudinaryJQuery: CloudinaryJQuery
3656
3659
  };
3657
3660
  return cloudinary;
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudinary
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.1.3
4
+ version: 1.1.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nadav Soferman
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-03-16 00:00:00.000000000 Z
13
+ date: 2016-03-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws_cf_signer