Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 43 additions & 0 deletions api/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,47 @@
## 2.0.0

### Breaking Changes

- **Package structure migrated to follow Dart conventions**
- All public APIs now exported through main `lib/cloudinary_api.dart` file
- Internal implementation moved to `lib/src/` (private by convention)
- Models consolidated in `lib/src/models/` directory
- Uploader implementation consolidated in `lib/src/uploader/`

### Migration Guide

**Before:**

```dart
import 'package:cloudinary_api/uploader/cloudinary_uploader.dart';
import 'package:cloudinary_api/src/request/model/uploader_params.dart';
import 'package:cloudinary_api/src/response/upload_result.dart';
```

**After:**

```dart
import 'package:cloudinary_api/cloudinary_api.dart';
// All public APIs are now available through the main import
```

### What Changed

- `lib/uploader/` → consolidated into `lib/src/uploader/`
- `lib/src/request/model/` → moved to `lib/src/models/`
- `lib/src/response/` → moved to `lib/src/models/`
- All models and public classes now properly exported through main library file
- Internal APIs remain accessible but use `lib/src/` imports explicitly

### Benefits

- Cleaner public API surface
- Better IDE autocomplete and documentation
- Follows official Dart package conventions
- Clearer separation between public and internal APIs

## 1.1.1

- Fix API parameters signature

## 1.1.0
Expand Down
File renamed without changes.
36 changes: 36 additions & 0 deletions api/lib/cloudinary_api.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
/// Cloudinary API Library
///
/// A Dart SDK for uploading and managing media assets with Cloudinary.
library cloudinary_api;

// Uploader
export 'src/uploader/cloudinary_uploader.dart';
export 'src/uploader/uploader.dart';
export 'src/uploader/uploader_response.dart';

// Models - Requests
export 'src/models/upload_request.dart';
export 'src/models/uploader_request.dart';
export 'src/models/payload.dart';

// Models - Responses
export 'src/models/upload_result.dart';
export 'src/models/upload_error.dart';

// Models - Params
export 'src/models/uploader_params.dart';
export 'src/models/params/access_control_rule.dart';
export 'src/models/params/coordinates.dart';
export 'src/models/params/eager_transformation.dart';
export 'src/models/params/resource_type.dart';
export 'src/models/params/responsive_breakpoint.dart';

// Abstract interfaces
export 'src/uploader/abstract_uploader_request.dart';

// Utilities
export 'src/uploader/utils.dart';

// HTTP types (for callbacks)
export 'src/http/request/multi_part_request.dart'
show ProgressCallback, CompletionCallback;
4 changes: 2 additions & 2 deletions api/lib/src/http/request/multi_part_request.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ import 'dart:async';

import 'package:http/http.dart' as http;

import '../../../uploader/uploader_response.dart';
import '../../response/upload_result.dart';
import '../../uploader/uploader_response.dart';
import '../../models/upload_result.dart';

typedef ProgressCallback = void Function(int bytesUploaded, int totalBytes);
typedef CompletionCallback = void Function(
Expand Down
3 changes: 1 addition & 2 deletions api/lib/src/http/session/network_delegate.dart
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
import 'package:cloudinary_api/src/request/model/uploader_params.dart';
import 'package:cloudinary_api/uploader/utils.dart';
import 'package:cloudinary_api/src/uploader/utils.dart';
import 'package:cloudinary_url_gen/cloudinary.dart';

import 'package:http/http.dart' as http;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:cloudinary_url_gen/transformation/transformation.dart';
import 'package:cloudinary_url_gen/cloudinary.dart';

class EagerTransformation {
Transformation transformation;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import 'package:cloudinary_url_gen/transformation/transformation.dart';
import 'package:cloudinary_url_gen/cloudinary.dart';

class ResponsiveBreakpoint {
bool? createDerived;
Expand Down
File renamed without changes.
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import '../../uploader/abstract_uploader_request.dart';
import '../response/upload_result.dart';
import '../uploader/abstract_uploader_request.dart';
import 'upload_result.dart';
import '../http/request/multi_part_request.dart';
import 'model/uploader_params.dart';
import 'uploader_params.dart';
import 'payload.dart';

class UploadRequest implements AbstractUploaderRequest<UploadResult> {
Expand All @@ -19,7 +19,7 @@ class UploadRequest implements AbstractUploaderRequest<UploadResult> {

@override
Map<String, dynamic> buildParams() {
var options = params?.buildParams() ?? <String, dynamic>{};
var options = params?.buildParams() ?? <String, dynamic>{};
options.removeWhere((key, value) => value == null);
return options;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import '../request/model/params/access_control_rule.dart';
import '../request/model/params/coordinates.dart';
import 'params/access_control_rule.dart';
import 'params/coordinates.dart';

abstract class BaseUploadResult {}

Expand Down Expand Up @@ -58,43 +58,43 @@ class UploadResult implements BaseUploadResult {

UploadResult(
{this.publicId,
this.version,
this.signature,
this.width,
this.height,
this.format,
this.resourceType,
this.createdAt,
this.tags,
this.pages,
this.bytes,
this.type,
this.etag,
this.placeholder,
this.url,
this.secureUrl,
this.folder,
this.accessMode,
this.originalFilename,
this.colors,
this.predominant,
this.eager,
this.status,
this.faces,
this.coordinates,
this.moderation,
this.responsiveBreakpoints,
this.accessControl,
this.qualityAnalysis,
this.cinemagraphAnalysis,
this.deleteToken,
this.context,
this.done,
this.accessibilityAnalysis,
this.imageMetadata,
this.video,
this.audio,
this.playbackUrl});
this.version,
this.signature,
this.width,
this.height,
this.format,
this.resourceType,
this.createdAt,
this.tags,
this.pages,
this.bytes,
this.type,
this.etag,
this.placeholder,
this.url,
this.secureUrl,
this.folder,
this.accessMode,
this.originalFilename,
this.colors,
this.predominant,
this.eager,
this.status,
this.faces,
this.coordinates,
this.moderation,
this.responsiveBreakpoints,
this.accessControl,
this.qualityAnalysis,
this.cinemagraphAnalysis,
this.deleteToken,
this.context,
this.done,
this.accessibilityAnalysis,
this.imageMetadata,
this.video,
this.audio,
this.playbackUrl});

factory UploadResult.fromJson(Map<String, dynamic> data) {
final publicId = data['public_id'] as String?;
Expand All @@ -106,7 +106,7 @@ class UploadResult implements BaseUploadResult {
final resourceType = data['resource_type'] as String?;
final createdAt = data['created_at'] as String?;
final tags =
(data['tags'] as List<dynamic>?)?.map((e) => e.toString()).toList();
(data['tags'] as List<dynamic>?)?.map((e) => e.toString()).toList();
final pages = data['version'] as int?;
final bytes = data['bytes'] as int?;
final type = data['type'] as String?;
Expand All @@ -121,7 +121,7 @@ class UploadResult implements BaseUploadResult {
?.map((value) => ResultColor.fromJson(value))
.toList();
final predominant = (data['predominant'] as Map<String, dynamic>?)?.map(
(key, value) => MapEntry(
(key, value) => MapEntry(
key,
(value as List<dynamic>)
.map((e) => ResultColor.fromJson(e))
Expand All @@ -131,16 +131,16 @@ class UploadResult implements BaseUploadResult {
.toList();
final status = data['status'] as String?;
final faces =
(data['faces'] != null) ? Coordinates.fromJson(data['faces']) : null;
(data['faces'] != null) ? Coordinates.fromJson(data['faces']) : null;
final coordinates = (data['coordinates'] as Map<String, dynamic>?)
?.map((key, value) => MapEntry(key, Coordinates.fromJson(value)));
final moderation = (data['moderation'] as List<dynamic>?)
?.map((value) => ResultModeration.fromJson(value))
.toList();
final responsiveBreakpoints =
(data['responsive_breakpoints'] as List<dynamic>?)
?.map((value) => ResultResponsiveBreakpoint.fromJson(value))
.toList();
(data['responsive_breakpoints'] as List<dynamic>?)
?.map((value) => ResultResponsiveBreakpoint.fromJson(value))
.toList();
final accessControl = (data['access_control'] as List<dynamic>?)
?.map((value) => AccessControlRule.fromJson(value))
.toList();
Expand Down Expand Up @@ -255,12 +255,12 @@ class ResultEager {

ResultEager(
{this.transformation,
this.width,
this.height,
this.bytes,
this.format,
this.url,
this.secureUrl});
this.width,
this.height,
this.bytes,
this.format,
this.url,
this.secureUrl});

factory ResultEager.fromJson(Map<String, dynamic> data) {
final transformation = data['transformation'] as String?;
Expand Down Expand Up @@ -314,10 +314,10 @@ class ResultAccessibilityAnalysis {

factory ResultAccessibilityAnalysis.fromJson(Map<String, dynamic> data) {
final colorblindAccessibilityAnalysis =
ResultColorblindAccessibilityScore.fromJson(
data['colorblind_accessibility_analysis']);
ResultColorblindAccessibilityScore.fromJson(
data['colorblind_accessibility_analysis']);
final colorblindAccessibilityScore =
data['colorblind_accessibility_score'] as double;
data['colorblind_accessibility_score'] as double;
return ResultAccessibilityAnalysis(
colorblindAccessibilityAnalysis, colorblindAccessibilityScore);
}
Expand All @@ -332,10 +332,10 @@ class AudioResultObject {

AudioResultObject(
{this.codec,
this.bitRate,
this.frequency,
this.channels,
this.channelLayout});
this.bitRate,
this.frequency,
this.channels,
this.channelLayout});

factory AudioResultObject.fromJson(Map<String, dynamic> data) {
final codec = data['codec'] as String?;
Expand Down Expand Up @@ -365,13 +365,13 @@ class VideoResultObject {

VideoResultObject(
{this.pixFormat,
this.codec,
this.level,
this.profile,
this.bitRate,
this.dar,
this.timeBase,
this.metadata});
this.codec,
this.level,
this.profile,
this.bitRate,
this.dar,
this.timeBase,
this.metadata});

factory VideoResultObject.fromJson(Map<String, dynamic> data) {
final pixFormat = data['pix_format'] as String?;
Expand Down Expand Up @@ -449,4 +449,4 @@ class ResultSingleBreakpointData {
final secureUrl = data['secure_url'] as String;
return ResultSingleBreakpointData(bytes, width, height, url, secureUrl);
}
}
}
Loading