Task: Add text formatter functions and updated for configurable from the latest
functions with future and async support and add tests and examples
This commit is contained in:
parent
65e6aac985
commit
7ec5118598
@ -1,3 +1,4 @@
|
|||||||
## 1.0.0
|
## 1.0.0
|
||||||
|
|
||||||
- Initial version.
|
- Configurable
|
||||||
|
- Text Formatter
|
||||||
|
21
LICENSE
Normal file
21
LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2021 CUBETIQ Solution
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
14
example/cubetiq_text_formatter_example.dart
Normal file
14
example/cubetiq_text_formatter_example.dart
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
import 'package:cubetiq/text.dart';
|
||||||
|
|
||||||
|
void main(List<String> args) {
|
||||||
|
var text1 = 'Hello, {0}, then do this it by {1}!';
|
||||||
|
var text2 = 'Hello, {firstName}, then do this it by {lastName}!';
|
||||||
|
var result1 = TextFormatter(text1).format(['Sambo', 'Chea']);
|
||||||
|
var result2 = TextFormatter(text2).decorate({
|
||||||
|
'firstName': 'Sambo',
|
||||||
|
'lastName': 'Chea',
|
||||||
|
});
|
||||||
|
|
||||||
|
print('Result 1 => $result1');
|
||||||
|
print('Result 2 => $result2');
|
||||||
|
}
|
@ -4,6 +4,11 @@ import 'system_config.dart';
|
|||||||
String? getConfigOrNull(String key, {String? defaultValue}) =>
|
String? getConfigOrNull(String key, {String? defaultValue}) =>
|
||||||
SystemConfig.getOrNull(key, defaultValue: defaultValue);
|
SystemConfig.getOrNull(key, defaultValue: defaultValue);
|
||||||
|
|
||||||
|
/// get config or null from system config in async
|
||||||
|
Future<String?> getConfigOrNullAsync(String key,
|
||||||
|
{String? defaultValue}) async =>
|
||||||
|
await SystemConfig.getOrNullAsync(key, defaultValue: defaultValue);
|
||||||
|
|
||||||
/// get config with non-null from system config
|
/// get config with non-null from system config
|
||||||
String getConfig(String key, {String? defaultValue}) =>
|
String getConfig(String key, {String? defaultValue}) =>
|
||||||
SystemConfig.get(key, defaultValue: defaultValue);
|
SystemConfig.get(key, defaultValue: defaultValue);
|
||||||
@ -11,5 +16,20 @@ String getConfig(String key, {String? defaultValue}) =>
|
|||||||
/// check has config key or not from system config
|
/// check has config key or not from system config
|
||||||
bool hasConfigkey(String key) => SystemConfig.containsKey(key);
|
bool hasConfigkey(String key) => SystemConfig.containsKey(key);
|
||||||
|
|
||||||
/// set config into memory
|
/// check has config key or not from system config in async function
|
||||||
|
Future<bool> hasConfigkeyAsync(String key) async =>
|
||||||
|
await SystemConfig.containsKeyAsync(key);
|
||||||
|
|
||||||
|
/// set config into memory or custom provider
|
||||||
void setConfig(String key, String? value) => SystemConfig.set(key, value);
|
void setConfig(String key, String? value) => SystemConfig.set(key, value);
|
||||||
|
|
||||||
|
/// set config into memory or custom provider in async function
|
||||||
|
Future<void> setConfigAsync(String key, String? value) async =>
|
||||||
|
await SystemConfig.setAsync(key, value);
|
||||||
|
|
||||||
|
/// remove config into memory or custom provider
|
||||||
|
void removeConfig(String key) => SystemConfig.remove(key);
|
||||||
|
|
||||||
|
/// remove config into memory or custom provider in async function
|
||||||
|
Future<void> removeConfigAsync(String key) async =>
|
||||||
|
await SystemConfig.removeAsync(key);
|
||||||
|
@ -8,4 +8,14 @@ abstract class ConfigurationProvider {
|
|||||||
|
|
||||||
/// get or null in implemented classes
|
/// get or null in implemented classes
|
||||||
String? getOrNull(String key, {String? defaultValue});
|
String? getOrNull(String key, {String? defaultValue});
|
||||||
|
|
||||||
|
/// check has key or not for async function
|
||||||
|
Future<bool> containsKeyAsync(String key) async {
|
||||||
|
return Future.value(containsKey(key));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// get or null for async function
|
||||||
|
Future<String?> getOrNullAsync(String key, {String? defaultValue}) async {
|
||||||
|
return Future.value(getOrNull(key, defaultValue: defaultValue));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,16 +4,42 @@ import 'configuration_provider.dart';
|
|||||||
///
|
///
|
||||||
/// @author sombochea
|
/// @author sombochea
|
||||||
/// @since 1.0.3
|
/// @since 1.0.3
|
||||||
abstract class MutableConfigurationProvider implements ConfigurationProvider {
|
abstract class MutableConfigurationProvider extends ConfigurationProvider {
|
||||||
/// Allow to set the value into config values
|
/// Allow to set the value into config values
|
||||||
void set(String key, String? value);
|
void set(String key, String? value);
|
||||||
|
|
||||||
/// Allow to set all values into config values
|
/// Allow to set all values into config values
|
||||||
void setAll(Map<String, String?> configs);
|
void setAll(Map<String, String?> configs) {
|
||||||
|
configs.forEach((key, value) {
|
||||||
|
set(key, value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/// Allow to remove the key from config values
|
/// Allow to remove the key from config values
|
||||||
void remove(String key);
|
void remove(String key);
|
||||||
|
|
||||||
/// Allow to remove all values from config values
|
/// Allow to remove all values from config values
|
||||||
void removeAll();
|
void removeAll();
|
||||||
|
|
||||||
|
/// Allow to set the value into config values in async function
|
||||||
|
Future<void> setAsync(String key, String? value) async {
|
||||||
|
set(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allow to set all values into config values in async function
|
||||||
|
Future<void> setAllAsync(Map<String, String?> configs) async {
|
||||||
|
configs.forEach((key, value) {
|
||||||
|
setAsync(key, value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allow to remove the key from config values in async function
|
||||||
|
Future<void> removeAsync(String key) async {
|
||||||
|
remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Allow to remove all values from config values in async function
|
||||||
|
Future<void> removeAllAsync() async {
|
||||||
|
removeAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -4,7 +4,7 @@ import 'mutable_configurable_provider.dart';
|
|||||||
///
|
///
|
||||||
/// @author sombochea
|
/// @author sombochea
|
||||||
/// @since 1.0.0
|
/// @since 1.0.0
|
||||||
class SimpleConfigurationProvider implements MutableConfigurationProvider {
|
class SimpleConfigurationProvider extends MutableConfigurationProvider {
|
||||||
final Map<String, String?> _configs = {};
|
final Map<String, String?> _configs = {};
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
@ -30,8 +30,15 @@ class SystemConfig {
|
|||||||
return getProvider().getOrNull(key, defaultValue: defaultValue);
|
return getProvider().getOrNull(key, defaultValue: defaultValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<String?> getOrNullAsync(String key, {String? defaultValue}) {
|
||||||
|
return getProvider().getOrNullAsync(key, defaultValue: defaultValue);
|
||||||
|
}
|
||||||
|
|
||||||
static bool containsKey(String key) => getProvider().containsKey(key);
|
static bool containsKey(String key) => getProvider().containsKey(key);
|
||||||
|
|
||||||
|
static Future<bool> containsKeyAsync(String key) =>
|
||||||
|
getProvider().containsKeyAsync(key);
|
||||||
|
|
||||||
/// Convert to mutable configuration provider
|
/// Convert to mutable configuration provider
|
||||||
static MutableConfigurationProvider _getMutableConfigurationProvider() {
|
static MutableConfigurationProvider _getMutableConfigurationProvider() {
|
||||||
if (_provider is MutableConfigurationProvider) {
|
if (_provider is MutableConfigurationProvider) {
|
||||||
@ -46,7 +53,31 @@ class SystemConfig {
|
|||||||
_getMutableConfigurationProvider().set(key, value);
|
_getMutableConfigurationProvider().set(key, value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<void> setAsync(String key, String? value) async {
|
||||||
|
await _getMutableConfigurationProvider().setAsync(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
static void setAll(Map<String, String?> values) {
|
static void setAll(Map<String, String?> values) {
|
||||||
_getMutableConfigurationProvider().setAll(values);
|
_getMutableConfigurationProvider().setAll(values);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Future<void> setAllAsync(Map<String, String?> values) async {
|
||||||
|
await _getMutableConfigurationProvider().setAllAsync(values);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void remove(String key) {
|
||||||
|
_getMutableConfigurationProvider().remove(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> removeAsync(String key) async {
|
||||||
|
await _getMutableConfigurationProvider().removeAsync(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void removeAll() {
|
||||||
|
_getMutableConfigurationProvider().removeAll();
|
||||||
|
}
|
||||||
|
|
||||||
|
static Future<void> removeAllAsync() async {
|
||||||
|
await _getMutableConfigurationProvider().removeAllAsync();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
55
lib/src/text/text_formatter.dart
Normal file
55
lib/src/text/text_formatter.dart
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
/// Text Formatter
|
||||||
|
///
|
||||||
|
/// @author sombochea
|
||||||
|
/// @since 1.0.0
|
||||||
|
class TextFormatter {
|
||||||
|
String? text;
|
||||||
|
|
||||||
|
TextFormatter(String? text) {
|
||||||
|
this.text = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
String? format(List<dynamic> args) {
|
||||||
|
if (text == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (args.isEmpty) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
var msg = text;
|
||||||
|
args.asMap().forEach((index, element) {
|
||||||
|
var _replaced = '';
|
||||||
|
if (element != null) {
|
||||||
|
_replaced = element.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = msg?.replaceAll('{$index}', _replaced);
|
||||||
|
});
|
||||||
|
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
|
||||||
|
String? decorate(Map<String, dynamic> params) {
|
||||||
|
if (text == null) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (params.isEmpty) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
var msg = text;
|
||||||
|
params.forEach((index, element) {
|
||||||
|
var _replaced = '';
|
||||||
|
if (element != null) {
|
||||||
|
_replaced = element.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
msg = msg?.replaceAll('{$index}', _replaced);
|
||||||
|
});
|
||||||
|
|
||||||
|
return msg;
|
||||||
|
}
|
||||||
|
}
|
3
lib/text.dart
Normal file
3
lib/text.dart
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
library cubetiq;
|
||||||
|
|
||||||
|
export 'src/text/text_formatter.dart';
|
@ -2,6 +2,7 @@ name: cubetiq
|
|||||||
description: CUBETIQ Dart Shared is functions, utils, and extensions for developers.
|
description: CUBETIQ Dart Shared is functions, utils, and extensions for developers.
|
||||||
version: 1.0.0
|
version: 1.0.0
|
||||||
homepage: https://www.cubetiqs.com
|
homepage: https://www.cubetiqs.com
|
||||||
|
repository: https://git.cubetiqs.com/CUBETIQ/cubetiq_dart_shared.git
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: '>=2.12.0 <3.0.0'
|
sdk: '>=2.12.0 <3.0.0'
|
||||||
|
15
test/cubetiq_text_formatter_test.dart
Normal file
15
test/cubetiq_text_formatter_test.dart
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import 'package:cubetiq/text.dart';
|
||||||
|
import 'package:test/test.dart';
|
||||||
|
|
||||||
|
void main() {
|
||||||
|
test('text formatter function format', () {
|
||||||
|
var text1 = 'Hello, {0}!';
|
||||||
|
var result1 = TextFormatter(text1).format(['Sambo']);
|
||||||
|
|
||||||
|
var text2 = 'Hello, {name}!';
|
||||||
|
var result2 = TextFormatter(text2).decorate({'name': 'Chea'});
|
||||||
|
|
||||||
|
expect('Hello, Sambo!', result1);
|
||||||
|
expect('Hello, Chea!', result2);
|
||||||
|
});
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user