Skip to content

Commit 056f347

Browse files
author
Nir Maoz
authored
Add focusOn to/from json (#480)
1 parent 4602946 commit 056f347

File tree

6 files changed

+119
-22
lines changed

6 files changed

+119
-22
lines changed

__TESTS_BUNDLE_SIZE__/bundleSizeTestCases.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ const bundleSizeTestCases:ITestCase[] = [
3434
},
3535
{
3636
name: 'Tests CloudinaryImage with Resize, Adjust and Border',
37-
sizeLimitInKB: 25,
37+
sizeLimitInKB: 26,
3838
importsArray: [
3939
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
4040
importFromDist('instance/Cloudinary', 'Cloudinary'),
@@ -45,7 +45,7 @@ const bundleSizeTestCases:ITestCase[] = [
4545
},
4646
{
4747
name: 'Tests CloudinaryImage image with Resize, adjust and delivery',
48-
sizeLimitInKB: 26,
48+
sizeLimitInKB: 27,
4949
importsArray: [
5050
importFromDist('assets/CloudinaryImage', 'CloudinaryImage'),
5151
importFromDist('instance/Cloudinary', 'Cloudinary'),
@@ -88,7 +88,7 @@ const bundleSizeTestCases:ITestCase[] = [
8888
},
8989
{
9090
name: 'Import All Actions',
91-
sizeLimitInKB: 37,
91+
sizeLimitInKB: 38,
9292
importsArray: [
9393
importFromPackage('Actions')
9494
]

__TESTS__/unit/fromJson/resize.fromJson.test.ts

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,21 @@ describe('resize.fromJson', () => {
2828
{object: 'cat', avoid: true}
2929
]
3030
}
31+
},
32+
{
33+
actionType: 'crop',
34+
dimensions: {width: 200},
35+
gravity: {
36+
gravityType: 'object',
37+
focusOnObjects: ['dog'],
38+
fallbackGravity: {
39+
gravityType: 'auto',
40+
autoFocus: [
41+
{object: 'bird', weight: 30},
42+
{object: 'cat', avoid: true}
43+
]
44+
}
45+
}
3146
}
3247
]);
3348

@@ -44,6 +59,7 @@ describe('resize.fromJson', () => {
4459
'b_white,c_lpad,fl_relative,g_south,w_100,x_3,y_4',
4560
'b_white,c_mpad,fl_relative,g_south,w_100,x_3,y_4',
4661
'c_crop,g_auto:person_100:cat_avoid,w_200',
62+
'c_crop,g_dog:auto:bird_30:cat_avoid,w_200',
4763
].join('/'));
4864
});
4965

__TESTS__/unit/toJson/resize.toJson.test.ts

Lines changed: 43 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -160,26 +160,58 @@ describe('resize.toJson()', () => {
160160
]);
161161
});
162162

163-
it('should generate auto gravity model', ()=>{
164-
const gravity = Gravity.autoGravity().autoFocus(
165-
AutoFocus.focusOn(FocusOn.person()).weight(100),
166-
AutoFocus.focusOn(FocusOn.cat()).weight(50).avoid()
167-
);
168-
163+
it('should generate auto gravity model', () => {
169164
const transformation = new Transformation()
170-
.addAction(Resize.crop(200).gravity(gravity));
165+
.addAction(Resize.crop(200).gravity(Gravity.autoGravity().autoFocus(
166+
AutoFocus.focusOn(FocusOn.person()).weight(100),
167+
AutoFocus.focusOn(FocusOn.cat()).weight(50).avoid()
168+
)));
171169

172170
const model = transformation.toJson();
173171

174172
expect(model).toStrictEqual([
175173
{
176-
"actionType": "crop", "dimensions": {"width": 200}, "gravity": {
177-
"autoFocus": [
178-
{"object": "person", "weight": 100},
179-
{"object": "cat", "avoid": true}
174+
actionType: "crop",
175+
dimensions: {width: 200},
176+
gravity: {
177+
gravityType: 'auto',
178+
autoFocus: [
179+
{object: "person", weight: 100},
180+
{object: "cat", avoid: true}
180181
]
181182
}
182183
}
183184
]);
184185
});
186+
187+
it('should generate focusOnGravity model', () => {
188+
const transformation = new Transformation()
189+
.addAction(Resize.crop(200).gravity(
190+
Gravity.focusOn(FocusOn.cat(), FocusOn.dog()).fallbackGravity(
191+
Gravity.autoGravity().autoFocus(
192+
AutoFocus.focusOn(FocusOn.microwave()).weight(30),
193+
AutoFocus.focusOn(FocusOn.bicycle()).avoid()
194+
)
195+
)));
196+
197+
const model = transformation.toJson();
198+
199+
expect(model).toStrictEqual([
200+
{
201+
actionType: 'crop',
202+
dimensions: {width: 200},
203+
gravity: {
204+
gravityType: 'object',
205+
focusOnObjects: ['cat', 'dog'],
206+
fallbackGravity: {
207+
gravityType: 'auto',
208+
autoFocus: [
209+
{object: 'microwave', weight: 30},
210+
{object: 'bicycle', avoid: true}
211+
]
212+
}
213+
}
214+
}
215+
]);
216+
});
185217
});

src/actions/resize/ResizeAdvancedAction.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import {ResizeSimpleAction} from "./ResizeSimpleAction.js";
22
import {IGravity} from "../../qualifiers/gravity/GravityQualifier.js";
33
import {Qualifier} from "../../internal/qualifier/Qualifier.js";
44
import {IActionModel} from "../../internal/models/IActionModel.js";
5-
import {createGravityModel} from "../../internal/models/createGravityModel.js";
5+
import {createGravityModel, IGravityModel} from "../../internal/models/createGravityModel.js";
66
import {createGravityFromModel} from "../../internal/models/createGravityFromModel.js";
77
import {IResizeAdvancedActionModel} from "../../internal/models/IResizeAdvancedActionModel.js";
88

@@ -30,7 +30,7 @@ class ResizeAdvancedAction extends ResizeSimpleAction{
3030
const result = super.fromJson.apply(this, [actionModel]);
3131

3232
if (actionModel.gravity) {
33-
result.gravity(createGravityFromModel(actionModel.gravity));
33+
result.gravity(createGravityFromModel(actionModel.gravity as IGravityModel));
3434
}
3535

3636
return result;

src/internal/models/createGravityFromModel.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import {
22
IAutoGravityModel,
33
IAutoGravityObjectModel,
4-
ICompassGravityModel,
4+
ICompassGravityModel, IFocusOnGravityModel,
55
IGravityModel,
66
IOcrGravityModel
77
} from "./createGravityModel.js";
@@ -10,6 +10,7 @@ import {autoGravity, focusOn} from "../../qualifiers/gravity.js";
1010
import {FocusOnValue, ocr} from "../../qualifiers/focusOn.js";
1111
import {AutoGravity} from "../../qualifiers/gravity/autoGravity/AutoGravity.js";
1212
import {AutoFocus} from "../../qualifiers/autoFocus.js";
13+
import {FocusOnGravity} from "../../qualifiers/gravity/focusOnGravity/FocusOnGravity.js";
1314

1415
/**
1516
* Validates that gravityModel is an ICompassGravityModel
@@ -59,6 +60,22 @@ function createAutoGravityFromModel(gravityModel: IAutoGravityModel): AutoGravit
5960
return autoGravity().autoFocus(...autoFocus);
6061
}
6162

63+
/**
64+
* Create FocusOnGravity from given IFocusOnGravityModel
65+
* @param gravityModel
66+
*/
67+
function createFocusOnGravityFromModel(gravityModel: IFocusOnGravityModel): FocusOnGravity {
68+
const focusOnObjects = (gravityModel.focusOnObjects || []).map((str) => new FocusOnValue(str));
69+
const result = focusOn(...focusOnObjects);
70+
71+
if (gravityModel.fallbackGravity) {
72+
const autoGravity = createAutoGravityFromModel(gravityModel.fallbackGravity);
73+
result.fallbackGravity(autoGravity);
74+
}
75+
76+
return result;
77+
}
78+
6279
/**
6380
* Create gravity instance from given gravity model
6481
* @param gravityModel
@@ -75,6 +92,8 @@ function createGravityFromModel(gravityModel: IGravityModel): IGravity {
7592
if (isAutoGravityModel(gravityModel)) {
7693
return createAutoGravityFromModel(gravityModel);
7794
}
95+
96+
return createFocusOnGravityFromModel(gravityModel);
7897
}
7998

8099
export {createGravityFromModel};

src/internal/models/createGravityModel.ts

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import {IGravity} from "../../qualifiers/gravity/GravityQualifier.js";
22
import {CompassGravity, ICompassGravity} from "../../qualifiers/gravity/compassGravity/CompassGravity.js";
33
import {AutoGravity} from "../../qualifiers/gravity/autoGravity/AutoGravity.js";
44
import {AutoFocus} from "../../qualifiers/autoFocus.js";
5+
import {FocusOnGravity} from "../../qualifiers/gravity/focusOnGravity/FocusOnGravity.js";
6+
import {autoGravity} from "../../qualifiers/gravity.js";
57

68
export interface IGravityModel {
7-
gravityType?: string;
9+
gravityType: string;
810
}
911

1012
export interface ICompassGravityModel extends IGravityModel {
@@ -26,7 +28,7 @@ export interface IAutoGravityModel extends IGravityModel {
2628

2729
export interface IFocusOnGravityModel extends IGravityModel {
2830
focusOnObjects: string[], // 'cat' | 'dog' etc
29-
fallbackGravity: IAutoGravityModel
31+
fallbackGravity?: IAutoGravityModel
3032
}
3133

3234
/**
@@ -109,15 +111,41 @@ function createIAutoFocusObject(gravity: AutoFocus): IAutoGravityObjectModel {
109111
* Creates an auto gravity model from given AutoGravity
110112
* @param gravity
111113
*/
112-
function createAutoGravityModel(gravity: AutoGravity): IAutoGravityModel {
113-
const values = gravity.qualifierValue.values.filter((v) => v !== 'auto');
114+
function createAutoGravityModel(gravity: 'auto' | AutoGravity): IAutoGravityModel {
115+
const gravityQualifier = gravity === 'auto' ? new AutoGravity() : gravity;
116+
const values = gravityQualifier.qualifierValue.values.filter((v) => v !== 'auto');
114117
const autoFocus = values.map(createIAutoFocusObject);
115118

116119
return {
120+
gravityType: 'auto',
117121
autoFocus
118122
};
119123
}
120124

125+
/**
126+
* Create IFocusOnGravityModel from FocusOnGravity
127+
* @param gravity
128+
*/
129+
function createFocusOnGravityModel(gravity: FocusOnGravity): IFocusOnGravityModel {
130+
const hasAutoGravity = `${gravity}`.split(':').includes('auto');
131+
const values = gravity.qualifierValue.values;
132+
const focusOnValues = hasAutoGravity ? values.slice(0, values.length - 1) : values;
133+
134+
const result: IFocusOnGravityModel = {
135+
gravityType: 'object',
136+
focusOnObjects: focusOnValues.map((v) => `${v}`)
137+
};
138+
139+
if (hasAutoGravity) {
140+
// Remove the first 'auto' value by slicing it, because it's added by autoGravity()
141+
const autoFocusObjects = values[values.length -1].values.slice(1);
142+
const autoGravityInstance = autoGravity().autoFocus(...autoFocusObjects);
143+
result.fallbackGravity = createAutoGravityModel(autoGravityInstance);
144+
}
145+
146+
return result;
147+
}
148+
121149
/**
122150
* Create a model of given gravity
123151
* @param gravity
@@ -131,7 +159,9 @@ export function createGravityModel(gravity: IGravity): IGravityModel {
131159
return createOcrGravityModel();
132160
}
133161

134-
if (isAutoGravity(gravity)) {
162+
if (gravity === 'auto' || isAutoGravity(gravity)){
135163
return createAutoGravityModel(gravity);
136164
}
165+
166+
return createFocusOnGravityModel(gravity as FocusOnGravity);
137167
}

0 commit comments

Comments
 (0)