Compare commits
6 Commits
2.1.0
...
feat/RES-5
Author | SHA1 | Date | |
---|---|---|---|
caa3295dce | |||
352633fddd | |||
7162f13166 | |||
beca2c6b2b | |||
3092376b65 | |||
c3b8ebfb37 |
@ -40,7 +40,15 @@ let package = Package(
|
|||||||
),
|
),
|
||||||
|
|
||||||
// Helper targets
|
// Helper targets
|
||||||
.target(name: "ToolCore"),
|
.target(
|
||||||
|
name: "ToolCore",
|
||||||
|
dependencies: [
|
||||||
|
.product(
|
||||||
|
name: "ArgumentParser",
|
||||||
|
package: "swift-argument-parser"
|
||||||
|
)
|
||||||
|
]
|
||||||
|
),
|
||||||
|
|
||||||
// Test targets
|
// Test targets
|
||||||
.testTarget(
|
.testTarget(
|
||||||
|
105
README.md
105
README.md
@ -2,13 +2,13 @@
|
|||||||
|
|
||||||
ResgenSwift is a package, fully written in Swift, to help you automatize ressource update and generation.
|
ResgenSwift is a package, fully written in Swift, to help you automatize ressource update and generation.
|
||||||
|
|
||||||
> 🧐 For all commands, see samples files in `SampleFiles`
|
> 🧐 For all commands, see samples files in `SampleFiles` and use `resgen-swift help` and `resgen-swift help <subcommand>` for detailed help.
|
||||||
|
|
||||||
## Fonts
|
## Fonts
|
||||||
|
|
||||||
Font generator generates an extension of `UIFont` and `Font` (or custom classes). It also prints content of `UIAppFonts` from your project `.plist`. If project `.plist` is specified, it will update `UIAppFonts` content of all `.plist`.
|
Font generator generates an extension of `UIFont` and `Font` (or custom classes). It also prints content of `UIAppFonts` from your project `.plist`. If project `.plist` is specified, it will update `UIAppFonts` content of all `.plist`.
|
||||||
|
|
||||||
iOS required to use the **real name** of the font, this name can be different from its filename. To get the **real name**, it uses `fc-scan`. So, be sure that the `$PATH` contains path of `fc-scan`.
|
iOS required to use the **real name** of the font, this name can be different from its filename. To get the **real name**, it uses `fc-scan`. So, be sure that your `$PATH` variable contains path of `fc-scan`.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
|
|
||||||
@ -36,7 +36,7 @@ swift run -c release ResgenSwift fonts $FORCE_FLAG "./Fonts/fonts.txt" \
|
|||||||
|
|
||||||
## Colors
|
## Colors
|
||||||
|
|
||||||
Colors generator generates an extension of `UIColor` (or a custom class) along with colorsets in specified xcassets.
|
Colors generator generates colorsets in specified xcassets and an extension of `Color` (or a custom class) associated to those colorsets. If the extension name is not specified, no extension will be generated.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
swift run -c release ResgenSwift colors $FORCE_FLAG "./Colors/colors.txt" \
|
swift run -c release ResgenSwift colors $FORCE_FLAG "./Colors/colors.txt" \
|
||||||
@ -54,12 +54,13 @@ swift run -c release ResgenSwift colors $FORCE_FLAG "./Colors/colors.txt" \
|
|||||||
1. `-f`: force generation
|
1. `-f`: force generation
|
||||||
2. Input colors file
|
2. Input colors file
|
||||||
3. `--style` can be `all` or `light`
|
3. `--style` can be `all` or `light`
|
||||||
4. `--extension-output-path`: path where to generate generated extension
|
4. `--extension-output-path` *(optional)* : path where to generate generated extension
|
||||||
5. `--extension-name` *(optional)* : name of the class to add SwiftUI getters
|
5. `--extension-name` *(optional)* : name of the class to add SwiftUI getters
|
||||||
6. `--extension-name-ui-kit` *(optional)* : name of the class to add UIKit getters
|
6. `--extension-name-ui-kit` *(optional)* : name of the class to add UIKit getters
|
||||||
7. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppColor+GreatApp.swift`)
|
7. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppColor+GreatApp.swift`)
|
||||||
8. `--static-members` *(optional)*: generate static properties or not
|
8. `--static-members` *(optional)*: generate static properties or not
|
||||||
|
|
||||||
|
> ⚠️ Passing a `extensionOutputPath` without any `extensionName` does not generate extension. **But** passing an `extensionName` without `extensionOutputPath` will result in a error.
|
||||||
|
|
||||||
## Strings
|
## Strings
|
||||||
|
|
||||||
@ -133,7 +134,7 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \
|
|||||||
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppTags+GreatApp.swift`)
|
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppTags+GreatApp.swift`)
|
||||||
7. `--static-members` *(optional)*: generate static properties or not
|
7. `--static-members` *(optional)*: generate static properties or not
|
||||||
|
|
||||||
> ⚠️ If extension name is not set or is `Tags`, it will generate the following typaloas `typealias Tags = String`.
|
> ⚠️ If extension name is not set or is `Tags`, it will generate the following typealias `typealias Tags = String`.
|
||||||
|
|
||||||
|
|
||||||
## Analytics
|
## Analytics
|
||||||
@ -141,11 +142,9 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \
|
|||||||
Analytics will generate all you need to analyze UX with Matomo or Firebase Analytics. Input files are formatted in YAML. This command will generate a manager for each target and an AnalyticsManager. This is this one you will need to use. And it will generate a method for all tags you have declared in the YAML file. Next, you will need to use the `configure()` method of AnalyticsManager and if you want to use matomo to set up the `siteId` and the `url` of the site.
|
Analytics will generate all you need to analyze UX with Matomo or Firebase Analytics. Input files are formatted in YAML. This command will generate a manager for each target and an AnalyticsManager. This is this one you will need to use. And it will generate a method for all tags you have declared in the YAML file. Next, you will need to use the `configure()` method of AnalyticsManager and if you want to use matomo to set up the `siteId` and the `url` of the site.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \
|
swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/analytics.yml" \
|
||||||
--target "matomo firebase" \
|
--target "matomo firebase" \
|
||||||
--extension-output-path "./Analytics/Generated" \
|
--output-file "./Analytics/Generated/AppAnalytics+GreatApp.swift" \
|
||||||
--extension-name "AppAnalytics" \
|
|
||||||
--extension-suffix "GreatApp" \
|
|
||||||
--static-members true
|
--static-members true
|
||||||
```
|
```
|
||||||
|
|
||||||
@ -154,12 +153,10 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \
|
|||||||
1. `-f`: force generation
|
1. `-f`: force generation
|
||||||
2. Input tags file (must be YAML formatted)
|
2. Input tags file (must be YAML formatted)
|
||||||
3. `--target`: target with you will log UX
|
3. `--target`: target with you will log UX
|
||||||
4. `--extension-output-path`: path where to generate generated extension
|
4. `--output-file`: file where where to generate generated code, must contains path and filename (ex: `./Analytics/Generated/AppAnalytics+GreatApp.swift`)
|
||||||
5. `--extension-name` *(optional)* : name of class to add the extension
|
|
||||||
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppAnalytics+GreatApp.swift`)
|
|
||||||
7. `--static-members` *(optional)*: generate static properties or not
|
7. `--static-members` *(optional)*: generate static properties or not
|
||||||
|
|
||||||
> ⚠️ If extension name is not set or is `Analytics`, it will generate the following typaloas `typealias Analytics = String`.
|
> ⚠️ If extension name is not set or is `Analytics`, it will generate the following typealias `typealias Analytics = String`.
|
||||||
|
|
||||||
### YAML
|
### YAML
|
||||||
|
|
||||||
@ -186,23 +183,87 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/tags.txt" \
|
|||||||
7. `comments` *(optional)*
|
7. `comments` *(optional)*
|
||||||
8. `parameters` *(optional)*
|
8. `parameters` *(optional)*
|
||||||
|
|
||||||
**Parameters**
|
**Parameters**
|
||||||
|
|
||||||
You can use parameters in generate methods.
|
You can use parameters in generate methods.
|
||||||
|
|
||||||
1. `name`: name of the parameter
|
1. `name`: name of the parameter
|
||||||
2. `type`: type of the parameter (Int, String, Bool, Double)
|
2. `type`: type of the parameter (Int, String, Bool, Double)
|
||||||
|
3. `value`: value of the parameter
|
||||||
|
4. `defaultValue`: defaultValue of the parameter
|
||||||
3. `replaceIn` *(optional)*
|
3. `replaceIn` *(optional)*
|
||||||
|
|
||||||
|
**Value**
|
||||||
|
|
||||||
|
If you want to send another parameter with a static value. For example, you want to send to which screen the event is triggered.
|
||||||
|
You can add the parameter 'screenName' for example and its 'value' is 'Home'. With this, you do not need to specify the value in the function call.
|
||||||
|
|
||||||
|
**DefaultValue**
|
||||||
|
|
||||||
|
If you want ta add a parameter in the call of the function but you want to make it optionnal with a default value you need to use this property.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
events:
|
||||||
|
id: id_of_tag
|
||||||
|
name: _TITLE_
|
||||||
|
tags: ios,droid
|
||||||
|
parameters:
|
||||||
|
- name: title
|
||||||
|
type: String
|
||||||
|
defaultValue: someTitle
|
||||||
|
```
|
||||||
|
|
||||||
|
The generated method will be:
|
||||||
|
```
|
||||||
|
logIdOfTag(title: String = "someTitle")
|
||||||
|
```
|
||||||
|
|
||||||
**Replace in**
|
**Replace in**
|
||||||
|
|
||||||
This is section is equivalent of `%s | %d | %f | %@`. You can put the content of the parameter in *name*, *path*, *action*, *category*.
|
This is section is equivalent of `%s | %d | %f | %@`. You can put the content of the parameter in *name*, *path*, *action*, *category*.
|
||||||
You need to put `_` + `NAME OF THE PARAMETER` + `_` in the target and which target you want in the value of `replaceIn`. (name need to be in uppercase)
|
You need to put `_` + `NAME OF THE PARAMETER` + `_` in the target and which target you want in the value of `replaceIn`. (name need to be in uppercase).
|
||||||
|
You can't use `value`and `replaceIn`in thge same time.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
events:
|
||||||
|
id: id_of_tag
|
||||||
|
name: _TITLE_
|
||||||
|
tags: ios,droid
|
||||||
|
parameters:
|
||||||
|
- name: title
|
||||||
|
type: String
|
||||||
|
replaceIn: name
|
||||||
|
```
|
||||||
|
|
||||||
|
In this sample, we want to add the parameter `title` in the field `name`. So, we need to place `_TITLE_` in the field `name`.
|
||||||
|
|
||||||
|
The generated method will be:
|
||||||
|
```
|
||||||
|
logIdOfTag(title: String)
|
||||||
|
```
|
||||||
|
|
||||||
|
You can also want to replace a parameter in an other parameter. You can do this with the `replaceIn` property. The condition is that the parameter which will use the `replaceIn`need to have the `value`property
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
events:
|
||||||
|
id: id_of_tag
|
||||||
|
name: title
|
||||||
|
tags: ios,droid
|
||||||
|
parameters:
|
||||||
|
- name: something
|
||||||
|
type: String
|
||||||
|
value: test _TEXT_
|
||||||
|
- name: text
|
||||||
|
type: String
|
||||||
|
replaceIn: something
|
||||||
|
```
|
||||||
|
|
||||||
## Images
|
## Images
|
||||||
|
|
||||||
Images generator will generate images assets along with extensions to access those images easily.
|
Images generator will generate images assets along with extensions to access those images easily. If the extension name is not specified, no extension will be generated.
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
swift run -c release ResgenSwift images $FORCE_FLAG "./Images/images.txt" \
|
swift run -c release ResgenSwift images $FORCE_FLAG "./Images/images.txt" \
|
||||||
@ -219,12 +280,13 @@ swift run -c release ResgenSwift images $FORCE_FLAG "./Images/images.txt" \
|
|||||||
1. `-f`: force generation
|
1. `-f`: force generation
|
||||||
2. Input images definitions file
|
2. Input images definitions file
|
||||||
3. `--xcassets-path`: xcasset path where to generate imagesets
|
3. `--xcassets-path`: xcasset path where to generate imagesets
|
||||||
4. `--extension-output-path`: path where to generate generated extension
|
4. `--extension-output-path` *(optional)* : path where to generate generated extension
|
||||||
5. `--extension-name` *(optional)* : name of the class to add SwiftUI getters
|
5. `--extension-name` *(optional)* : name of the class to add SwiftUI getters
|
||||||
6. `--extension-name-ui-kit` *(optional)* : name of the class to add UIKit getters
|
6. `--extension-name-ui-kit` *(optional)* : name of the class to add UIKit getters
|
||||||
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppImage+GreatApp.swift`)
|
6. `--extension-suffix` *(optional)* : additional text which is added to filename (ex: `AppImage+GreatApp.swift`)
|
||||||
7. `--static-members` *(optional)*: generate static properties or not
|
7. `--static-members` *(optional)*: generate static properties or not
|
||||||
|
|
||||||
|
> ⚠️ Passing a `extensionOutputPath` without any `extensionName` does not generate extension. **But** passing an `extensionName` without `extensionOutputPath` will result in a error.
|
||||||
> ⚠️ Svg images will be copied in the assets and rendered as "Original", however if those images are not rendered correctly you can force the png generation by adding the key word "png" like this: id arrow_back 15 ? png
|
> ⚠️ Svg images will be copied in the assets and rendered as "Original", however if those images are not rendered correctly you can force the png generation by adding the key word "png" like this: id arrow_back 15 ? png
|
||||||
|
|
||||||
## All at once
|
## All at once
|
||||||
@ -287,6 +349,15 @@ tags:
|
|||||||
extensionName: String?
|
extensionName: String?
|
||||||
extensionSuffix: String?
|
extensionSuffix: String?
|
||||||
staticMembers: Bool?
|
staticMembers: Bool?
|
||||||
|
|
||||||
|
analytics:
|
||||||
|
-
|
||||||
|
inputFile: String
|
||||||
|
target: String
|
||||||
|
extensionOutputPath: String
|
||||||
|
extensionName: String?
|
||||||
|
extensionSuffix: String?
|
||||||
|
staticMembers: Bool?
|
||||||
```
|
```
|
||||||
|
|
||||||
### Multiple configurations
|
### Multiple configurations
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
// Generated by ResgenSwift.Color 2.1.0
|
// Generated by ResgenSwift.Color 2.2.0
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
extension ColorYolo {
|
extension ColorYolo {
|
||||||
|
|
||||||
/// Color red is #FF0000 (light) or #FF0000 (dark)"
|
/// Color red is #FF0000 (light) or #FF0000 (dark)"
|
||||||
var red: Color {
|
public var red: Color {
|
||||||
Color("red")
|
Color("red")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color green_alpha_50 is #A000FF00 (light) or #A000FF00 (dark)"
|
/// Color green_alpha_50 is #A000FF00 (light) or #A000FF00 (dark)"
|
||||||
var green_alpha_50: Color {
|
public var green_alpha_50: Color {
|
||||||
Color("green_alpha_50")
|
Color("green_alpha_50")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color blue_light_dark is #0000FF (light) or #0000AA (dark)"
|
/// Color blue_light_dark is #0000FF (light) or #0000AA (dark)"
|
||||||
var blue_light_dark: Color {
|
public var blue_light_dark: Color {
|
||||||
Color("blue_light_dark")
|
Color("blue_light_dark")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,21 +1,21 @@
|
|||||||
// Generated by ResgenSwift.Color 1.2
|
// Generated by ResgenSwift.Color 2.2.0
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
extension UIColorYolo {
|
extension UIColorYolo {
|
||||||
|
|
||||||
/// Color red is #FF0000 (light) or #FF0000 (dark)"
|
/// Color red is #FF0000 (light) or #FF0000 (dark)"
|
||||||
@objc var red: UIColor {
|
@objc public var red: UIColor {
|
||||||
UIColor(named: "red")!
|
UIColor(named: "red")!
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color green_alpha_50 is #A000FF00 (light) or #A000FF00 (dark)"
|
/// Color green_alpha_50 is #A000FF00 (light) or #A000FF00 (dark)"
|
||||||
@objc var green_alpha_50: UIColor {
|
@objc public var green_alpha_50: UIColor {
|
||||||
UIColor(named: "green_alpha_50")!
|
UIColor(named: "green_alpha_50")!
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color blue_light_dark is #0000FF (light) or #0000AA (dark)"
|
/// Color blue_light_dark is #0000FF (light) or #0000AA (dark)"
|
||||||
@objc var blue_light_dark: UIColor {
|
@objc public var blue_light_dark: UIColor {
|
||||||
UIColor(named: "blue_light_dark")!
|
UIColor(named: "blue_light_dark")!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
// Generated by ResgenSwift.Fonts 2.1.0
|
// Generated by ResgenSwift.Fonts 2.2.0
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
extension FontYolo {
|
extension FontYolo {
|
||||||
|
|
||||||
enum FontName: String {
|
public enum FontName: String {
|
||||||
case LatoItalic = "Lato-Italic"
|
case LatoItalic = "Lato-Italic"
|
||||||
case LatoLightItalic = "Lato-LightItalic"
|
case LatoLightItalic = "Lato-LightItalic"
|
||||||
case LatoHairline = "Lato-Hairline"
|
case LatoHairline = "Lato-Hairline"
|
||||||
@ -19,43 +19,43 @@ extension FontYolo {
|
|||||||
|
|
||||||
// MARK: - Getter
|
// MARK: - Getter
|
||||||
|
|
||||||
func LatoItalic(withSize size: CGFloat) -> Font {
|
public func LatoItalic(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoItalic.rawValue, size: size)
|
Font.custom(FontName.LatoItalic.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoLightItalic(withSize size: CGFloat) -> Font {
|
public func LatoLightItalic(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoLightItalic.rawValue, size: size)
|
Font.custom(FontName.LatoLightItalic.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoHairline(withSize size: CGFloat) -> Font {
|
public func LatoHairline(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoHairline.rawValue, size: size)
|
Font.custom(FontName.LatoHairline.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBold(withSize size: CGFloat) -> Font {
|
public func LatoBold(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoBold.rawValue, size: size)
|
Font.custom(FontName.LatoBold.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBlack(withSize size: CGFloat) -> Font {
|
public func LatoBlack(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoBlack.rawValue, size: size)
|
Font.custom(FontName.LatoBlack.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoRegular(withSize size: CGFloat) -> Font {
|
public func LatoRegular(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoRegular.rawValue, size: size)
|
Font.custom(FontName.LatoRegular.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBlackItalic(withSize size: CGFloat) -> Font {
|
public func LatoBlackItalic(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoBlackItalic.rawValue, size: size)
|
Font.custom(FontName.LatoBlackItalic.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBoldItalic(withSize size: CGFloat) -> Font {
|
public func LatoBoldItalic(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoBoldItalic.rawValue, size: size)
|
Font.custom(FontName.LatoBoldItalic.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoLight(withSize size: CGFloat) -> Font {
|
public func LatoLight(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoLight.rawValue, size: size)
|
Font.custom(FontName.LatoLight.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoHairlineItalic(withSize size: CGFloat) -> Font {
|
public func LatoHairlineItalic(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.LatoHairlineItalic.rawValue, size: size)
|
Font.custom(FontName.LatoHairlineItalic.rawValue, size: size)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
// Generated by ResgenSwift.Fonts 2.1.0
|
// Generated by ResgenSwift.Fonts 2.2.0
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
extension UIFontYolo {
|
extension UIFontYolo {
|
||||||
|
|
||||||
enum FontName: String {
|
public enum FontName: String {
|
||||||
case LatoItalic = "Lato-Italic"
|
case LatoItalic = "Lato-Italic"
|
||||||
case LatoLightItalic = "Lato-LightItalic"
|
case LatoLightItalic = "Lato-LightItalic"
|
||||||
case LatoHairline = "Lato-Hairline"
|
case LatoHairline = "Lato-Hairline"
|
||||||
@ -19,43 +19,43 @@ extension UIFontYolo {
|
|||||||
|
|
||||||
// MARK: - Getter
|
// MARK: - Getter
|
||||||
|
|
||||||
func LatoItalic(withSize size: CGFloat) -> UIFont {
|
public func LatoItalic(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoItalic.rawValue, size: size)!
|
UIFont(name: FontName.LatoItalic.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoLightItalic(withSize size: CGFloat) -> UIFont {
|
public func LatoLightItalic(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoLightItalic.rawValue, size: size)!
|
UIFont(name: FontName.LatoLightItalic.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoHairline(withSize size: CGFloat) -> UIFont {
|
public func LatoHairline(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoHairline.rawValue, size: size)!
|
UIFont(name: FontName.LatoHairline.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBold(withSize size: CGFloat) -> UIFont {
|
public func LatoBold(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoBold.rawValue, size: size)!
|
UIFont(name: FontName.LatoBold.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBlack(withSize size: CGFloat) -> UIFont {
|
public func LatoBlack(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoBlack.rawValue, size: size)!
|
UIFont(name: FontName.LatoBlack.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoRegular(withSize size: CGFloat) -> UIFont {
|
public func LatoRegular(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoRegular.rawValue, size: size)!
|
UIFont(name: FontName.LatoRegular.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBlackItalic(withSize size: CGFloat) -> UIFont {
|
public func LatoBlackItalic(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoBlackItalic.rawValue, size: size)!
|
UIFont(name: FontName.LatoBlackItalic.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoBoldItalic(withSize size: CGFloat) -> UIFont {
|
public func LatoBoldItalic(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoBoldItalic.rawValue, size: size)!
|
UIFont(name: FontName.LatoBoldItalic.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoLight(withSize size: CGFloat) -> UIFont {
|
public func LatoLight(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoLight.rawValue, size: size)!
|
UIFont(name: FontName.LatoLight.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func LatoHairlineItalic(withSize size: CGFloat) -> UIFont {
|
public func LatoHairlineItalic(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.LatoHairlineItalic.rawValue, size: size)!
|
UIFont(name: FontName.LatoHairlineItalic.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,31 @@
|
|||||||
// Generated by ResgenSwift.Images 2.1.0
|
// Generated by ResgenSwift.Images 2.2.0
|
||||||
// Images from sampleImages
|
// Images from sampleImages
|
||||||
|
|
||||||
import SwiftUI
|
import SwiftUI
|
||||||
|
|
||||||
extension ImageYolo {
|
extension ImageYolo {
|
||||||
|
|
||||||
var article_notification_pull_detail: Image {
|
public var article_notification_pull_detail: Image {
|
||||||
Image("article_notification_pull_detail")
|
Image("article_notification_pull_detail")
|
||||||
}
|
}
|
||||||
|
|
||||||
var article_notification_pull: Image {
|
public var article_notification_pull: Image {
|
||||||
Image("article_notification_pull")
|
Image("article_notification_pull")
|
||||||
}
|
}
|
||||||
|
|
||||||
var new_article: Image {
|
public var new_article: Image {
|
||||||
Image("new_article")
|
Image("new_article")
|
||||||
}
|
}
|
||||||
|
|
||||||
var welcome_background: Image {
|
public var welcome_background: Image {
|
||||||
Image("welcome_background")
|
Image("welcome_background")
|
||||||
}
|
}
|
||||||
|
|
||||||
var article_trash: Image {
|
public var article_trash: Image {
|
||||||
Image("article_trash")
|
Image("article_trash")
|
||||||
}
|
}
|
||||||
|
|
||||||
var ic_close_article: Image {
|
public var ic_close_article: Image {
|
||||||
Image("ic_close_article")
|
Image("ic_close_article")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,31 @@
|
|||||||
// Generated by ResgenSwift.Images 2.1.0
|
// Generated by ResgenSwift.Images 2.2.0
|
||||||
// Images from sampleImages
|
// Images from sampleImages
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
extension UIImageYolo {
|
extension UIImageYolo {
|
||||||
|
|
||||||
var article_notification_pull_detail: UIImage {
|
public var article_notification_pull_detail: UIImage {
|
||||||
UIImage(named: "article_notification_pull_detail")!
|
UIImage(named: "article_notification_pull_detail")!
|
||||||
}
|
}
|
||||||
|
|
||||||
var article_notification_pull: UIImage {
|
public var article_notification_pull: UIImage {
|
||||||
UIImage(named: "article_notification_pull")!
|
UIImage(named: "article_notification_pull")!
|
||||||
}
|
}
|
||||||
|
|
||||||
var new_article: UIImage {
|
public var new_article: UIImage {
|
||||||
UIImage(named: "new_article")!
|
UIImage(named: "new_article")!
|
||||||
}
|
}
|
||||||
|
|
||||||
var welcome_background: UIImage {
|
public var welcome_background: UIImage {
|
||||||
UIImage(named: "welcome_background")!
|
UIImage(named: "welcome_background")!
|
||||||
}
|
}
|
||||||
|
|
||||||
var article_trash: UIImage {
|
public var article_trash: UIImage {
|
||||||
UIImage(named: "article_trash")!
|
UIImage(named: "article_trash")!
|
||||||
}
|
}
|
||||||
|
|
||||||
var ic_close_article: UIImage {
|
public var ic_close_article: UIImage {
|
||||||
UIImage(named: "ic_close_article")!
|
UIImage(named: "ic_close_article")!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Generated by ResgenSwift.Strings.Stringium 2.1.0
|
// Generated by ResgenSwift.Strings.Stringium 2.2.0
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
@ -6,7 +6,7 @@ fileprivate let kStringsFileName = "sampleStrings"
|
|||||||
|
|
||||||
extension String {
|
extension String {
|
||||||
|
|
||||||
enum KeyGenAllScript: String {
|
public enum KeyGenAllScript: String {
|
||||||
case param_lang = "param_lang"
|
case param_lang = "param_lang"
|
||||||
case generic_back = "generic_back"
|
case generic_back = "generic_back"
|
||||||
case generic_loading_data = "generic_loading_data"
|
case generic_loading_data = "generic_loading_data"
|
||||||
@ -14,7 +14,7 @@ extension String {
|
|||||||
case test_equal_symbol = "test_equal_symbol"
|
case test_equal_symbol = "test_equal_symbol"
|
||||||
case placeholders_test_one = "placeholders_test_one"
|
case placeholders_test_one = "placeholders_test_one"
|
||||||
|
|
||||||
var keyPath: KeyPath<String, String> {
|
public var keyPath: KeyPath<String, String> {
|
||||||
switch self {
|
switch self {
|
||||||
case .param_lang: return \String.param_lang
|
case .param_lang: return \String.param_lang
|
||||||
case .generic_back: return \String.generic_back
|
case .generic_back: return \String.generic_back
|
||||||
@ -33,7 +33,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var param_lang: String {
|
public var param_lang: String {
|
||||||
NSLocalizedString("param_lang", tableName: kStringsFileName, bundle: Bundle.main, value: "en", comment: "")
|
NSLocalizedString("param_lang", tableName: kStringsFileName, bundle: Bundle.main, value: "en", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var generic_back: String {
|
public var generic_back: String {
|
||||||
NSLocalizedString("generic_back", tableName: kStringsFileName, bundle: Bundle.main, value: "Back", comment: "")
|
NSLocalizedString("generic_back", tableName: kStringsFileName, bundle: Bundle.main, value: "Back", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var generic_loading_data: String {
|
public var generic_loading_data: String {
|
||||||
NSLocalizedString("generic_loading_data", tableName: kStringsFileName, bundle: Bundle.main, value: "Loading data...", comment: "")
|
NSLocalizedString("generic_loading_data", tableName: kStringsFileName, bundle: Bundle.main, value: "Loading data...", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var generic_welcome_firstname_format: String {
|
public var generic_welcome_firstname_format: String {
|
||||||
NSLocalizedString("generic_welcome_firstname_format", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "")
|
NSLocalizedString("generic_welcome_firstname_format", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "")
|
||||||
}
|
}
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
@ -70,7 +70,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
func generic_welcome_firstname_format(arg0: String) -> String {
|
public func generic_welcome_firstname_format(arg0: String) -> String {
|
||||||
String(format: self.generic_welcome_firstname_format, arg0)
|
String(format: self.generic_welcome_firstname_format, arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -81,7 +81,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var test_equal_symbol: String {
|
public var test_equal_symbol: String {
|
||||||
NSLocalizedString("test_equal_symbol", tableName: kStringsFileName, bundle: Bundle.main, value: "1€ = 1 point !", comment: "")
|
NSLocalizedString("test_equal_symbol", tableName: kStringsFileName, bundle: Bundle.main, value: "1€ = 1 point !", comment: "")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -92,7 +92,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var placeholders_test_one: String {
|
public var placeholders_test_one: String {
|
||||||
NSLocalizedString("placeholders_test_one", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "")
|
NSLocalizedString("placeholders_test_one", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "")
|
||||||
}
|
}
|
||||||
/// Translation in en :
|
/// Translation in en :
|
||||||
@ -100,7 +100,7 @@ extension String {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
func placeholders_test_one(arg0: String, arg1: String, arg2: Int) -> String {
|
public func placeholders_test_one(arg0: String, arg1: String, arg2: Int) -> String {
|
||||||
String(format: self.placeholders_test_one, arg0, arg1, arg2)
|
String(format: self.placeholders_test_one, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
150
SampleFiles/Strings/Generated/sampleStrings.xcstrings
Normal file
150
SampleFiles/Strings/Generated/sampleStrings.xcstrings
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
{
|
||||||
|
"sourceLanguage" : "en",
|
||||||
|
"strings" : {
|
||||||
|
"generic_back" : {
|
||||||
|
"comment" : "",
|
||||||
|
"extractionState" : "manual",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Back"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en-us" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Back"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fr" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Retour"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"generic_loading_data" : {
|
||||||
|
"comment" : "",
|
||||||
|
"extractionState" : "manual",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Loading data..."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en-us" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Loading data..."
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fr" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Chargement des données..."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"generic_welcome_firstname_format" : {
|
||||||
|
"comment" : "",
|
||||||
|
"extractionState" : "manual",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Welcome \\\"%@\\\" !"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en-us" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Welcome \\\"%@\\\" !"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fr" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Bienvenue \\\"%@\\\" !"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"param_lang" : {
|
||||||
|
"comment" : "",
|
||||||
|
"extractionState" : "manual",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "en"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en-us" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "en-us"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fr" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "fr"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"placeholders_test_one" : {
|
||||||
|
"comment" : "",
|
||||||
|
"extractionState" : "manual",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "You %%: %2$@ %1$@ Age: %3$d"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en-us" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "You %%: %2$@ %1$@ Age: %3$d"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fr" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "Vous %%: %1$@ %2$@ Age: %3$d"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"test_equal_symbol" : {
|
||||||
|
"comment" : "",
|
||||||
|
"extractionState" : "manual",
|
||||||
|
"localizations" : {
|
||||||
|
"en" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "1€ = 1 point !"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"en-us" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "1€ = 1 point !"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"fr" : {
|
||||||
|
"stringUnit" : {
|
||||||
|
"state" : "translated",
|
||||||
|
"value" : "1€ = 1 point !"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"version" : "1.0"
|
||||||
|
}
|
@ -1,19 +1,27 @@
|
|||||||
// Generated by ResgenSwift.Analytics 2.1.0
|
// Generated by ResgenSwift.Analytics 2.2.0
|
||||||
|
|
||||||
|
import Foundation
|
||||||
import MatomoTracker
|
import MatomoTracker
|
||||||
import FirebaseAnalytics
|
import FirebaseAnalytics
|
||||||
|
|
||||||
// MARK: - Protocol
|
// MARK: - Protocol
|
||||||
|
|
||||||
protocol AnalyticsManagerProtocol {
|
public protocol AnalyticsManagerProtocol {
|
||||||
|
|
||||||
|
func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
)
|
||||||
|
|
||||||
func logScreen(name: String, path: String)
|
|
||||||
func logEvent(
|
func logEvent(
|
||||||
name: String,
|
name: String,
|
||||||
action: String,
|
action: String,
|
||||||
category: String,
|
category: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func setEnable(_ enable: Bool)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Matomo
|
// MARK: - Matomo
|
||||||
@ -48,8 +56,11 @@ class MatomoAnalyticsManager: AnalyticsManagerProtocol {
|
|||||||
|
|
||||||
// MARK: - Methods
|
// MARK: - Methods
|
||||||
|
|
||||||
func logScreen(name: String, path: String) {
|
func logScreen(
|
||||||
guard !tracker.isOptedOut else { return }
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
||||||
|
|
||||||
let urlString = URL(string: "\(trackerUrl)" + "/" + "\(path)" + "iOS")
|
let urlString = URL(string: "\(trackerUrl)" + "/" + "\(path)" + "iOS")
|
||||||
@ -65,8 +76,6 @@ class MatomoAnalyticsManager: AnalyticsManagerProtocol {
|
|||||||
category: String,
|
category: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard !tracker.isOptedOut else { return }
|
|
||||||
|
|
||||||
tracker.track(
|
tracker.track(
|
||||||
eventWithCategory: category,
|
eventWithCategory: category,
|
||||||
action: action,
|
action: action,
|
||||||
@ -75,33 +84,31 @@ class MatomoAnalyticsManager: AnalyticsManagerProtocol {
|
|||||||
url: nil
|
url: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func setEnable(_ enable: Bool) {
|
||||||
|
tracker.isOptedOut = !enable
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Firebase
|
// MARK: - Firebase
|
||||||
|
|
||||||
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
||||||
func logScreen(name: String, path: String) {
|
|
||||||
|
// MARK: - Methods
|
||||||
|
|
||||||
|
func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
var parameters = [
|
var parameters = [
|
||||||
AnalyticsParameterScreenName: name as NSObject
|
AnalyticsParameterScreenName: name as NSObject
|
||||||
]
|
]
|
||||||
|
|
||||||
Analytics.logEvent(
|
if path.isEmpty == false {
|
||||||
AnalyticsEventScreenView,
|
parameters["path"] = path + "/iOS" as NSObject
|
||||||
parameters: parameters
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
) {
|
|
||||||
var parameters: [String:NSObject] = [
|
|
||||||
"action": action as NSObject,
|
|
||||||
"category": category as NSObject,
|
|
||||||
]
|
|
||||||
|
|
||||||
if let supplementaryParameters = params {
|
if let supplementaryParameters = params {
|
||||||
for (newKey, newValue) in supplementaryParameters {
|
for (newKey, newValue) in supplementaryParameters {
|
||||||
if parameters.contains(where: { (key: String, value: NSObject) in
|
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||||
@ -115,45 +122,123 @@ class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Analytics.logEvent(
|
Analytics.logEvent(
|
||||||
name.replacingOccurrences(of: [" "], with: "_"),
|
AnalyticsEventScreenView,
|
||||||
parameters: parameters
|
parameters: parameters
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func logEvent(
|
||||||
|
name: String,
|
||||||
|
action: String,
|
||||||
|
category: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
|
var parameters: [String:NSObject] = [
|
||||||
|
AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject
|
||||||
|
]
|
||||||
|
|
||||||
|
if category.isEmpty == false {
|
||||||
|
parameters["AnalyticsParameterItemCategory"] = category as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
|
if action.isEmpty == false {
|
||||||
|
parameters["action"] = action as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
|
if let supplementaryParameters = params {
|
||||||
|
for (newKey, newValue) in supplementaryParameters {
|
||||||
|
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||||
|
key == newKey
|
||||||
|
}) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
parameters[newKey] = newValue as? NSObject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Analytics.logEvent(
|
||||||
|
AnalyticsEventSelectContent,
|
||||||
|
parameters: parameters
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setEnable(_ enable: Bool) {
|
||||||
|
Analytics.setAnalyticsCollectionEnabled(enable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Traker Type
|
||||||
|
|
||||||
|
public enum TrackerType: CaseIterable {
|
||||||
|
|
||||||
|
case matomo
|
||||||
|
case firebase
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Manager
|
// MARK: - Manager
|
||||||
|
|
||||||
class AnalyticsManager {
|
public class AnalyticsManager {
|
||||||
|
|
||||||
static var shared = AnalyticsManager()
|
public static var shared = AnalyticsManager()
|
||||||
|
|
||||||
|
private init() {}
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
var managers: [AnalyticsManagerProtocol] = []
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
private var isEnabled: Bool = true
|
private var isEnabled: Bool {
|
||||||
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
// MARK: - Methods
|
false
|
||||||
|
} else {
|
||||||
func setAnalyticsEnabled(_ enable: Bool) {
|
true
|
||||||
isEnabled = enable
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func configure(siteId: String, url: String) {
|
// MARK: - Enable Methods
|
||||||
managers.append(
|
|
||||||
MatomoAnalyticsManager(
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
|
managers.forEach { (key, value) in
|
||||||
|
if analytics.contains(where: { type in
|
||||||
|
type == key
|
||||||
|
}) {
|
||||||
|
value.setEnable(enable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: true, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: false, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func configure(siteId: String, url: String) {
|
||||||
|
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
||||||
siteId: siteId,
|
siteId: siteId,
|
||||||
url: url
|
url: url
|
||||||
)
|
)
|
||||||
)
|
managers[TrackerType.firebase] = FirebaseAnalyticsManager()
|
||||||
managers.append(FirebaseAnalyticsManager())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func logScreen(name: String, path: String) {
|
// MARK: - Private Log Methods
|
||||||
|
|
||||||
|
private func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logScreen(name: name, path: path)
|
manager.logScreen(
|
||||||
|
name: name,
|
||||||
|
path: path,
|
||||||
|
params: params
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -165,7 +250,7 @@ class AnalyticsManager {
|
|||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
@ -177,31 +262,39 @@ class AnalyticsManager {
|
|||||||
|
|
||||||
// MARK: - section_one
|
// MARK: - section_one
|
||||||
|
|
||||||
func logScreenS1DefOne(title: String) {
|
public func logScreenS1DefOne(title: String) {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s1 def one \(title)",
|
name: "s1 def one \(title)",
|
||||||
path: "s1_def_one/\(title)"
|
path: "s1_def_one/\(title)",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func logEventS1DefTwo(title: String, count: String) {
|
public func logEventS1DefTwo(
|
||||||
|
title: String,
|
||||||
|
count: String,
|
||||||
|
test2: String = "test"
|
||||||
|
) {
|
||||||
logEvent(
|
logEvent(
|
||||||
name: "s1 def two",
|
name: "s1 def two",
|
||||||
action: "test",
|
action: "test",
|
||||||
category: "test",
|
category: "test",
|
||||||
params: [
|
params: [
|
||||||
"title": title,
|
"title": title,
|
||||||
"count": count
|
"count": count,
|
||||||
|
"test": "test",
|
||||||
|
"test2": test2
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - section_two
|
// MARK: - section_two
|
||||||
|
|
||||||
func logScreenS2DefOne() {
|
public func logScreenS2DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s2 def one",
|
name: "s2 def one",
|
||||||
path: "s2_def_one/"
|
path: "s2_def_one/",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Generated by ResgenSwift.Strings.Tags 2.1.0
|
// Generated by ResgenSwift.Strings.Tags 2.2.0
|
||||||
|
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
@ -11,8 +11,7 @@ extension Tags {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
|
public var screen_one: String {
|
||||||
var screen_one: String {
|
|
||||||
"Ecran un"
|
"Ecran un"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -21,8 +20,7 @@ extension Tags {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
|
public var screen_two: String {
|
||||||
var screen_two: String {
|
|
||||||
"Ecran deux"
|
"Ecran deux"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -22,6 +22,12 @@ categories:
|
|||||||
type: String
|
type: String
|
||||||
- name: count
|
- name: count
|
||||||
type: String
|
type: String
|
||||||
|
- name: test
|
||||||
|
type: String
|
||||||
|
value: test
|
||||||
|
- name: test2
|
||||||
|
type: String
|
||||||
|
defaultValue: test
|
||||||
|
|
||||||
- id: section_two
|
- id: section_two
|
||||||
screens:
|
screens:
|
||||||
|
@ -50,14 +50,15 @@ swift run -c release ResgenSwift strings tags $FORCE_FLAG "./Tags/sampleTags.txt
|
|||||||
--extension-name "Tags" \
|
--extension-name "Tags" \
|
||||||
--extension-suffix "GenAllScript"
|
--extension-suffix "GenAllScript"
|
||||||
|
|
||||||
#echo "\n-------------------------\n"
|
echo "\n-------------------------\n"
|
||||||
|
|
||||||
# Analytics
|
# Analytics
|
||||||
swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \
|
swift run -c release ResgenSwift analytics $FORCE_FLAG "./Tags/sampleTags.yml" \
|
||||||
--target "matomo firebase" \
|
--target "firebase" \
|
||||||
--extension-output-path "./Tags/Generated" \
|
--extension-output-path "./Tags/Generated" \
|
||||||
--extension-name "Analytics" \
|
--extension-name "Analytics" \
|
||||||
--extension-suffix "GenAllScript"
|
--extension-suffix "GenAllScript" \
|
||||||
|
--static-members true
|
||||||
|
|
||||||
echo "\n-------------------------\n"
|
echo "\n-------------------------\n"
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ strings:
|
|||||||
extensionOutputPath: ./Strings/Generated
|
extensionOutputPath: ./Strings/Generated
|
||||||
extensionName: String
|
extensionName: String
|
||||||
extensionSuffix: GenAllScript
|
extensionSuffix: GenAllScript
|
||||||
|
visibility: public
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -50,6 +51,7 @@ images:
|
|||||||
extensionName: ImageYolo
|
extensionName: ImageYolo
|
||||||
extensionNameUIKit: UIImageYolo
|
extensionNameUIKit: UIImageYolo
|
||||||
extensionSuffix: GenAllScript
|
extensionSuffix: GenAllScript
|
||||||
|
visibility: public
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -64,6 +66,7 @@ colors:
|
|||||||
extensionName: ColorYolo
|
extensionName: ColorYolo
|
||||||
extensionNameUIKit: UIColorYolo
|
extensionNameUIKit: UIColorYolo
|
||||||
extensionSuffix: GenAllScript
|
extensionSuffix: GenAllScript
|
||||||
|
visibility: public
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -76,6 +79,7 @@ tags:
|
|||||||
extensionOutputPath: ./Tags/Generated
|
extensionOutputPath: ./Tags/Generated
|
||||||
extensionName: Tags
|
extensionName: Tags
|
||||||
extensionSuffix: GenAllScript
|
extensionSuffix: GenAllScript
|
||||||
|
visibility: public
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -85,9 +89,8 @@ analytics:
|
|||||||
-
|
-
|
||||||
inputFile: ./Tags/sampleTags.yml
|
inputFile: ./Tags/sampleTags.yml
|
||||||
target: "matomo firebase"
|
target: "matomo firebase"
|
||||||
extensionOutputPath: ./Tags/Generated
|
outputFile: ./Tags/Generated/Analytics+GenAllScript.swift
|
||||||
extensionName: Analytics
|
visibility: public
|
||||||
extensionSuffix: GenAllScript
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -101,3 +104,4 @@ fonts:
|
|||||||
extensionNameUIKit: UIFontYolo
|
extensionNameUIKit: UIFontYolo
|
||||||
extensionSuffix: GenAllScript
|
extensionSuffix: GenAllScript
|
||||||
infoPlistPaths: "./Fonts/Generated/test.plist ./Fonts/Generated/test2.plist"
|
infoPlistPaths: "./Fonts/Generated/test.plist ./Fonts/Generated/test2.plist"
|
||||||
|
visibility: public
|
||||||
|
@ -50,8 +50,8 @@ struct Analytics: ParsableCommand {
|
|||||||
target: options.target,
|
target: options.target,
|
||||||
tags: ["ios", "iosonly"],
|
tags: ["ios", "iosonly"],
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
extensionName: options.extensionName,
|
outputFile: options.outputFile,
|
||||||
extensionFilePath: options.extensionFilePath
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
|
||||||
print("[\(Self.toolName)] Analytics generated")
|
print("[\(Self.toolName)] Analytics generated")
|
||||||
@ -79,7 +79,7 @@ struct Analytics: ParsableCommand {
|
|||||||
guard GeneratorChecker.shouldGenerate(
|
guard GeneratorChecker.shouldGenerate(
|
||||||
force: options.forceGeneration,
|
force: options.forceGeneration,
|
||||||
inputFilePath: options.inputFile,
|
inputFilePath: options.inputFile,
|
||||||
extensionFilePath: options.extensionFilePath
|
extensionFilePath: options.outputFile
|
||||||
) else {
|
) else {
|
||||||
print("[\(Self.toolName)] Analytics are already up to date :) ")
|
print("[\(Self.toolName)] Analytics are already up to date :) ")
|
||||||
return false
|
return false
|
||||||
|
@ -7,45 +7,41 @@
|
|||||||
|
|
||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
// swiftlint:disable no_grouping_extension
|
|
||||||
|
|
||||||
struct AnalyticsOptions: ParsableArguments {
|
struct AnalyticsOptions: ParsableArguments {
|
||||||
|
|
||||||
@Flag(name: [.customShort("f"), .customShort("F")], help: "Should force generation")
|
@Flag(
|
||||||
|
name: [.customShort("f"), .customShort("F")],
|
||||||
|
help: "Should force generation"
|
||||||
|
)
|
||||||
var forceGeneration = false
|
var forceGeneration = false
|
||||||
|
|
||||||
@Argument(help: "Input files where tags ared defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Argument(
|
||||||
|
help: "Input files where tags ared defined.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
var inputFile: String
|
var inputFile: String
|
||||||
|
|
||||||
@Option(help: "Target(s) analytics to generate. (\"matomo\" | \"firebase\")")
|
@Option(
|
||||||
|
help: "Target(s) analytics to generate. (\"matomo\" | \"firebase\")",
|
||||||
|
completion: .list(["matotmo", "firebase"])
|
||||||
|
)
|
||||||
var target: String
|
var target: String
|
||||||
|
|
||||||
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(
|
||||||
var extensionOutputPath: String
|
help: "Where to generate the analytics manager (path with filename)",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
|
var outputFile: String
|
||||||
|
|
||||||
@Option(help: "Tell if it will generate static properties or not")
|
@Option(help: "Tell if it will generate static properties or not")
|
||||||
var staticMembers: Bool = false
|
var staticMembers: Bool = false
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate a Analytics extension.")
|
@Option(
|
||||||
var extensionName: String = Analytics.defaultExtensionName
|
name: .customLong("visibility"),
|
||||||
|
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
|
||||||
@Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+Analytics{extensionSuffix}.swift")
|
completion: .list(["public", "private", "package", "internal"])
|
||||||
var extensionSuffix: String?
|
)
|
||||||
}
|
var extensionVisibility: ExtensionVisibility = .internal
|
||||||
|
|
||||||
// MARK: - Computed var
|
|
||||||
|
|
||||||
extension AnalyticsOptions {
|
|
||||||
|
|
||||||
var extensionFileName: String {
|
|
||||||
if let extensionSuffix {
|
|
||||||
return "\(extensionName)+\(extensionSuffix).swift"
|
|
||||||
}
|
|
||||||
return "\(extensionName).swift"
|
|
||||||
}
|
|
||||||
|
|
||||||
var extensionFilePath: String {
|
|
||||||
"\(extensionOutputPath)/\(extensionFileName)"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -5,11 +5,14 @@
|
|||||||
// Created by Loris Perret on 08/12/2023.
|
// Created by Loris Perret on 08/12/2023.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
// CPD-OFF
|
||||||
|
|
||||||
import CoreVideo
|
import CoreVideo
|
||||||
import Foundation
|
import Foundation
|
||||||
import ToolCore
|
import ToolCore
|
||||||
|
|
||||||
// Disabled cause it's a pain to handle in generated string
|
// Disabled cause it's a pain to handle in generated string
|
||||||
|
// swiftlint:disable type_body_length
|
||||||
|
|
||||||
enum AnalyticsGenerator {
|
enum AnalyticsGenerator {
|
||||||
|
|
||||||
@ -20,8 +23,8 @@ enum AnalyticsGenerator {
|
|||||||
target: String,
|
target: String,
|
||||||
tags: [String],
|
tags: [String],
|
||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
outputFile: String,
|
||||||
extensionFilePath: String
|
visibility: ExtensionVisibility
|
||||||
) {
|
) {
|
||||||
// Get target type from enum
|
// Get target type from enum
|
||||||
let targetsString: [String] = target.components(separatedBy: " ")
|
let targetsString: [String] = target.components(separatedBy: " ")
|
||||||
@ -41,15 +44,15 @@ enum AnalyticsGenerator {
|
|||||||
sections: sections,
|
sections: sections,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
staticVar: staticVar,
|
staticVar: staticVar,
|
||||||
extensionName: extensionName
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Write content
|
// Write content
|
||||||
let extensionFilePathURL = URL(fileURLWithPath: extensionFilePath)
|
let outputFilePathURL = URL(fileURLWithPath: outputFile)
|
||||||
do {
|
do {
|
||||||
try extensionFileContent.write(to: extensionFilePathURL, atomically: false, encoding: .utf8)
|
try extensionFileContent.write(to: outputFilePathURL, atomically: false, encoding: .utf8)
|
||||||
} catch {
|
} catch {
|
||||||
let error = AnalyticsError.writeFile(extensionFilePath, error.localizedDescription)
|
let error = AnalyticsError.writeFile(outputFile, error.localizedDescription)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
Analytics.exit(withError: error)
|
Analytics.exit(withError: error)
|
||||||
}
|
}
|
||||||
@ -62,18 +65,19 @@ enum AnalyticsGenerator {
|
|||||||
sections: [AnalyticsCategory],
|
sections: [AnalyticsCategory],
|
||||||
tags: [String],
|
tags: [String],
|
||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
[
|
[
|
||||||
getHeader(
|
getHeader(
|
||||||
targets: targets,
|
targets: targets,
|
||||||
extensionClassname: extensionName,
|
staticVar: staticVar,
|
||||||
staticVar: staticVar
|
visibility: visibility
|
||||||
),
|
),
|
||||||
getProperties(
|
getProperties(
|
||||||
sections: sections,
|
sections: sections,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
staticVar: staticVar
|
staticVar: staticVar,
|
||||||
|
visibility: visibility
|
||||||
),
|
),
|
||||||
getFooter()
|
getFooter()
|
||||||
]
|
]
|
||||||
@ -84,41 +88,87 @@ enum AnalyticsGenerator {
|
|||||||
|
|
||||||
private static func getHeader(
|
private static func getHeader(
|
||||||
targets: [TrackerType],
|
targets: [TrackerType],
|
||||||
extensionClassname: String,
|
staticVar: Bool,
|
||||||
staticVar: Bool
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
"""
|
"""
|
||||||
// Generated by ResgenSwift.\(Analytics.toolName) \(ResgenSwiftVersion)
|
// Generated by ResgenSwift.\(Analytics.toolName) \(ResgenSwiftVersion)
|
||||||
|
|
||||||
\(getImport(targets: targets))
|
\(Self.getImport(targets: targets))
|
||||||
|
|
||||||
|
\(Self.getAnalyticsProtocol(targets: targets, visibility: visibility))
|
||||||
|
|
||||||
|
\(Self.getTrackerTypeEnum(targets: targets, visibility: visibility))
|
||||||
|
|
||||||
\(getAnalyticsProtocol(targets: targets))
|
|
||||||
// MARK: - Manager
|
// MARK: - Manager
|
||||||
|
|
||||||
class AnalyticsManager {
|
\(visibility) class AnalyticsManager {
|
||||||
|
|
||||||
static var shared = AnalyticsManager()
|
\(visibility) static var shared = AnalyticsManager()
|
||||||
|
|
||||||
|
private init() {}
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
var managers: [AnalyticsManagerProtocol] = []
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
\(getEnabledContent())
|
\(Self.getEnabledContent(visibility: visibility))
|
||||||
|
|
||||||
\(getAnalyticsProperties(targets: targets))
|
\(Self.getAnalyticsProperties(targets: targets, visibility: visibility))
|
||||||
|
|
||||||
\(getPrivateLogFunction())
|
\(Self.getPrivateLogFunction())
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getEnabledContent() -> String {
|
private static func getTrackerTypeEnum(
|
||||||
|
targets: [TrackerType],
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
|
var result: [String] = []
|
||||||
|
targets.forEach { type in
|
||||||
|
result.append(" case \(type)")
|
||||||
|
}
|
||||||
|
|
||||||
|
return """
|
||||||
|
// MARK: - Traker Type
|
||||||
|
|
||||||
|
\(visibility) enum TrackerType: CaseIterable {
|
||||||
|
|
||||||
|
\(result.joined(separator: "\n"))
|
||||||
|
}
|
||||||
"""
|
"""
|
||||||
private var isEnabled: Bool = true
|
}
|
||||||
|
|
||||||
// MARK: - Methods
|
private static func getEnabledContent(
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
|
"""
|
||||||
|
private var isEnabled: Bool {
|
||||||
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
|
false
|
||||||
|
} else {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func setAnalyticsEnabled(_ enable: Bool) {
|
// MARK: - Enable Methods
|
||||||
isEnabled = enable
|
|
||||||
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
|
managers.forEach { (key, value) in
|
||||||
|
if analytics.contains(where: { type in
|
||||||
|
type == key
|
||||||
|
}) {
|
||||||
|
value.setEnable(enable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
\(visibility) func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: true, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
\(visibility) func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: false, analytics)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
@ -126,9 +176,12 @@ enum AnalyticsGenerator {
|
|||||||
private static func getImport(targets: [TrackerType]) -> String {
|
private static func getImport(targets: [TrackerType]) -> String {
|
||||||
var result: [String] = []
|
var result: [String] = []
|
||||||
|
|
||||||
|
result.append("import Foundation")
|
||||||
|
|
||||||
if targets.contains(TrackerType.matomo) {
|
if targets.contains(TrackerType.matomo) {
|
||||||
result.append("import MatomoTracker")
|
result.append("import MatomoTracker")
|
||||||
}
|
}
|
||||||
|
|
||||||
if targets.contains(TrackerType.firebase) {
|
if targets.contains(TrackerType.firebase) {
|
||||||
result.append("import FirebaseAnalytics")
|
result.append("import FirebaseAnalytics")
|
||||||
}
|
}
|
||||||
@ -138,11 +191,21 @@ enum AnalyticsGenerator {
|
|||||||
|
|
||||||
private static func getPrivateLogFunction() -> String {
|
private static func getPrivateLogFunction() -> String {
|
||||||
"""
|
"""
|
||||||
private func logScreen(name: String, path: String) {
|
// MARK: - Private Log Methods
|
||||||
|
|
||||||
|
private func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logScreen(name: name, path: path)
|
manager.logScreen(
|
||||||
|
name: name,
|
||||||
|
path: path,
|
||||||
|
params: params
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -154,7 +217,7 @@ enum AnalyticsGenerator {
|
|||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
@ -166,29 +229,31 @@ enum AnalyticsGenerator {
|
|||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getAnalyticsProperties(targets: [TrackerType]) -> String {
|
private static func getAnalyticsProperties(
|
||||||
|
targets: [TrackerType],
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
var header = ""
|
var header = ""
|
||||||
var content: [String] = []
|
var content: [String] = []
|
||||||
let footer = " }"
|
let footer = " }"
|
||||||
|
|
||||||
if targets.contains(TrackerType.matomo) {
|
if targets.contains(TrackerType.matomo) {
|
||||||
header = "func configure(siteId: String, url: String) {"
|
header = "\(visibility) func configure(siteId: String, url: String) {"
|
||||||
} else if targets.contains(TrackerType.firebase) {
|
} else if targets.contains(TrackerType.firebase) {
|
||||||
header = "func configure() {"
|
header = "\(visibility) func configure() {"
|
||||||
}
|
}
|
||||||
|
|
||||||
if targets.contains(TrackerType.matomo) {
|
if targets.contains(TrackerType.matomo) {
|
||||||
content.append("""
|
content.append("""
|
||||||
managers.append(
|
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
||||||
MatomoAnalyticsManager(
|
|
||||||
siteId: siteId,
|
siteId: siteId,
|
||||||
url: url
|
url: url
|
||||||
)
|
)
|
||||||
)
|
|
||||||
""")
|
""")
|
||||||
}
|
}
|
||||||
|
|
||||||
if targets.contains(TrackerType.firebase) {
|
if targets.contains(TrackerType.firebase) {
|
||||||
content.append(" managers.append(FirebaseAnalyticsManager())")
|
content.append(" managers[TrackerType.firebase] = FirebaseAnalyticsManager()")
|
||||||
}
|
}
|
||||||
|
|
||||||
return [
|
return [
|
||||||
@ -199,21 +264,30 @@ enum AnalyticsGenerator {
|
|||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getAnalyticsProtocol(targets: [TrackerType]) -> String {
|
private static func getAnalyticsProtocol(
|
||||||
|
targets: [TrackerType],
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
let proto = """
|
let proto = """
|
||||||
// MARK: - Protocol
|
// MARK: - Protocol
|
||||||
|
|
||||||
protocol AnalyticsManagerProtocol {
|
\(visibility) protocol AnalyticsManagerProtocol {
|
||||||
|
|
||||||
|
func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
)
|
||||||
|
|
||||||
func logScreen(name: String, path: String)
|
|
||||||
func logEvent(
|
func logEvent(
|
||||||
name: String,
|
name: String,
|
||||||
action: String,
|
action: String,
|
||||||
category: String,
|
category: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
)
|
)
|
||||||
}
|
|
||||||
|
|
||||||
|
func setEnable(_ enable: Bool)
|
||||||
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
var result: [String] = [proto]
|
var result: [String] = [proto]
|
||||||
@ -226,13 +300,14 @@ enum AnalyticsGenerator {
|
|||||||
result.append(FirebaseGenerator.service)
|
result.append(FirebaseGenerator.service)
|
||||||
}
|
}
|
||||||
|
|
||||||
return result.joined(separator: "\n")
|
return result.joined(separator: "\n\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getProperties(
|
private static func getProperties(
|
||||||
sections: [AnalyticsCategory],
|
sections: [AnalyticsCategory],
|
||||||
tags: [String],
|
tags: [String],
|
||||||
staticVar: Bool
|
staticVar: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
sections
|
sections
|
||||||
.compactMap { section in
|
.compactMap { section in
|
||||||
@ -248,9 +323,9 @@ enum AnalyticsGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if staticVar {
|
if staticVar {
|
||||||
res += "\n\n\(definition.getStaticProperty())"
|
res += "\n\n\(definition.getStaticProperty(visibility: visibility))"
|
||||||
} else {
|
} else {
|
||||||
res += "\n\n\(definition.getProperty())"
|
res += "\n\n\(definition.getProperty(visibility: visibility))"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
@ -265,3 +340,5 @@ enum AnalyticsGenerator {
|
|||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CPD-ON
|
||||||
|
@ -16,6 +16,7 @@ enum FirebaseGenerator {
|
|||||||
Self.header,
|
Self.header,
|
||||||
Self.logScreen,
|
Self.logScreen,
|
||||||
Self.logEvent,
|
Self.logEvent,
|
||||||
|
Self.enable,
|
||||||
Self.footer
|
Self.footer
|
||||||
]
|
]
|
||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
@ -28,16 +29,39 @@ enum FirebaseGenerator {
|
|||||||
// MARK: - Firebase
|
// MARK: - Firebase
|
||||||
|
|
||||||
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
||||||
|
|
||||||
|
// MARK: - Methods
|
||||||
|
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
private static var logScreen: String {
|
private static var logScreen: String {
|
||||||
"""
|
"""
|
||||||
func logScreen(name: String, path: String) {
|
func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
var parameters = [
|
var parameters = [
|
||||||
AnalyticsParameterScreenName: name as NSObject
|
AnalyticsParameterScreenName: name as NSObject
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if path.isEmpty == false {
|
||||||
|
parameters["path"] = path + "/iOS" as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
|
if let supplementaryParameters = params {
|
||||||
|
for (newKey, newValue) in supplementaryParameters {
|
||||||
|
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||||
|
key == newKey
|
||||||
|
}) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
parameters[newKey] = newValue as? NSObject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Analytics.logEvent(
|
Analytics.logEvent(
|
||||||
AnalyticsEventScreenView,
|
AnalyticsEventScreenView,
|
||||||
parameters: parameters
|
parameters: parameters
|
||||||
@ -56,10 +80,17 @@ enum FirebaseGenerator {
|
|||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
var parameters: [String:NSObject] = [
|
var parameters: [String:NSObject] = [
|
||||||
"action": action as NSObject,
|
AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject
|
||||||
"category": category as NSObject,
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
if category.isEmpty == false {
|
||||||
|
parameters["AnalyticsParameterItemCategory"] = category as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
|
if action.isEmpty == false {
|
||||||
|
parameters["action"] = action as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
if let supplementaryParameters = params {
|
if let supplementaryParameters = params {
|
||||||
for (newKey, newValue) in supplementaryParameters {
|
for (newKey, newValue) in supplementaryParameters {
|
||||||
if parameters.contains(where: { (key: String, value: NSObject) in
|
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||||
@ -73,17 +104,25 @@ enum FirebaseGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Analytics.logEvent(
|
Analytics.logEvent(
|
||||||
name.replacingOccurrences(of: [" "], with: "_"),
|
AnalyticsEventSelectContent,
|
||||||
parameters: parameters
|
parameters: parameters
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
private static var enable: String {
|
||||||
|
"""
|
||||||
|
func setEnable(_ enable: Bool) {
|
||||||
|
Analytics.setAnalyticsCollectionEnabled(enable)
|
||||||
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
private static var footer: String {
|
private static var footer: String {
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,8 @@
|
|||||||
// Created by Loris Perret on 05/12/2023.
|
// Created by Loris Perret on 05/12/2023.
|
||||||
//
|
//
|
||||||
|
|
||||||
|
// CPD-OFF
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
enum MatomoGenerator {
|
enum MatomoGenerator {
|
||||||
@ -15,6 +17,7 @@ enum MatomoGenerator {
|
|||||||
Self.setup,
|
Self.setup,
|
||||||
Self.logScreen,
|
Self.logScreen,
|
||||||
Self.logEvent,
|
Self.logEvent,
|
||||||
|
Self.enable,
|
||||||
Self.footer
|
Self.footer
|
||||||
]
|
]
|
||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
@ -66,8 +69,11 @@ enum MatomoGenerator {
|
|||||||
|
|
||||||
private static var logScreen: String {
|
private static var logScreen: String {
|
||||||
"""
|
"""
|
||||||
func logScreen(name: String, path: String) {
|
func logScreen(
|
||||||
guard !tracker.isOptedOut else { return }
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
||||||
|
|
||||||
let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS")
|
let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS")
|
||||||
@ -88,8 +94,6 @@ enum MatomoGenerator {
|
|||||||
category: String,
|
category: String,
|
||||||
params: [String: Any]?
|
params: [String: Any]?
|
||||||
) {
|
) {
|
||||||
guard !tracker.isOptedOut else { return }
|
|
||||||
|
|
||||||
tracker.track(
|
tracker.track(
|
||||||
eventWithCategory: category,
|
eventWithCategory: category,
|
||||||
action: action,
|
action: action,
|
||||||
@ -98,13 +102,23 @@ enum MatomoGenerator {
|
|||||||
url: nil
|
url: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
private static var enable: String {
|
||||||
|
"""
|
||||||
|
func setEnable(_ enable: Bool) {
|
||||||
|
tracker.isOptedOut = !enable
|
||||||
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
private static var footer: String {
|
private static var footer: String {
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CPD-ON
|
||||||
|
@ -51,17 +51,25 @@ class AnalyticsDefinition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private func getParameters() -> String {
|
private func getParameters() -> String {
|
||||||
var params = parameters
|
|
||||||
var result: String
|
var result: String
|
||||||
|
|
||||||
if type == .screen {
|
let paramsString = parameters.compactMap { parameter -> String? in
|
||||||
params = params.filter { param in
|
guard parameter.value.isEmpty else { return nil }
|
||||||
!param.replaceIn.isEmpty
|
|
||||||
}
|
let defaultValue: String
|
||||||
|
switch parameter.type {
|
||||||
|
case .bool:
|
||||||
|
defaultValue = "\(parameter.defaultValue.lowercased())"
|
||||||
|
|
||||||
|
case .int, .double:
|
||||||
|
defaultValue = "\(parameter.defaultValue)"
|
||||||
|
|
||||||
|
case .string:
|
||||||
|
defaultValue = "\"\(parameter.defaultValue)\""
|
||||||
}
|
}
|
||||||
|
|
||||||
let paramsString = params.map { parameter in
|
let defaultValueString = parameter.defaultValue.isEmpty ? "" : " = \(defaultValue)"
|
||||||
"\(parameter.name): \(parameter.type)"
|
return "\(parameter.name): \(parameter.type.rawValue)\(defaultValueString)"
|
||||||
}
|
}
|
||||||
|
|
||||||
if paramsString.count > 2 {
|
if paramsString.count > 2 {
|
||||||
@ -84,10 +92,17 @@ class AnalyticsDefinition {
|
|||||||
for rep in parameter.replaceIn {
|
for rep in parameter.replaceIn {
|
||||||
switch rep {
|
switch rep {
|
||||||
case "name": name = name.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
case "name": name = name.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||||
|
|
||||||
case "path": path = path.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
case "path": path = path.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||||
|
|
||||||
case "category": category = category.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
case "category": category = category.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||||
|
|
||||||
case "action": action = action.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
case "action": action = action.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||||
default: break
|
|
||||||
|
default:
|
||||||
|
if let param = parameters.first(where: { $0.name == rep }), param.value.isEmpty == false {
|
||||||
|
param.value = param.value.replacingFirstOccurrence(of: "_\(parameter.name.uppercased())_", with: "\\(\(parameter.name))")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -102,7 +117,20 @@ class AnalyticsDefinition {
|
|||||||
}
|
}
|
||||||
|
|
||||||
supplementaryParams.forEach { param in
|
supplementaryParams.forEach { param in
|
||||||
|
if param.value.isEmpty {
|
||||||
params.append("\"\(param.name)\": \(param.name)")
|
params.append("\"\(param.name)\": \(param.name)")
|
||||||
|
} else {
|
||||||
|
switch param.type {
|
||||||
|
case .bool:
|
||||||
|
params.append("\"\(param.name)\": \(param.value.lowercased())")
|
||||||
|
|
||||||
|
case .int, .double:
|
||||||
|
params.append("\"\(param.name)\": \(param.value)")
|
||||||
|
|
||||||
|
case .string:
|
||||||
|
params.append("\"\(param.name)\": \"\(param.value)\"")
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if params.count > 1 {
|
if params.count > 1 {
|
||||||
@ -116,14 +144,15 @@ class AnalyticsDefinition {
|
|||||||
[\(params.joined(separator: ", "))]
|
[\(params.joined(separator: ", "))]
|
||||||
"""
|
"""
|
||||||
} else {
|
} else {
|
||||||
result = "[:]"
|
result = "nil"
|
||||||
}
|
}
|
||||||
|
|
||||||
if type == .screen {
|
if type == .screen {
|
||||||
return """
|
return """
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "\(name)",
|
name: "\(name)",
|
||||||
path: "\(path)"
|
path: "\(path)",
|
||||||
|
params: \(result)
|
||||||
)
|
)
|
||||||
"""
|
"""
|
||||||
} else {
|
} else {
|
||||||
@ -140,20 +169,20 @@ class AnalyticsDefinition {
|
|||||||
|
|
||||||
// MARK: - Raw strings
|
// MARK: - Raw strings
|
||||||
|
|
||||||
func getProperty() -> String {
|
func getProperty(visibility: ExtensionVisibility) -> String {
|
||||||
replaceIn()
|
replaceIn()
|
||||||
return """
|
return """
|
||||||
func \(getFuncName())\(getParameters()) {
|
\(visibility) func \(getFuncName())\(getParameters()) {
|
||||||
\(getlogFunction())
|
\(getlogFunction())
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
func getStaticProperty() -> String {
|
func getStaticProperty(visibility: ExtensionVisibility) -> String {
|
||||||
replaceIn()
|
replaceIn()
|
||||||
return """
|
return """
|
||||||
static func \(getFuncName())\(getParameters()) {
|
\(visibility) static func \(getFuncName())\(getParameters()) {
|
||||||
\(getlogFunction())
|
AnalyticsManager.shared.\(getlogFunction())
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
@ -46,5 +46,7 @@ struct AnalyticsParameterDTO: Codable {
|
|||||||
|
|
||||||
var name: String
|
var name: String
|
||||||
var type: String
|
var type: String
|
||||||
|
var value: String?
|
||||||
|
var defaultValue: String?
|
||||||
var replaceIn: String?
|
var replaceIn: String?
|
||||||
}
|
}
|
||||||
|
@ -12,13 +12,17 @@ class AnalyticsParameter {
|
|||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
var name: String
|
var name: String
|
||||||
var type: String
|
var type: ParameterType
|
||||||
|
var value: String
|
||||||
|
var defaultValue: String
|
||||||
var replaceIn: [String] = []
|
var replaceIn: [String] = []
|
||||||
|
|
||||||
// MARK: - Init
|
// MARK: - Init
|
||||||
|
|
||||||
init(name: String, type: String) {
|
init(name: String, type: ParameterType, value: String, defaultValue: String) {
|
||||||
self.name = name
|
self.name = name
|
||||||
self.type = type
|
self.type = type
|
||||||
|
self.value = value
|
||||||
|
self.defaultValue = defaultValue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
Sources/ResgenSwift/Analytics/Model/ParameterType.swift
Normal file
16
Sources/ResgenSwift/Analytics/Model/ParameterType.swift
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
//
|
||||||
|
// File.swift
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// Created by Loris Perret on 17/07/2024.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
enum ParameterType: String {
|
||||||
|
|
||||||
|
case string = "String"
|
||||||
|
case int = "Int"
|
||||||
|
case double = "Double"
|
||||||
|
case bool = "Bool"
|
||||||
|
}
|
@ -67,25 +67,61 @@ class AnalyticsFileParser {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func getParameters(from parameters: [AnalyticsParameterDTO]) -> [AnalyticsParameter] {
|
private static func getParameters(from parameters: [AnalyticsParameterDTO]) -> [AnalyticsParameter] {
|
||||||
parameters.map { dtoParameter in
|
func verify(value: String?, for type: ParameterType) {
|
||||||
|
guard let value, value.isEmpty == false else { return }
|
||||||
|
|
||||||
|
switch type {
|
||||||
|
case .int:
|
||||||
|
if Int(value) == nil {
|
||||||
|
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
|
||||||
|
print(error.description)
|
||||||
|
Analytics.exit(withError: error)
|
||||||
|
}
|
||||||
|
|
||||||
|
case .bool:
|
||||||
|
if Bool(value.lowercased()) == nil {
|
||||||
|
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
|
||||||
|
print(error.description)
|
||||||
|
Analytics.exit(withError: error)
|
||||||
|
}
|
||||||
|
|
||||||
|
case .double:
|
||||||
|
if Double(value) == nil {
|
||||||
|
let error = AnalyticsError.invalidParameter("type of \(value) is not \(type)")
|
||||||
|
print(error.description)
|
||||||
|
Analytics.exit(withError: error)
|
||||||
|
}
|
||||||
|
|
||||||
|
case .string:
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return parameters.map { dtoParameter in
|
||||||
// Type
|
// Type
|
||||||
let type = dtoParameter.type.uppercasedFirst()
|
let type = dtoParameter.type.uppercasedFirst()
|
||||||
|
|
||||||
guard
|
guard let typeEnum = ParameterType(rawValue: type) else {
|
||||||
type == "String" ||
|
|
||||||
type == "Int" ||
|
|
||||||
type == "Double" ||
|
|
||||||
type == "Bool"
|
|
||||||
else {
|
|
||||||
let error = AnalyticsError.invalidParameter("type of \(dtoParameter.name)")
|
let error = AnalyticsError.invalidParameter("type of \(dtoParameter.name)")
|
||||||
print(error.description)
|
print(error.description)
|
||||||
Analytics.exit(withError: error)
|
Analytics.exit(withError: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if dtoParameter.value != nil, dtoParameter.replaceIn != nil {
|
||||||
|
let error = AnalyticsError.invalidParameter("you can't set 'value' and 'replaceIn' for \(dtoParameter.name)")
|
||||||
|
print(error.description)
|
||||||
|
Analytics.exit(withError: error)
|
||||||
|
}
|
||||||
|
|
||||||
|
verify(value: dtoParameter.value, for: typeEnum)
|
||||||
|
verify(value: dtoParameter.defaultValue, for: typeEnum)
|
||||||
|
|
||||||
let parameter = AnalyticsParameter(
|
let parameter = AnalyticsParameter(
|
||||||
name: dtoParameter.name,
|
name: dtoParameter.name,
|
||||||
type: type
|
type: typeEnum,
|
||||||
|
value: dtoParameter.value ?? "",
|
||||||
|
defaultValue: dtoParameter.defaultValue ?? ""
|
||||||
)
|
)
|
||||||
|
|
||||||
if let replaceIn = dtoParameter.replaceIn {
|
if let replaceIn = dtoParameter.replaceIn {
|
||||||
@ -114,7 +150,7 @@ class AnalyticsFileParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if let parameters {
|
if let parameters {
|
||||||
definition.parameters = getParameters(from: parameters)
|
definition.parameters = Self.getParameters(from: parameters)
|
||||||
}
|
}
|
||||||
|
|
||||||
return definition
|
return definition
|
||||||
@ -140,6 +176,8 @@ class AnalyticsFileParser {
|
|||||||
Analytics.exit(withError: error)
|
Analytics.exit(withError: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
definition.path = path
|
||||||
|
} else if let path = screen.path {
|
||||||
definition.path = path
|
definition.path = path
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -176,6 +214,14 @@ class AnalyticsFileParser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
definition.action = action
|
definition.action = action
|
||||||
|
} else {
|
||||||
|
if let category = event.category {
|
||||||
|
definition.category = category
|
||||||
|
}
|
||||||
|
|
||||||
|
if let action = event.action {
|
||||||
|
definition.action = action
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return definition
|
return definition
|
||||||
|
@ -21,8 +21,6 @@ struct Colors: ParsableCommand {
|
|||||||
// MARK: - Static
|
// MARK: - Static
|
||||||
|
|
||||||
static let toolName = "Color"
|
static let toolName = "Color"
|
||||||
static let defaultExtensionName = "Color"
|
|
||||||
static let defaultExtensionNameUIKit = "UIColor"
|
|
||||||
static let assetsColorsFolderName = "Colors"
|
static let assetsColorsFolderName = "Colors"
|
||||||
|
|
||||||
// MARK: - Command options
|
// MARK: - Command options
|
||||||
@ -57,22 +55,30 @@ struct Colors: ParsableCommand {
|
|||||||
// -> Time: 3.4505380392074585 seconds
|
// -> Time: 3.4505380392074585 seconds
|
||||||
|
|
||||||
// Generate extension
|
// Generate extension
|
||||||
|
if let extensionName = options.extensionName,
|
||||||
|
let extensionFilePath = options.extensionFilePath {
|
||||||
ColorExtensionGenerator.writeExtensionFile(
|
ColorExtensionGenerator.writeExtensionFile(
|
||||||
colors: parsedColors,
|
colors: parsedColors,
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
extensionName: options.extensionName,
|
extensionName: extensionName,
|
||||||
extensionFilePath: options.extensionFilePath,
|
extensionFilePath: extensionFilePath,
|
||||||
isSwiftUI: true
|
isSwiftUI: true,
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
// Generate extension
|
// Generate extension
|
||||||
|
if let extensionNameUIKit = options.extensionNameUIKit,
|
||||||
|
let extensionFilePathUIKit = options.extensionFilePathUIKit {
|
||||||
ColorExtensionGenerator.writeExtensionFile(
|
ColorExtensionGenerator.writeExtensionFile(
|
||||||
colors: parsedColors,
|
colors: parsedColors,
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
extensionName: options.extensionNameUIKit,
|
extensionName: extensionNameUIKit,
|
||||||
extensionFilePath: options.extensionFilePathUIKit,
|
extensionFilePath: extensionFilePathUIKit,
|
||||||
isSwiftUI: false
|
isSwiftUI: false,
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
print("[\(Self.toolName)] Colors generated")
|
print("[\(Self.toolName)] Colors generated")
|
||||||
}
|
}
|
||||||
@ -96,18 +102,40 @@ struct Colors: ParsableCommand {
|
|||||||
Self.exit(withError: error)
|
Self.exit(withError: error)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Extension for UIKit and SwiftUI should have different name
|
// Extension for UIKit and SwiftUI should have different name (if both are defined)
|
||||||
guard options.extensionName != options.extensionNameUIKit else {
|
if let extensionName = options.extensionName,
|
||||||
let error = ColorsToolError.extensionNamesCollision(options.extensionName)
|
let extensionNameUIKit = options.extensionNameUIKit {
|
||||||
|
guard extensionName != extensionNameUIKit else {
|
||||||
|
let error = ColorsToolError.extensionNamesCollision(extensionName)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
Self.exit(withError: error)
|
Self.exit(withError: error)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an extension need to be generated, ensure extensionOutputPath is defined
|
||||||
|
if options.extensionName != nil ||
|
||||||
|
options.extensionNameUIKit != nil {
|
||||||
|
guard let extensionOutputPath = options.extensionOutputPath,
|
||||||
|
extensionOutputPath.isEmpty == false else {
|
||||||
|
let error = ColorsToolError.missingExtensionPath
|
||||||
|
print(error.description)
|
||||||
|
Self.exit(withError: error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check if needed to regenerate
|
// Check if needed to regenerate
|
||||||
|
let fileToCompareToInput: String = {
|
||||||
|
// If there is no extension file to compare
|
||||||
|
// Then check the xcassets file instead
|
||||||
|
if let extensionFilePath = options.extensionFilePath {
|
||||||
|
return extensionFilePath
|
||||||
|
}
|
||||||
|
return options.xcassetsPath
|
||||||
|
}()
|
||||||
guard GeneratorChecker.shouldGenerate(
|
guard GeneratorChecker.shouldGenerate(
|
||||||
force: options.forceGeneration,
|
force: options.forceGeneration,
|
||||||
inputFilePath: options.inputFile,
|
inputFilePath: options.inputFile,
|
||||||
extensionFilePath: options.extensionFilePath
|
extensionFilePath: fileToCompareToInput
|
||||||
) else {
|
) else {
|
||||||
print("[\(Self.toolName)] Colors are already up to date :) ")
|
print("[\(Self.toolName)] Colors are already up to date :) ")
|
||||||
return false
|
return false
|
||||||
|
@ -17,11 +17,12 @@ enum ColorsToolError: Error {
|
|||||||
case fileNotExists(String)
|
case fileNotExists(String)
|
||||||
case badColorDefinition(String, String)
|
case badColorDefinition(String, String)
|
||||||
case deleteExistingColors(String)
|
case deleteExistingColors(String)
|
||||||
|
case missingExtensionPath
|
||||||
|
|
||||||
var description: String {
|
var description: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .extensionNamesCollision(let extensionName):
|
case .extensionNamesCollision(let extensionName):
|
||||||
return "error: [\(Fonts.toolName)] Error on extension names, extension name and SwiftUI extension name should be different (\(extensionName) is used on both)"
|
return "error: [\(Colors.toolName)] Error on extension names, extension name and SwiftUI extension name should be different (\(extensionName) is used on both)"
|
||||||
|
|
||||||
case .badFormat(let info):
|
case .badFormat(let info):
|
||||||
return "error: [\(Colors.toolName)] Bad line format: \(info). Accepted format are: colorName=\"#RGB/#ARGB\"; colorName \"#RGB/#ARGB\"; colorName \"#RGB/#ARGB\" \"#RGB/#ARGB\""
|
return "error: [\(Colors.toolName)] Bad line format: \(info). Accepted format are: colorName=\"#RGB/#ARGB\"; colorName \"#RGB/#ARGB\"; colorName \"#RGB/#ARGB\" \"#RGB/#ARGB\""
|
||||||
@ -43,6 +44,9 @@ enum ColorsToolError: Error {
|
|||||||
|
|
||||||
case .deleteExistingColors(let assetsFolder):
|
case .deleteExistingColors(let assetsFolder):
|
||||||
return "error: [\(Colors.toolName)] An error occured while deleting colors folder `\(assetsFolder)`"
|
return "error: [\(Colors.toolName)] An error occured while deleting colors folder `\(assetsFolder)`"
|
||||||
|
|
||||||
|
case .missingExtensionPath:
|
||||||
|
return "error: [\(Colors.toolName)] Extension need to be generated but no `extensionOutputPath` is provided"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,34 +7,54 @@
|
|||||||
|
|
||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
// swiftlint:disable no_grouping_extension
|
// swiftlint:disable no_grouping_extension
|
||||||
|
|
||||||
struct ColorsToolOptions: ParsableArguments {
|
struct ColorsToolOptions: ParsableArguments {
|
||||||
|
|
||||||
@Flag(name: [.customShort("f"), .customShort("F")], help: "Should force generation")
|
@Flag(
|
||||||
|
name: [.customShort("f"), .customShort("F")],
|
||||||
|
help: "Should force generation"
|
||||||
|
)
|
||||||
var forceGeneration = false
|
var forceGeneration = false
|
||||||
|
|
||||||
@Argument(help: "Input files where colors ared defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Argument(
|
||||||
|
help: "Input files where colors ared defined.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
var inputFile: String
|
var inputFile: String
|
||||||
|
|
||||||
@Option(help: "Color style to generate: light for light colors only, or all for dark and light colors")
|
@Option(help: "Color style to generate: light for light colors only, or all for dark and light colors")
|
||||||
var style: ColorStyle
|
var style: ColorStyle
|
||||||
|
|
||||||
@Option(help: "Path of xcassets where to generate colors", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(
|
||||||
|
help: "Path of xcassets where to generate colors",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
var xcassetsPath: String
|
var xcassetsPath: String
|
||||||
|
|
||||||
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
|
||||||
var extensionOutputPath: String
|
|
||||||
|
|
||||||
@Option(help: "Tell if it will generate static properties or not")
|
@Option(help: "Tell if it will generate static properties or not")
|
||||||
var staticMembers: Bool = false
|
var staticMembers: Bool = false
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate an Color extension.")
|
@Option(
|
||||||
var extensionName: String = Colors.defaultExtensionName
|
name: .customLong("visibility"),
|
||||||
|
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
|
||||||
|
completion: .list(["public", "private", "package", "internal"])
|
||||||
|
)
|
||||||
|
var extensionVisibility: ExtensionVisibility = .internal
|
||||||
|
|
||||||
@Option(help: "SwiftUI Extension name. If not specified, it will generate an UIColor extension.")
|
@Option(
|
||||||
var extensionNameUIKit: String = Colors.defaultExtensionNameUIKit
|
help: "Path where to generate the extension.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
|
var extensionOutputPath: String?
|
||||||
|
|
||||||
|
@Option(help: "SwiftUI extension name. If not specified, no extension will be generated.")
|
||||||
|
var extensionName: String?
|
||||||
|
|
||||||
|
@Option(help: "UIKit extension name. If not specified, no extension will be generated.")
|
||||||
|
var extensionNameUIKit: String?
|
||||||
|
|
||||||
@Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+ColorsMyApp.swift")
|
@Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+ColorsMyApp.swift")
|
||||||
var extensionSuffix: String?
|
var extensionSuffix: String?
|
||||||
@ -46,27 +66,35 @@ extension ColorsToolOptions {
|
|||||||
|
|
||||||
// MARK: - SwiftUI
|
// MARK: - SwiftUI
|
||||||
|
|
||||||
var extensionFileName: String {
|
var extensionFileName: String? {
|
||||||
|
guard let extensionName else { return nil }
|
||||||
|
|
||||||
if let extensionSuffix {
|
if let extensionSuffix {
|
||||||
return "\(extensionName)+\(extensionSuffix).swift"
|
return "\(extensionName)+\(extensionSuffix).swift"
|
||||||
}
|
}
|
||||||
return "\(extensionName).swift"
|
return "\(extensionName).swift"
|
||||||
}
|
}
|
||||||
|
|
||||||
var extensionFilePath: String {
|
var extensionFilePath: String? {
|
||||||
"\(extensionOutputPath)/\(extensionFileName)"
|
guard let extensionOutputPath, let extensionFileName else { return nil }
|
||||||
|
|
||||||
|
return "\(extensionOutputPath)/\(extensionFileName)"
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UIKit
|
// MARK: - UIKit
|
||||||
|
|
||||||
var extensionFileNameUIKit: String {
|
var extensionFileNameUIKit: String? {
|
||||||
|
guard let extensionNameUIKit else { return nil }
|
||||||
|
|
||||||
if let extensionSuffix {
|
if let extensionSuffix {
|
||||||
return "\(extensionNameUIKit)+\(extensionSuffix).swift"
|
return "\(extensionNameUIKit)+\(extensionSuffix).swift"
|
||||||
}
|
}
|
||||||
return "\(extensionNameUIKit).swift"
|
return "\(extensionNameUIKit).swift"
|
||||||
}
|
}
|
||||||
|
|
||||||
var extensionFilePathUIKit: String {
|
var extensionFilePathUIKit: String? {
|
||||||
"\(extensionOutputPath)/\(extensionFileNameUIKit)"
|
guard let extensionOutputPath, let extensionFileNameUIKit else { return nil }
|
||||||
|
|
||||||
|
return "\(extensionOutputPath)/\(extensionFileNameUIKit)"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,16 @@ struct ColorExtensionGenerator {
|
|||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
extensionFilePath: String,
|
extensionFilePath: String,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) {
|
) {
|
||||||
// Create extension content
|
// Create extension content
|
||||||
let extensionContent = Self.getExtensionContent(
|
let extensionContent = Self.getExtensionContent(
|
||||||
colors: colors,
|
colors: colors,
|
||||||
staticVar: staticVar,
|
staticVar: staticVar,
|
||||||
extensionName: extensionName,
|
extensionName: extensionName,
|
||||||
isSwiftUI: isSwiftUI
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Write content
|
// Write content
|
||||||
@ -45,11 +47,20 @@ struct ColorExtensionGenerator {
|
|||||||
colors: [ParsedColor],
|
colors: [ParsedColor],
|
||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
[
|
[
|
||||||
Self.getHeader(extensionClassname: extensionName, isSwiftUI: isSwiftUI),
|
Self.getHeader(
|
||||||
Self.getProperties(for: colors, withStaticVar: staticVar, isSwiftUI: isSwiftUI),
|
extensionClassname: extensionName,
|
||||||
|
isSwiftUI: isSwiftUI
|
||||||
|
),
|
||||||
|
Self.getProperties(
|
||||||
|
for: colors,
|
||||||
|
withStaticVar: staticVar,
|
||||||
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
|
),
|
||||||
Self.getFooter()
|
Self.getFooter()
|
||||||
]
|
]
|
||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
@ -75,10 +86,15 @@ struct ColorExtensionGenerator {
|
|||||||
private static func getProperties(
|
private static func getProperties(
|
||||||
for colors: [ParsedColor],
|
for colors: [ParsedColor],
|
||||||
withStaticVar staticVar: Bool,
|
withStaticVar staticVar: Bool,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
colors.map {
|
colors.map {
|
||||||
$0.getColorProperty(isStatic: staticVar, isSwiftUI: isSwiftUI)
|
$0.getColorProperty(
|
||||||
|
isStatic: staticVar,
|
||||||
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
|
)
|
||||||
}
|
}
|
||||||
.joined(separator: "\n\n")
|
.joined(separator: "\n\n")
|
||||||
}
|
}
|
||||||
|
@ -6,14 +6,19 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
struct ParsedColor {
|
struct ParsedColor {
|
||||||
|
|
||||||
|
// MARK: - Properties
|
||||||
|
|
||||||
let name: String
|
let name: String
|
||||||
let light: String
|
let light: String
|
||||||
let dark: String
|
let dark: String
|
||||||
|
|
||||||
// Generate Contents.json content
|
// MARK: - Contents.json
|
||||||
|
|
||||||
|
/// Generate Contents.json content
|
||||||
func contentsJSON() -> String {
|
func contentsJSON() -> String {
|
||||||
let lightARGB = light.colorComponent()
|
let lightARGB = light.colorComponent()
|
||||||
let darkARGB = dark.colorComponent()
|
let darkARGB = dark.colorComponent()
|
||||||
@ -73,20 +78,24 @@ struct ParsedColor {
|
|||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UIKit
|
// MARK: - Property
|
||||||
|
|
||||||
func getColorProperty(isStatic: Bool, isSwiftUI: Bool) -> String {
|
func getColorProperty(
|
||||||
|
isStatic: Bool,
|
||||||
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
if isSwiftUI {
|
if isSwiftUI {
|
||||||
return """
|
return """
|
||||||
/// Color \(name) is \(light) (light) or \(dark) (dark)"
|
/// Color \(name) is \(light) (light) or \(dark) (dark)"
|
||||||
\(isStatic ? "static " : "")var \(name): Color {
|
\(visibility) \(isStatic ? "static " : "")var \(name): Color {
|
||||||
Color("\(name)")
|
Color("\(name)")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
return """
|
return """
|
||||||
/// Color \(name) is \(light) (light) or \(dark) (dark)"
|
/// Color \(name) is \(light) (light) or \(dark) (dark)"
|
||||||
\(isStatic ? "static " : "@objc ")var \(name): UIColor {
|
\(isStatic ? "" : "@objc ")\(visibility) \(isStatic ? "static " : "")var \(name): UIColor {
|
||||||
UIColor(named: "\(name)")!
|
UIColor(named: "\(name)")!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
// swiftlint:disable no_grouping_extension
|
// swiftlint:disable no_grouping_extension
|
||||||
|
|
||||||
@ -18,20 +19,27 @@ struct FontsOptions: ParsableArguments {
|
|||||||
@Argument(help: "Input files where fonts ared defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Argument(help: "Input files where fonts ared defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
||||||
var inputFile: String
|
var inputFile: String
|
||||||
|
|
||||||
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
|
||||||
var extensionOutputPath: String
|
|
||||||
|
|
||||||
@Option(help: "Tell if it will generate static properties or methods")
|
@Option(help: "Tell if it will generate static properties or methods")
|
||||||
var staticMembers: Bool = false
|
var staticMembers: Bool = false
|
||||||
|
|
||||||
|
@Option(
|
||||||
|
name: .customLong("visibility"),
|
||||||
|
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
|
||||||
|
completion: .list(["public", "private", "package", "internal"])
|
||||||
|
)
|
||||||
|
var extensionVisibility: ExtensionVisibility = .internal
|
||||||
|
|
||||||
|
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
||||||
|
var extensionOutputPath: String
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate an Font extension.")
|
@Option(help: "Extension name. If not specified, it will generate an Font extension.")
|
||||||
var extensionName: String = Fonts.defaultExtensionName
|
var extensionName: String = Fonts.defaultExtensionName
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate an UIFont extension.")
|
@Option(help: "Extension name. If not specified, no extension will be generated.")
|
||||||
var extensionNameUIKit: String = Fonts.defaultExtensionNameUIKit
|
var extensionNameUIKit: String?
|
||||||
|
|
||||||
@Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+FontsMyApp.swift")
|
@Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+FontsMyApp.swift")
|
||||||
var extensionSuffix: String = ""
|
var extensionSuffix: String?
|
||||||
|
|
||||||
@Option(name: .customLong("info-plist-paths"), help: "Info.plist paths (array). Will be used to update UIAppFonts content")
|
@Option(name: .customLong("info-plist-paths"), help: "Info.plist paths (array). Will be used to update UIAppFonts content")
|
||||||
fileprivate var infoPlistPathsRaw: String = ""
|
fileprivate var infoPlistPathsRaw: String = ""
|
||||||
@ -44,7 +52,7 @@ extension FontsOptions {
|
|||||||
// MARK: - SwiftUI
|
// MARK: - SwiftUI
|
||||||
|
|
||||||
var extensionFileName: String {
|
var extensionFileName: String {
|
||||||
if extensionSuffix.isEmpty == false {
|
if let extensionSuffix {
|
||||||
return "\(extensionName)+\(extensionSuffix).swift"
|
return "\(extensionName)+\(extensionSuffix).swift"
|
||||||
}
|
}
|
||||||
return "\(extensionName).swift"
|
return "\(extensionName).swift"
|
||||||
@ -56,15 +64,19 @@ extension FontsOptions {
|
|||||||
|
|
||||||
// MARK: - UIKit
|
// MARK: - UIKit
|
||||||
|
|
||||||
var extensionFileNameUIKit: String {
|
var extensionFileNameUIKit: String? {
|
||||||
if extensionSuffix.isEmpty == false {
|
guard let extensionNameUIKit else { return nil }
|
||||||
|
|
||||||
|
if let extensionSuffix {
|
||||||
return "\(extensionNameUIKit)+\(extensionSuffix).swift"
|
return "\(extensionNameUIKit)+\(extensionSuffix).swift"
|
||||||
}
|
}
|
||||||
return "\(extensionNameUIKit).swift"
|
return "\(extensionNameUIKit).swift"
|
||||||
}
|
}
|
||||||
|
|
||||||
var extensionFilePathUIKit: String {
|
var extensionFilePathUIKit: String? {
|
||||||
"\(extensionOutputPath)/\(extensionFileNameUIKit)"
|
guard let extensionFileNameUIKit else { return nil }
|
||||||
|
|
||||||
|
return "\(extensionOutputPath)/\(extensionFileNameUIKit)"
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: -
|
// MARK: -
|
||||||
|
@ -22,7 +22,6 @@ struct Fonts: ParsableCommand {
|
|||||||
|
|
||||||
static let toolName = "Fonts"
|
static let toolName = "Fonts"
|
||||||
static let defaultExtensionName = "Font"
|
static let defaultExtensionName = "Font"
|
||||||
static let defaultExtensionNameUIKit = "UIFont"
|
|
||||||
|
|
||||||
// MARK: - Command Options
|
// MARK: - Command Options
|
||||||
|
|
||||||
@ -58,19 +57,30 @@ struct Fonts: ParsableCommand {
|
|||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
extensionName: options.extensionName,
|
extensionName: options.extensionName,
|
||||||
extensionFilePath: options.extensionFilePath,
|
extensionFilePath: options.extensionFilePath,
|
||||||
isSwiftUI: true
|
isSwiftUI: true,
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if let extensionNameUIKit = options.extensionNameUIKit,
|
||||||
|
let extensionFilePathUIKit = options.extensionFilePathUIKit {
|
||||||
FontExtensionGenerator.writeExtensionFile(
|
FontExtensionGenerator.writeExtensionFile(
|
||||||
fontsNames: fontsNames,
|
fontsNames: fontsNames,
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
extensionName: options.extensionNameUIKit,
|
extensionName: extensionNameUIKit,
|
||||||
extensionFilePath: options.extensionFilePathUIKit,
|
extensionFilePath: extensionFilePathUIKit,
|
||||||
isSwiftUI: false
|
isSwiftUI: false,
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if options.infoPlistPaths.isEmpty == false {
|
||||||
|
let plistUpdateFontsData = FontPlistGenerator.generatePlistUIAppsFontContent(
|
||||||
|
for: fontsNames,
|
||||||
|
infoPlistPaths: options.infoPlistPaths
|
||||||
|
)
|
||||||
print("Info.plist has been updated with:")
|
print("Info.plist has been updated with:")
|
||||||
print("\(FontPlistGenerator.generatePlistUIAppsFontContent(for: fontsNames, infoPlistPaths: options.infoPlistPaths))")
|
print(plistUpdateFontsData)
|
||||||
|
}
|
||||||
|
|
||||||
print("[\(Self.toolName)] Fonts generated")
|
print("[\(Self.toolName)] Fonts generated")
|
||||||
}
|
}
|
||||||
|
@ -14,6 +14,7 @@ enum FontsToolError: Error {
|
|||||||
case inputFolderNotFound(String)
|
case inputFolderNotFound(String)
|
||||||
case fileNotExists(String)
|
case fileNotExists(String)
|
||||||
case writeExtension(String, String)
|
case writeExtension(String, String)
|
||||||
|
case missingExtensionPath
|
||||||
|
|
||||||
var description: String {
|
var description: String {
|
||||||
switch self {
|
switch self {
|
||||||
@ -31,6 +32,9 @@ enum FontsToolError: Error {
|
|||||||
|
|
||||||
case let .writeExtension(filename, info):
|
case let .writeExtension(filename, info):
|
||||||
return "error: [\(Fonts.toolName)] An error occured while writing extension in \(filename): \(info)"
|
return "error: [\(Fonts.toolName)] An error occured while writing extension in \(filename): \(info)"
|
||||||
|
|
||||||
|
case .missingExtensionPath:
|
||||||
|
return "error: [\(Fonts.toolName)] Extension need to be generated but no `extensionOutputPath` is provided"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,8 +10,11 @@ import ToolCore
|
|||||||
|
|
||||||
enum FontExtensionGenerator {
|
enum FontExtensionGenerator {
|
||||||
|
|
||||||
private static func getFontNameEnum(fontsNames: [FontName]) -> String {
|
private static func getFontNameEnum(
|
||||||
var enumDefinition = " enum FontName: String {\n"
|
fontsNames: [FontName],
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
|
var enumDefinition = " \(visibility) enum FontName: String {\n"
|
||||||
|
|
||||||
fontsNames.forEach {
|
fontsNames.forEach {
|
||||||
enumDefinition += " case \($0.fontNameSanitize) = \"\($0.postscriptName)\"\n"
|
enumDefinition += " case \($0.fontNameSanitize) = \"\($0.postscriptName)\"\n"
|
||||||
@ -26,14 +29,16 @@ enum FontExtensionGenerator {
|
|||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
extensionFilePath: String,
|
extensionFilePath: String,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) {
|
) {
|
||||||
// Create extension content
|
// Create extension content
|
||||||
let extensionContent = Self.getExtensionContent(
|
let extensionContent = Self.getExtensionContent(
|
||||||
fontsNames: fontsNames,
|
fontsNames: fontsNames,
|
||||||
staticVar: staticVar,
|
staticVar: staticVar,
|
||||||
extensionName: extensionName,
|
extensionName: extensionName,
|
||||||
isSwiftUI: isSwiftUI
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Write content
|
// Write content
|
||||||
@ -51,18 +56,33 @@ enum FontExtensionGenerator {
|
|||||||
fontsNames: [FontName],
|
fontsNames: [FontName],
|
||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
[
|
[
|
||||||
Self.getHeader(extensionClassname: extensionName, isSwiftUI: isSwiftUI),
|
Self.getHeader(
|
||||||
Self.getFontNameEnum(fontsNames: fontsNames),
|
extensionClassname: extensionName,
|
||||||
Self.getFontMethods(fontsNames: fontsNames, staticVar: staticVar, isSwiftUI: isSwiftUI),
|
isSwiftUI: isSwiftUI
|
||||||
|
),
|
||||||
|
Self.getFontNameEnum(
|
||||||
|
fontsNames: fontsNames,
|
||||||
|
visibility: visibility
|
||||||
|
),
|
||||||
|
Self.getFontMethods(
|
||||||
|
fontsNames: fontsNames,
|
||||||
|
staticVar: staticVar,
|
||||||
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
|
),
|
||||||
Self.getFooter()
|
Self.getFooter()
|
||||||
]
|
]
|
||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getHeader(extensionClassname: String, isSwiftUI: Bool) -> String {
|
private static func getHeader(
|
||||||
|
extensionClassname: String,
|
||||||
|
isSwiftUI: Bool
|
||||||
|
) -> String {
|
||||||
"""
|
"""
|
||||||
// Generated by ResgenSwift.\(Fonts.toolName) \(ResgenSwiftVersion)
|
// Generated by ResgenSwift.\(Fonts.toolName) \(ResgenSwiftVersion)
|
||||||
|
|
||||||
@ -72,13 +92,22 @@ enum FontExtensionGenerator {
|
|||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getFontMethods(fontsNames: [FontName], staticVar: Bool, isSwiftUI: Bool) -> String {
|
private static func getFontMethods(
|
||||||
|
fontsNames: [FontName],
|
||||||
|
staticVar: Bool,
|
||||||
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
let pragma = " // MARK: - Getter"
|
let pragma = " // MARK: - Getter"
|
||||||
|
|
||||||
var propertiesOrMethods: [String] = fontsNames
|
var propertiesOrMethods: [String] = fontsNames
|
||||||
.unique()
|
.unique()
|
||||||
.map {
|
.map {
|
||||||
$0.getProperty(isStatic: staticVar, isSwiftUI: isSwiftUI)
|
$0.getProperty(
|
||||||
|
isStatic: staticVar,
|
||||||
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
propertiesOrMethods.insert(pragma, at: 0)
|
propertiesOrMethods.insert(pragma, at: 0)
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
// swiftlint:disable no_grouping_extension
|
// swiftlint:disable no_grouping_extension
|
||||||
|
|
||||||
@ -22,33 +23,43 @@ extension FontName {
|
|||||||
postscriptName.removeCharacters(from: "[]+-_")
|
postscriptName.removeCharacters(from: "[]+-_")
|
||||||
}
|
}
|
||||||
|
|
||||||
func getProperty(isStatic: Bool, isSwiftUI: Bool) -> String {
|
func getProperty(
|
||||||
if isSwiftUI {
|
isStatic: Bool,
|
||||||
if isStatic {
|
isSwiftUI: Bool,
|
||||||
return """
|
visibility: ExtensionVisibility
|
||||||
static let \(fontNameSanitize): ((_ size: CGFloat) -> Font) = { size in
|
) -> String {
|
||||||
|
switch (isSwiftUI, isStatic) {
|
||||||
|
case (true, true):
|
||||||
|
// SwiftUI, Static => let
|
||||||
|
"""
|
||||||
|
\(visibility) static let \(fontNameSanitize): ((_ size: CGFloat) -> Font) = { size in
|
||||||
Font.custom(FontName.\(fontNameSanitize).rawValue, size: size)
|
Font.custom(FontName.\(fontNameSanitize).rawValue, size: size)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
|
||||||
return """
|
case (true, false):
|
||||||
func \(fontNameSanitize)(withSize size: CGFloat) -> Font {
|
// SwiftUI, Not Static => func
|
||||||
|
"""
|
||||||
|
\(visibility) func \(fontNameSanitize)(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.\(fontNameSanitize).rawValue, size: size)
|
Font.custom(FontName.\(fontNameSanitize).rawValue, size: size)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
case (false, true):
|
||||||
|
// UIKit, Static => let
|
||||||
|
"""
|
||||||
|
\(visibility) static let \(fontNameSanitize): ((_ size: CGFloat) -> UIFont) = { size in
|
||||||
|
UIFont(name: FontName.\(fontNameSanitize).rawValue, size: size)!
|
||||||
}
|
}
|
||||||
// UIKit
|
"""
|
||||||
if isStatic {
|
|
||||||
return """
|
case (false, false):
|
||||||
static let \(fontNameSanitize): ((_ size: CGFloat) -> UIFont) = { size in
|
// UIKit, Not Static => func
|
||||||
|
"""
|
||||||
|
\(visibility) func \(fontNameSanitize)(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.\(fontNameSanitize).rawValue, size: size)!
|
UIFont(name: FontName.\(fontNameSanitize).rawValue, size: size)!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
return """
|
|
||||||
func \(fontNameSanitize)(withSize size: CGFloat) -> UIFont {
|
|
||||||
UIFont(name: FontName.\(fontNameSanitize).rawValue, size: size)!
|
|
||||||
}
|
|
||||||
"""
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -86,31 +86,21 @@ struct AnalyticsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
|
|
||||||
let inputFile: String
|
let inputFile: String
|
||||||
let target: String
|
let target: String
|
||||||
let extensionOutputPath: String
|
let outputFile: String
|
||||||
let extensionName: String?
|
let visibility: String?
|
||||||
let extensionSuffix: String?
|
let staticMembers: Bool?
|
||||||
private let staticMembers: Bool?
|
|
||||||
|
|
||||||
var staticMembersOptions: Bool {
|
|
||||||
if let staticMembers {
|
|
||||||
return staticMembers
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
internal init(
|
internal init(
|
||||||
inputFile: String,
|
inputFile: String,
|
||||||
target: String,
|
target: String,
|
||||||
extensionOutputPath: String,
|
outputFile: String,
|
||||||
extensionName: String?,
|
visibility: String?,
|
||||||
extensionSuffix: String?,
|
|
||||||
staticMembers: Bool?
|
staticMembers: Bool?
|
||||||
) {
|
) {
|
||||||
self.inputFile = inputFile
|
self.inputFile = inputFile
|
||||||
self.target = target
|
self.target = target
|
||||||
self.extensionOutputPath = extensionOutputPath
|
self.outputFile = outputFile
|
||||||
self.extensionName = extensionName
|
self.visibility = visibility
|
||||||
self.extensionSuffix = extensionSuffix
|
|
||||||
self.staticMembers = staticMembers
|
self.staticMembers = staticMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -119,9 +109,9 @@ struct AnalyticsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
Analytics configuration:
|
Analytics configuration:
|
||||||
- Input file: \(inputFile)
|
- Input file: \(inputFile)
|
||||||
- Target: \(target)
|
- Target: \(target)
|
||||||
- Extension output path: \(extensionOutputPath)
|
- Output file: \(outputFile)
|
||||||
- Extension name: \(extensionName ?? "-")
|
- Visiblity: \(visibility ?? "default")
|
||||||
- Extension suffix: \(extensionSuffix ?? "-")
|
- Static members: \(staticMembers != nil ? "\(String(describing: staticMembers))" : "default")
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -131,27 +121,22 @@ struct ColorsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
let inputFile: String
|
let inputFile: String
|
||||||
let style: String
|
let style: String
|
||||||
let xcassetsPath: String
|
let xcassetsPath: String
|
||||||
let extensionOutputPath: String
|
let extensionOutputPath: String?
|
||||||
let extensionName: String?
|
let extensionName: String?
|
||||||
let extensionNameUIKit: String?
|
let extensionNameUIKit: String?
|
||||||
let extensionSuffix: String?
|
let extensionSuffix: String?
|
||||||
private let staticMembers: Bool?
|
let visibility: String?
|
||||||
|
let staticMembers: Bool?
|
||||||
var staticMembersOptions: Bool {
|
|
||||||
if let staticMembers {
|
|
||||||
return staticMembers
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
internal init(
|
internal init(
|
||||||
inputFile: String,
|
inputFile: String,
|
||||||
style: String,
|
style: String,
|
||||||
xcassetsPath: String,
|
xcassetsPath: String,
|
||||||
extensionOutputPath: String,
|
extensionOutputPath: String?,
|
||||||
extensionName: String?,
|
extensionName: String?,
|
||||||
extensionNameUIKit: String?,
|
extensionNameUIKit: String?,
|
||||||
extensionSuffix: String?,
|
extensionSuffix: String?,
|
||||||
|
visibility: String?,
|
||||||
staticMembers: Bool?
|
staticMembers: Bool?
|
||||||
) {
|
) {
|
||||||
self.inputFile = inputFile
|
self.inputFile = inputFile
|
||||||
@ -161,6 +146,7 @@ struct ColorsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
self.extensionName = extensionName
|
self.extensionName = extensionName
|
||||||
self.extensionNameUIKit = extensionNameUIKit
|
self.extensionNameUIKit = extensionNameUIKit
|
||||||
self.extensionSuffix = extensionSuffix
|
self.extensionSuffix = extensionSuffix
|
||||||
|
self.visibility = visibility
|
||||||
self.staticMembers = staticMembers
|
self.staticMembers = staticMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -170,10 +156,12 @@ struct ColorsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
- Input file: \(inputFile)
|
- Input file: \(inputFile)
|
||||||
- Style: \(style)
|
- Style: \(style)
|
||||||
- Xcassets path: \(xcassetsPath)
|
- Xcassets path: \(xcassetsPath)
|
||||||
- Extension output path: \(extensionOutputPath)
|
- Extension output path: \(extensionOutputPath ?? "-")
|
||||||
- Extension name: \(extensionName ?? "-")
|
- Extension name: \(extensionName ?? "-")
|
||||||
- Extension name UIKit: \(extensionNameUIKit ?? "-")
|
- Extension name UIKit: \(extensionNameUIKit ?? "-")
|
||||||
- Extension suffix: \(extensionSuffix ?? "-")
|
- Extension suffix: \(extensionSuffix ?? "-")
|
||||||
|
- Visiblity: \(visibility ?? "default")
|
||||||
|
- Static members: \(staticMembers != nil ? "\(String(describing: staticMembers))" : "default")
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -181,27 +169,22 @@ struct ColorsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
struct FontsConfiguration: Codable, CustomDebugStringConvertible {
|
struct FontsConfiguration: Codable, CustomDebugStringConvertible {
|
||||||
|
|
||||||
let inputFile: String
|
let inputFile: String
|
||||||
let extensionOutputPath: String
|
let extensionOutputPath: String?
|
||||||
let extensionName: String?
|
let extensionName: String?
|
||||||
let extensionNameUIKit: String?
|
let extensionNameUIKit: String?
|
||||||
let extensionSuffix: String?
|
let extensionSuffix: String?
|
||||||
let infoPlistPaths: String?
|
let infoPlistPaths: String?
|
||||||
private let staticMembers: Bool?
|
let visibility: String?
|
||||||
|
let staticMembers: Bool?
|
||||||
var staticMembersOptions: Bool {
|
|
||||||
if let staticMembers {
|
|
||||||
return staticMembers
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
internal init(
|
internal init(
|
||||||
inputFile: String,
|
inputFile: String,
|
||||||
extensionOutputPath: String,
|
extensionOutputPath: String?,
|
||||||
extensionName: String?,
|
extensionName: String?,
|
||||||
extensionNameUIKit: String?,
|
extensionNameUIKit: String?,
|
||||||
extensionSuffix: String?,
|
extensionSuffix: String?,
|
||||||
infoPlistPaths: String?,
|
infoPlistPaths: String?,
|
||||||
|
visibility: String?,
|
||||||
staticMembers: Bool?
|
staticMembers: Bool?
|
||||||
) {
|
) {
|
||||||
self.inputFile = inputFile
|
self.inputFile = inputFile
|
||||||
@ -210,6 +193,7 @@ struct FontsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
self.extensionNameUIKit = extensionNameUIKit
|
self.extensionNameUIKit = extensionNameUIKit
|
||||||
self.extensionSuffix = extensionSuffix
|
self.extensionSuffix = extensionSuffix
|
||||||
self.infoPlistPaths = infoPlistPaths
|
self.infoPlistPaths = infoPlistPaths
|
||||||
|
self.visibility = visibility
|
||||||
self.staticMembers = staticMembers
|
self.staticMembers = staticMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -217,11 +201,13 @@ struct FontsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
"""
|
"""
|
||||||
Fonts configuration:
|
Fonts configuration:
|
||||||
- Input file: \(inputFile)
|
- Input file: \(inputFile)
|
||||||
- Extension output path: \(extensionOutputPath)
|
- Extension output path: \(extensionOutputPath ?? "-")
|
||||||
- Extension name: \(extensionName ?? "-")
|
- Extension name: \(extensionName ?? "-")
|
||||||
- Extension name UIKit: \(extensionNameUIKit ?? "-")
|
- Extension name UIKit: \(extensionNameUIKit ?? "-")
|
||||||
- Extension suffix: \(extensionSuffix ?? "-")
|
- Extension suffix: \(extensionSuffix ?? "-")
|
||||||
- InfoPlistPaths: \(infoPlistPaths ?? "-")
|
- InfoPlistPaths: \(infoPlistPaths ?? "-")
|
||||||
|
- Visiblity: \(visibility ?? "default")
|
||||||
|
- Static members: \(staticMembers != nil ? "\(String(describing: staticMembers))" : "default")
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -230,26 +216,21 @@ struct ImagesConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
|
|
||||||
let inputFile: String
|
let inputFile: String
|
||||||
let xcassetsPath: String
|
let xcassetsPath: String
|
||||||
let extensionOutputPath: String
|
let extensionOutputPath: String?
|
||||||
let extensionName: String?
|
let extensionName: String?
|
||||||
let extensionNameUIKit: String?
|
let extensionNameUIKit: String?
|
||||||
let extensionSuffix: String?
|
let extensionSuffix: String?
|
||||||
private let staticMembers: Bool?
|
let visibility: String?
|
||||||
|
let staticMembers: Bool?
|
||||||
var staticMembersOptions: Bool {
|
|
||||||
if let staticMembers {
|
|
||||||
return staticMembers
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
internal init(
|
internal init(
|
||||||
inputFile: String,
|
inputFile: String,
|
||||||
xcassetsPath: String,
|
xcassetsPath: String,
|
||||||
extensionOutputPath: String,
|
extensionOutputPath: String?,
|
||||||
extensionName: String?,
|
extensionName: String?,
|
||||||
extensionNameUIKit: String?,
|
extensionNameUIKit: String?,
|
||||||
extensionSuffix: String?,
|
extensionSuffix: String?,
|
||||||
|
visibility: String?,
|
||||||
staticMembers: Bool?
|
staticMembers: Bool?
|
||||||
) {
|
) {
|
||||||
self.inputFile = inputFile
|
self.inputFile = inputFile
|
||||||
@ -258,6 +239,7 @@ struct ImagesConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
self.extensionName = extensionName
|
self.extensionName = extensionName
|
||||||
self.extensionNameUIKit = extensionNameUIKit
|
self.extensionNameUIKit = extensionNameUIKit
|
||||||
self.extensionSuffix = extensionSuffix
|
self.extensionSuffix = extensionSuffix
|
||||||
|
self.visibility = visibility
|
||||||
self.staticMembers = staticMembers
|
self.staticMembers = staticMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -266,10 +248,12 @@ struct ImagesConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
Images configuration:
|
Images configuration:
|
||||||
- Input file: \(inputFile)
|
- Input file: \(inputFile)
|
||||||
- Xcassets path: \(xcassetsPath)
|
- Xcassets path: \(xcassetsPath)
|
||||||
- Extension output path: \(extensionOutputPath)
|
- Extension output path: \(extensionOutputPath ?? "-")
|
||||||
- Extension name: \(extensionName ?? "-")
|
- Extension name: \(extensionName ?? "-")
|
||||||
- Extension name UIKit: \(extensionNameUIKit ?? "-")
|
- Extension name UIKit: \(extensionNameUIKit ?? "-")
|
||||||
- Extension suffix: \(extensionSuffix ?? "-")
|
- Extension suffix: \(extensionSuffix ?? "-")
|
||||||
|
- Visiblity: \(visibility ?? "default")
|
||||||
|
- Static members: \(staticMembers != nil ? "\(String(describing: staticMembers))" : "default")
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -280,34 +264,22 @@ struct StringsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
let outputPath: String
|
let outputPath: String
|
||||||
let langs: String
|
let langs: String
|
||||||
let defaultLang: String
|
let defaultLang: String
|
||||||
let extensionOutputPath: String
|
let extensionOutputPath: String?
|
||||||
let extensionName: String?
|
let extensionName: String?
|
||||||
let extensionSuffix: String?
|
let extensionSuffix: String?
|
||||||
private let staticMembers: Bool?
|
let visibility: String?
|
||||||
private let xcStrings: Bool?
|
let staticMembers: Bool?
|
||||||
|
let xcStrings: Bool?
|
||||||
var staticMembersOptions: Bool {
|
|
||||||
if let staticMembers {
|
|
||||||
return staticMembers
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
var xcStringsOptions: Bool {
|
|
||||||
if let xcStrings {
|
|
||||||
return xcStrings
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
internal init(
|
internal init(
|
||||||
inputFile: String,
|
inputFile: String,
|
||||||
outputPath: String,
|
outputPath: String,
|
||||||
langs: String,
|
langs: String,
|
||||||
defaultLang: String,
|
defaultLang: String,
|
||||||
extensionOutputPath: String,
|
extensionOutputPath: String?,
|
||||||
extensionName: String?,
|
extensionName: String?,
|
||||||
extensionSuffix: String?,
|
extensionSuffix: String?,
|
||||||
|
visibility: String?,
|
||||||
staticMembers: Bool?,
|
staticMembers: Bool?,
|
||||||
xcStrings: Bool?
|
xcStrings: Bool?
|
||||||
) {
|
) {
|
||||||
@ -318,6 +290,7 @@ struct StringsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
self.extensionOutputPath = extensionOutputPath
|
self.extensionOutputPath = extensionOutputPath
|
||||||
self.extensionName = extensionName
|
self.extensionName = extensionName
|
||||||
self.extensionSuffix = extensionSuffix
|
self.extensionSuffix = extensionSuffix
|
||||||
|
self.visibility = visibility
|
||||||
self.staticMembers = staticMembers
|
self.staticMembers = staticMembers
|
||||||
self.xcStrings = xcStrings
|
self.xcStrings = xcStrings
|
||||||
}
|
}
|
||||||
@ -329,9 +302,12 @@ struct StringsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
- Output path: \(outputPath)
|
- Output path: \(outputPath)
|
||||||
- Langs: \(langs)
|
- Langs: \(langs)
|
||||||
- Default lang: \(defaultLang)
|
- Default lang: \(defaultLang)
|
||||||
- Extension output path: \(extensionOutputPath)
|
- Extension output path: \(extensionOutputPath ?? "-")
|
||||||
- Extension name: \(extensionName ?? "-")
|
- Extension name: \(extensionName ?? "-")
|
||||||
- Extension suffix: \(extensionSuffix ?? "-")
|
- Extension suffix: \(extensionSuffix ?? "-")
|
||||||
|
- Visiblity: \(visibility ?? "default")
|
||||||
|
- Static members: \(staticMembers != nil ? "\(String(describing: staticMembers))" : "default")
|
||||||
|
- XC Strings: \(xcStrings != nil ? "\(String(describing: xcStrings))" : "default")
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -343,14 +319,8 @@ struct TagsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
let extensionOutputPath: String
|
let extensionOutputPath: String
|
||||||
let extensionName: String?
|
let extensionName: String?
|
||||||
let extensionSuffix: String?
|
let extensionSuffix: String?
|
||||||
private let staticMembers: Bool?
|
let visibility: String?
|
||||||
|
let staticMembers: Bool?
|
||||||
var staticMembersOptions: Bool {
|
|
||||||
if let staticMembers {
|
|
||||||
return staticMembers
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
internal init(
|
internal init(
|
||||||
inputFile: String,
|
inputFile: String,
|
||||||
@ -358,6 +328,7 @@ struct TagsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
extensionOutputPath: String,
|
extensionOutputPath: String,
|
||||||
extensionName: String?,
|
extensionName: String?,
|
||||||
extensionSuffix: String?,
|
extensionSuffix: String?,
|
||||||
|
visibility: String?,
|
||||||
staticMembers: Bool?
|
staticMembers: Bool?
|
||||||
) {
|
) {
|
||||||
self.inputFile = inputFile
|
self.inputFile = inputFile
|
||||||
@ -365,6 +336,7 @@ struct TagsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
self.extensionOutputPath = extensionOutputPath
|
self.extensionOutputPath = extensionOutputPath
|
||||||
self.extensionName = extensionName
|
self.extensionName = extensionName
|
||||||
self.extensionSuffix = extensionSuffix
|
self.extensionSuffix = extensionSuffix
|
||||||
|
self.visibility = visibility
|
||||||
self.staticMembers = staticMembers
|
self.staticMembers = staticMembers
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -376,6 +348,8 @@ struct TagsConfiguration: Codable, CustomDebugStringConvertible {
|
|||||||
- Extension output path: \(extensionOutputPath)
|
- Extension output path: \(extensionOutputPath)
|
||||||
- Extension name: \(extensionName ?? "-")
|
- Extension name: \(extensionName ?? "-")
|
||||||
- Extension suffix: \(extensionSuffix ?? "-")
|
- Extension suffix: \(extensionSuffix ?? "-")
|
||||||
|
- Visiblity: \(visibility ?? "default")
|
||||||
|
- Static members: \(staticMembers != nil ? "\(String(describing: staticMembers))" : "default")
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,11 @@ import Foundation
|
|||||||
extension AnalyticsConfiguration: Runnable {
|
extension AnalyticsConfiguration: Runnable {
|
||||||
|
|
||||||
func run(projectDirectory: String, force: Bool) {
|
func run(projectDirectory: String, force: Bool) {
|
||||||
|
let args = getArguments(projectDirectory: projectDirectory, force: force)
|
||||||
|
Analytics.main(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getArguments(projectDirectory: String, force: Bool) -> [String] {
|
||||||
var args = [String]()
|
var args = [String]()
|
||||||
|
|
||||||
if force {
|
if force {
|
||||||
@ -20,25 +25,23 @@ extension AnalyticsConfiguration: Runnable {
|
|||||||
inputFile.prependIfRelativePath(projectDirectory),
|
inputFile.prependIfRelativePath(projectDirectory),
|
||||||
"--target",
|
"--target",
|
||||||
target,
|
target,
|
||||||
"--extension-output-path",
|
"--output-file",
|
||||||
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
outputFile.prependIfRelativePath(projectDirectory)
|
||||||
"--static-members",
|
|
||||||
"\(staticMembersOptions)"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if let extensionName {
|
// Add optional parameters
|
||||||
|
[
|
||||||
|
("--visibility", visibility),
|
||||||
|
("--static-members", staticMembers?.description)
|
||||||
|
].forEach { argumentName, argumentValue in
|
||||||
|
if let argumentValue {
|
||||||
args += [
|
args += [
|
||||||
"--extension-name",
|
argumentName,
|
||||||
extensionName
|
argumentValue
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
if let extensionSuffix {
|
|
||||||
args += [
|
|
||||||
"--extension-suffix",
|
|
||||||
extensionSuffix
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Analytics.main(args)
|
return args
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -26,30 +26,24 @@ extension ColorsConfiguration: Runnable {
|
|||||||
"--style",
|
"--style",
|
||||||
style,
|
style,
|
||||||
"--xcassets-path",
|
"--xcassets-path",
|
||||||
xcassetsPath.prependIfRelativePath(projectDirectory),
|
xcassetsPath.prependIfRelativePath(projectDirectory)
|
||||||
"--extension-output-path",
|
|
||||||
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
|
||||||
"--static-members",
|
|
||||||
"\(staticMembersOptions)"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if let extensionName {
|
// Add optional parameters
|
||||||
|
[
|
||||||
|
("--extension-output-path", extensionOutputPath?.prependIfRelativePath(projectDirectory)),
|
||||||
|
("--extension-name", extensionName),
|
||||||
|
("--extension-name-ui-kit", extensionNameUIKit),
|
||||||
|
("--extension-suffix", extensionSuffix),
|
||||||
|
("--visibility", visibility),
|
||||||
|
("--static-members", staticMembers?.description)
|
||||||
|
].forEach { argumentName, argumentValue in
|
||||||
|
if let argumentValue {
|
||||||
args += [
|
args += [
|
||||||
"--extension-name",
|
argumentName,
|
||||||
extensionName
|
argumentValue
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
if let extensionNameUIKit {
|
|
||||||
args += [
|
|
||||||
"--extension-name-ui-kit",
|
|
||||||
extensionNameUIKit
|
|
||||||
]
|
|
||||||
}
|
|
||||||
if let extensionSuffix {
|
|
||||||
args += [
|
|
||||||
"--extension-suffix",
|
|
||||||
extensionSuffix
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
@ -22,33 +22,27 @@ extension FontsConfiguration: Runnable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
args += [
|
args += [
|
||||||
inputFile.prependIfRelativePath(projectDirectory),
|
inputFile.prependIfRelativePath(projectDirectory)
|
||||||
"--extension-output-path",
|
|
||||||
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
|
||||||
"--static-members",
|
|
||||||
"\(staticMembersOptions)"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if let extensionName {
|
// Add optional parameters
|
||||||
|
[
|
||||||
|
("--extension-output-path", extensionOutputPath?.prependIfRelativePath(projectDirectory)),
|
||||||
|
("--extension-name", extensionName),
|
||||||
|
("--extension-name-ui-kit", extensionNameUIKit),
|
||||||
|
("--extension-suffix", extensionSuffix),
|
||||||
|
("--visibility", visibility),
|
||||||
|
("--static-members", staticMembers?.description)
|
||||||
|
].forEach { argumentName, argumentValue in
|
||||||
|
if let argumentValue {
|
||||||
args += [
|
args += [
|
||||||
"--extension-name",
|
argumentName,
|
||||||
extensionName
|
argumentValue
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
if let extensionNameUIKit {
|
|
||||||
args += [
|
|
||||||
"--extension-name-ui-kit",
|
|
||||||
extensionNameUIKit
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
if let extensionSuffix {
|
|
||||||
args += [
|
|
||||||
"--extension-suffix",
|
|
||||||
extensionSuffix
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add infoPlist paths
|
||||||
if let infoPlistPaths {
|
if let infoPlistPaths {
|
||||||
let adjustedPlistPaths = infoPlistPaths
|
let adjustedPlistPaths = infoPlistPaths
|
||||||
.split(separator: " ")
|
.split(separator: " ")
|
||||||
|
@ -24,32 +24,24 @@ extension ImagesConfiguration: Runnable {
|
|||||||
args += [
|
args += [
|
||||||
inputFile.prependIfRelativePath(projectDirectory),
|
inputFile.prependIfRelativePath(projectDirectory),
|
||||||
"--xcassets-path",
|
"--xcassets-path",
|
||||||
xcassetsPath.prependIfRelativePath(projectDirectory),
|
xcassetsPath.prependIfRelativePath(projectDirectory)
|
||||||
"--extension-output-path",
|
|
||||||
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
|
||||||
"--static-members",
|
|
||||||
"\(staticMembersOptions)"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if let extensionName {
|
// Add optional parameters
|
||||||
|
[
|
||||||
|
("--extension-output-path", extensionOutputPath?.prependIfRelativePath(projectDirectory)),
|
||||||
|
("--extension-name", extensionName),
|
||||||
|
("--extension-name-ui-kit", extensionNameUIKit),
|
||||||
|
("--extension-suffix", extensionSuffix),
|
||||||
|
("--visibility", visibility),
|
||||||
|
("--static-members", staticMembers?.description)
|
||||||
|
].forEach { argumentName, argumentValue in
|
||||||
|
if let argumentValue {
|
||||||
args += [
|
args += [
|
||||||
"--extension-name",
|
argumentName,
|
||||||
extensionName
|
argumentValue
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
if let extensionNameUIKit {
|
|
||||||
args += [
|
|
||||||
"--extension-name-ui-kit",
|
|
||||||
extensionNameUIKit
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
if let extensionSuffix {
|
|
||||||
args += [
|
|
||||||
"--extension-suffix",
|
|
||||||
extensionSuffix
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
@ -10,6 +10,11 @@ import Foundation
|
|||||||
extension StringsConfiguration: Runnable {
|
extension StringsConfiguration: Runnable {
|
||||||
|
|
||||||
func run(projectDirectory: String, force: Bool) {
|
func run(projectDirectory: String, force: Bool) {
|
||||||
|
let args = getArguments(projectDirectory: projectDirectory, force: force)
|
||||||
|
Stringium.main(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getArguments(projectDirectory: String, force: Bool) -> [String] {
|
||||||
var args = [String]()
|
var args = [String]()
|
||||||
|
|
||||||
if force {
|
if force {
|
||||||
@ -23,29 +28,26 @@ extension StringsConfiguration: Runnable {
|
|||||||
"--langs",
|
"--langs",
|
||||||
langs,
|
langs,
|
||||||
"--default-lang",
|
"--default-lang",
|
||||||
defaultLang,
|
defaultLang
|
||||||
"--extension-output-path",
|
|
||||||
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
|
||||||
"--static-members",
|
|
||||||
"\(staticMembersOptions)",
|
|
||||||
"--xc-strings",
|
|
||||||
"\(xcStringsOptions)"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if let extensionName {
|
// Add optional parameters
|
||||||
|
[
|
||||||
|
("--extension-output-path", extensionOutputPath?.prependIfRelativePath(projectDirectory)),
|
||||||
|
("--extension-name", extensionName),
|
||||||
|
("--extension-suffix", extensionSuffix),
|
||||||
|
("--visibility", visibility),
|
||||||
|
("--xc-strings", staticMembers?.description),
|
||||||
|
("--static-members", xcStrings?.description)
|
||||||
|
].forEach { argumentName, argumentValue in
|
||||||
|
if let argumentValue {
|
||||||
args += [
|
args += [
|
||||||
"--extension-name",
|
argumentName,
|
||||||
extensionName
|
argumentValue
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
if let extensionSuffix {
|
|
||||||
args += [
|
|
||||||
"--extension-suffix",
|
|
||||||
extensionSuffix
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Stringium.main(args)
|
return args
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -10,6 +10,11 @@ import Foundation
|
|||||||
extension TagsConfiguration: Runnable {
|
extension TagsConfiguration: Runnable {
|
||||||
|
|
||||||
func run(projectDirectory: String, force: Bool) {
|
func run(projectDirectory: String, force: Bool) {
|
||||||
|
let args = getArguments(projectDirectory: projectDirectory, force: force)
|
||||||
|
Tags.main(args)
|
||||||
|
}
|
||||||
|
|
||||||
|
func getArguments(projectDirectory: String, force: Bool) -> [String] {
|
||||||
var args = [String]()
|
var args = [String]()
|
||||||
|
|
||||||
if force {
|
if force {
|
||||||
@ -21,24 +26,24 @@ extension TagsConfiguration: Runnable {
|
|||||||
"--lang",
|
"--lang",
|
||||||
lang,
|
lang,
|
||||||
"--extension-output-path",
|
"--extension-output-path",
|
||||||
extensionOutputPath.prependIfRelativePath(projectDirectory),
|
extensionOutputPath.prependIfRelativePath(projectDirectory)
|
||||||
"--static-members",
|
|
||||||
"\(staticMembersOptions)"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
if let extensionName {
|
// Add optional parameters
|
||||||
|
[
|
||||||
|
("--extension-name", extensionName),
|
||||||
|
("--extension-suffix", extensionSuffix),
|
||||||
|
("--visibility", visibility),
|
||||||
|
("--static-members", staticMembers?.description)
|
||||||
|
].forEach { argumentName, argumentValue in
|
||||||
|
if let argumentValue {
|
||||||
args += [
|
args += [
|
||||||
"--extension-name",
|
argumentName,
|
||||||
extensionName
|
argumentValue
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
if let extensionSuffix {
|
|
||||||
args += [
|
|
||||||
"--extension-suffix",
|
|
||||||
extensionSuffix
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Tags.main(args)
|
return args
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,7 +18,8 @@ enum ImageExtensionGenerator {
|
|||||||
inputFilename: String,
|
inputFilename: String,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
extensionFilePath: String,
|
extensionFilePath: String,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) {
|
) {
|
||||||
// Create extension conten1t
|
// Create extension conten1t
|
||||||
let extensionContent = Self.getExtensionContent(
|
let extensionContent = Self.getExtensionContent(
|
||||||
@ -26,7 +27,8 @@ enum ImageExtensionGenerator {
|
|||||||
staticVar: staticVar,
|
staticVar: staticVar,
|
||||||
extensionName: extensionName,
|
extensionName: extensionName,
|
||||||
inputFilename: inputFilename,
|
inputFilename: inputFilename,
|
||||||
isSwiftUI: isSwiftUI
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Write content
|
// Write content
|
||||||
@ -45,11 +47,21 @@ enum ImageExtensionGenerator {
|
|||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
inputFilename: String,
|
inputFilename: String,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
[
|
[
|
||||||
Self.getHeader(inputFilename: inputFilename, extensionClassname: extensionName, isSwiftUI: isSwiftUI),
|
Self.getHeader(
|
||||||
Self.getProperties(images: images, staticVar: staticVar, isSwiftUI: isSwiftUI),
|
inputFilename: inputFilename,
|
||||||
|
extensionClassname: extensionName,
|
||||||
|
isSwiftUI: isSwiftUI
|
||||||
|
),
|
||||||
|
Self.getProperties(
|
||||||
|
images: images,
|
||||||
|
staticVar: staticVar,
|
||||||
|
isSwiftUI: isSwiftUI,
|
||||||
|
visibility: visibility
|
||||||
|
),
|
||||||
Self.getFooter()
|
Self.getFooter()
|
||||||
]
|
]
|
||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
@ -73,10 +85,13 @@ enum ImageExtensionGenerator {
|
|||||||
private static func getProperties(
|
private static func getProperties(
|
||||||
images: [ParsedImage],
|
images: [ParsedImage],
|
||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
isSwiftUI: Bool
|
isSwiftUI: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
images
|
images
|
||||||
.map { "\n\($0.getImageProperty(isStatic: staticVar, isSwiftUI: isSwiftUI))" }
|
.map {
|
||||||
|
"\n\($0.getImageProperty(isStatic: staticVar, isSwiftUI: isSwiftUI, visibility: visibility))"
|
||||||
|
}
|
||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,8 +21,6 @@ struct Images: ParsableCommand {
|
|||||||
// MARK: - Static
|
// MARK: - Static
|
||||||
|
|
||||||
static let toolName = "Images"
|
static let toolName = "Images"
|
||||||
static let defaultExtensionName = "Image"
|
|
||||||
static let defaultExtensionNameUIKit = "UIImage"
|
|
||||||
|
|
||||||
// MARK: - Command Options
|
// MARK: - Command Options
|
||||||
|
|
||||||
@ -55,23 +53,31 @@ struct Images: ParsableCommand {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// Generate extension
|
// Generate extension
|
||||||
|
if let extensionName = options.extensionName,
|
||||||
|
let extensionFilePath = options.extensionFilePath {
|
||||||
ImageExtensionGenerator.generateExtensionFile(
|
ImageExtensionGenerator.generateExtensionFile(
|
||||||
images: imagesToGenerate,
|
images: imagesToGenerate,
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
inputFilename: options.inputFilenameWithoutExt,
|
inputFilename: options.inputFilenameWithoutExt,
|
||||||
extensionName: options.extensionName,
|
extensionName: extensionName,
|
||||||
extensionFilePath: options.extensionFilePath,
|
extensionFilePath: extensionFilePath,
|
||||||
isSwiftUI: true
|
isSwiftUI: true,
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if let extensionNameUIKit = options.extensionNameUIKit,
|
||||||
|
let extensionFilePathUIKit = options.extensionFilePathUIKit {
|
||||||
ImageExtensionGenerator.generateExtensionFile(
|
ImageExtensionGenerator.generateExtensionFile(
|
||||||
images: imagesToGenerate,
|
images: imagesToGenerate,
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
inputFilename: options.inputFilenameWithoutExt,
|
inputFilename: options.inputFilenameWithoutExt,
|
||||||
extensionName: options.extensionNameUIKit,
|
extensionName: extensionNameUIKit,
|
||||||
extensionFilePath: options.extensionFilePathUIKit,
|
extensionFilePath: extensionFilePathUIKit,
|
||||||
isSwiftUI: false
|
isSwiftUI: false,
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
print("[\(Self.toolName)] Images generated")
|
print("[\(Self.toolName)] Images generated")
|
||||||
}
|
}
|
||||||
@ -96,17 +102,39 @@ struct Images: ParsableCommand {
|
|||||||
_ = Self.getSvgConverterPath()
|
_ = Self.getSvgConverterPath()
|
||||||
|
|
||||||
// Extension for UIKit and SwiftUI should have different name
|
// Extension for UIKit and SwiftUI should have different name
|
||||||
guard options.extensionName != options.extensionNameUIKit else {
|
if let extensionName = options.extensionName,
|
||||||
let error = ImagesError.extensionNamesCollision(options.extensionName)
|
let extensionNameUIKit = options.extensionNameUIKit {
|
||||||
|
guard extensionName != extensionNameUIKit else {
|
||||||
|
let error = ImagesError.extensionNamesCollision(extensionName)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
Self.exit(withError: error)
|
Self.exit(withError: error)
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an extension need to be generated, ensure extensionOutputPath is defined
|
||||||
|
if options.extensionName != nil ||
|
||||||
|
options.extensionNameUIKit != nil {
|
||||||
|
guard let extensionOutputPath = options.extensionOutputPath,
|
||||||
|
extensionOutputPath.isEmpty == false else {
|
||||||
|
let error = ImagesError.missingExtensionPath
|
||||||
|
print(error.description)
|
||||||
|
Self.exit(withError: error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Check if needed to regenerate
|
// Check if needed to regenerate
|
||||||
|
let fileToCompareToInput: String = {
|
||||||
|
// If there is no extension file to compare
|
||||||
|
// Then check the xcassets file instead
|
||||||
|
if let extensionFilePath = options.extensionFilePath {
|
||||||
|
return extensionFilePath
|
||||||
|
}
|
||||||
|
return options.xcassetsPath
|
||||||
|
}()
|
||||||
guard GeneratorChecker.shouldGenerate(
|
guard GeneratorChecker.shouldGenerate(
|
||||||
force: options.forceExecution,
|
force: options.forceExecution,
|
||||||
inputFilePath: options.inputFile,
|
inputFilePath: options.inputFile,
|
||||||
extensionFilePath: options.extensionFilePath
|
extensionFilePath: fileToCompareToInput
|
||||||
) else {
|
) else {
|
||||||
print("[\(Self.toolName)] Images are already up to date :) ")
|
print("[\(Self.toolName)] Images are already up to date :) ")
|
||||||
return false
|
return false
|
||||||
|
@ -18,12 +18,13 @@ enum ImagesError: Error {
|
|||||||
case magickConvertNotFound
|
case magickConvertNotFound
|
||||||
case writeFile(String, String)
|
case writeFile(String, String)
|
||||||
case createAssetFolder(String)
|
case createAssetFolder(String)
|
||||||
|
case missingExtensionPath
|
||||||
case unknown(String)
|
case unknown(String)
|
||||||
|
|
||||||
var description: String {
|
var description: String {
|
||||||
switch self {
|
switch self {
|
||||||
case .extensionNamesCollision(let extensionName):
|
case .extensionNamesCollision(let extensionName):
|
||||||
return "error: [\(Fonts.toolName)] Error on extension names, extension name and SwiftUI extension name should be different (\(extensionName) is used on both)"
|
return "error: [\(Images.toolName)] Error on extension names, extension name and SwiftUI extension name should be different (\(extensionName) is used on both)"
|
||||||
|
|
||||||
case .inputFolderNotFound(let inputFolder):
|
case .inputFolderNotFound(let inputFolder):
|
||||||
return "error: [\(Images.toolName)] Input folder not found: \(inputFolder)"
|
return "error: [\(Images.toolName)] Input folder not found: \(inputFolder)"
|
||||||
@ -47,7 +48,10 @@ enum ImagesError: Error {
|
|||||||
return "error: [\(Images.toolName)] An error occured while writing content to \(filename): \(subErrorDescription)"
|
return "error: [\(Images.toolName)] An error occured while writing content to \(filename): \(subErrorDescription)"
|
||||||
|
|
||||||
case .createAssetFolder(let folder):
|
case .createAssetFolder(let folder):
|
||||||
return "error: [\(Colors.toolName)] An error occured while creating folder `\(folder)`"
|
return "error: [\(Images.toolName)] An error occured while creating folder `\(folder)`"
|
||||||
|
|
||||||
|
case .missingExtensionPath:
|
||||||
|
return "error: [\(Images.toolName)] Extension need to be generated but no `extensionOutputPath` is provided"
|
||||||
|
|
||||||
case .unknown(let errorDescription):
|
case .unknown(let errorDescription):
|
||||||
return "error: [\(Images.toolName)] Unknown error: \(errorDescription)"
|
return "error: [\(Images.toolName)] Unknown error: \(errorDescription)"
|
||||||
|
@ -7,34 +7,61 @@
|
|||||||
|
|
||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
// swiftlint:disable no_grouping_extension
|
// swiftlint:disable no_grouping_extension
|
||||||
|
|
||||||
struct ImagesOptions: ParsableArguments {
|
struct ImagesOptions: ParsableArguments {
|
||||||
|
|
||||||
@Flag(name: .customShort("f"), help: "Should force script execution")
|
@Flag(
|
||||||
|
name: .customShort("f"),
|
||||||
|
help: "Should force script execution"
|
||||||
|
)
|
||||||
var forceExecution = false
|
var forceExecution = false
|
||||||
|
|
||||||
@Flag(name: .customShort("F"), help: "Regenerate all images")
|
@Flag(
|
||||||
|
name: .customShort("F"),
|
||||||
|
help: "Regenerate all images"
|
||||||
|
)
|
||||||
var forceExecutionAndGeneration = false
|
var forceExecutionAndGeneration = false
|
||||||
|
|
||||||
@Argument(help: "Input files where strings ared defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Argument(
|
||||||
|
help: "Input files where strings ared defined.",
|
||||||
|
completion: .file(),
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
var inputFile: String
|
var inputFile: String
|
||||||
|
|
||||||
@Option(help: "Xcassets path where to generate images.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(
|
||||||
|
help: "Xcassets path where to generate images.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
var xcassetsPath: String
|
var xcassetsPath: String
|
||||||
|
|
||||||
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(
|
||||||
var extensionOutputPath: String
|
help: "Tell if it will generate static properties or not",
|
||||||
|
completion: .list(["true", "false"])
|
||||||
@Option(help: "Tell if it will generate static properties or not")
|
)
|
||||||
var staticMembers: Bool = false
|
var staticMembers: Bool = false
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate an Image extension.")
|
@Option(
|
||||||
var extensionName: String = Images.defaultExtensionName
|
name: .customLong("visibility"),
|
||||||
|
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
|
||||||
|
completion: .list(["public", "private", "package", "internal"])
|
||||||
|
)
|
||||||
|
var extensionVisibility: ExtensionVisibility = .internal
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate an UIImage extension.")
|
@Option(
|
||||||
var extensionNameUIKit: String = Images.defaultExtensionNameUIKit
|
help: "Path where to generate the extension.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
|
var extensionOutputPath: String?
|
||||||
|
|
||||||
|
@Option(help: "SwiftUI extension name. If not specified, no extension will be generated.")
|
||||||
|
var extensionName: String?
|
||||||
|
|
||||||
|
@Option(help: "UIKit extension name. If not specified, no extension will be generated.")
|
||||||
|
var extensionNameUIKit: String?
|
||||||
|
|
||||||
@Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+Image{extensionSuffix}.swift")
|
@Option(help: "Extension suffix. Ex: MyApp, it will generate {extensionName}+Image{extensionSuffix}.swift")
|
||||||
var extensionSuffix: String?
|
var extensionSuffix: String?
|
||||||
@ -46,28 +73,36 @@ extension ImagesOptions {
|
|||||||
|
|
||||||
// MARK: - SwiftUI
|
// MARK: - SwiftUI
|
||||||
|
|
||||||
var extensionFileName: String {
|
var extensionFileName: String? {
|
||||||
|
guard let extensionName else { return nil }
|
||||||
|
|
||||||
if let extensionSuffix {
|
if let extensionSuffix {
|
||||||
return "\(extensionName)+\(extensionSuffix).swift"
|
return "\(extensionName)+\(extensionSuffix).swift"
|
||||||
}
|
}
|
||||||
return "\(extensionName).swift"
|
return "\(extensionName).swift"
|
||||||
}
|
}
|
||||||
|
|
||||||
var extensionFilePath: String {
|
var extensionFilePath: String? {
|
||||||
"\(extensionOutputPath)/\(extensionFileName)"
|
guard let extensionOutputPath, let extensionFileName else { return nil }
|
||||||
|
|
||||||
|
return "\(extensionOutputPath)/\(extensionFileName)"
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - UIKit
|
// MARK: - UIKit
|
||||||
|
|
||||||
var extensionFileNameUIKit: String {
|
var extensionFileNameUIKit: String? {
|
||||||
|
guard let extensionNameUIKit else { return nil }
|
||||||
|
|
||||||
if let extensionSuffix {
|
if let extensionSuffix {
|
||||||
return "\(extensionNameUIKit)+\(extensionSuffix).swift"
|
return "\(extensionNameUIKit)+\(extensionSuffix).swift"
|
||||||
}
|
}
|
||||||
return "\(extensionNameUIKit).swift"
|
return "\(extensionNameUIKit).swift"
|
||||||
}
|
}
|
||||||
|
|
||||||
var extensionFilePathUIKit: String {
|
var extensionFilePathUIKit: String? {
|
||||||
"\(extensionOutputPath)/\(extensionFileNameUIKit)"
|
guard let extensionOutputPath, let extensionFileNameUIKit else { return nil }
|
||||||
|
|
||||||
|
return "\(extensionOutputPath)/\(extensionFileNameUIKit)"
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: -
|
// MARK: -
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
enum ImageExtension: String {
|
enum ImageExtension: String {
|
||||||
|
|
||||||
@ -129,16 +130,16 @@ struct ParsedImage {
|
|||||||
|
|
||||||
// MARK: - Extension property
|
// MARK: - Extension property
|
||||||
|
|
||||||
func getImageProperty(isStatic: Bool, isSwiftUI: Bool) -> String {
|
func getImageProperty(isStatic: Bool, isSwiftUI: Bool, visibility: ExtensionVisibility) -> String {
|
||||||
if isSwiftUI {
|
if isSwiftUI {
|
||||||
return """
|
return """
|
||||||
\(isStatic ? "static " : "")var \(name): Image {
|
\(visibility) \(isStatic ? "static " : "")var \(name): Image {
|
||||||
Image("\(name)")
|
Image("\(name)")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
return """
|
return """
|
||||||
\(isStatic ? "static " : "")var \(name): UIImage {
|
\(visibility) \(isStatic ? "static " : "")var \(name): UIImage {
|
||||||
UIImage(named: "\(name)")!
|
UIImage(named: "\(name)")!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -19,8 +19,7 @@ enum StringsFileGenerator {
|
|||||||
langs: [String],
|
langs: [String],
|
||||||
defaultLang: String,
|
defaultLang: String,
|
||||||
tags: [String],
|
tags: [String],
|
||||||
outputPath: String,
|
lprojPathFormat: String
|
||||||
inputFilenameWithoutExt: String
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
var stringsFilesContent = [String: String]()
|
var stringsFilesContent = [String: String]()
|
||||||
@ -37,7 +36,7 @@ enum StringsFileGenerator {
|
|||||||
langs.forEach { lang in
|
langs.forEach { lang in
|
||||||
guard let fileContent = stringsFilesContent[lang] else { return }
|
guard let fileContent = stringsFilesContent[lang] else { return }
|
||||||
|
|
||||||
let stringsFilePath = "\(outputPath)/\(lang).lproj/\(inputFilenameWithoutExt).strings"
|
let stringsFilePath = String(format: lprojPathFormat, lang)
|
||||||
let stringsFilePathURL = URL(fileURLWithPath: stringsFilePath)
|
let stringsFilePathURL = URL(fileURLWithPath: stringsFilePath)
|
||||||
do {
|
do {
|
||||||
try fileContent.write(to: stringsFilePathURL, atomically: false, encoding: .utf8)
|
try fileContent.write(to: stringsFilePathURL, atomically: false, encoding: .utf8)
|
||||||
@ -54,8 +53,7 @@ enum StringsFileGenerator {
|
|||||||
langs: [String],
|
langs: [String],
|
||||||
defaultLang: String,
|
defaultLang: String,
|
||||||
tags: [String],
|
tags: [String],
|
||||||
outputPath: String,
|
xcStringsFilePath: String
|
||||||
inputFilenameWithoutExt: String
|
|
||||||
) {
|
) {
|
||||||
|
|
||||||
let fileContent: String = Self.generateXcStringsFileContent(
|
let fileContent: String = Self.generateXcStringsFileContent(
|
||||||
@ -65,12 +63,11 @@ enum StringsFileGenerator {
|
|||||||
sections: sections
|
sections: sections
|
||||||
)
|
)
|
||||||
|
|
||||||
let stringsFilePath = "\(outputPath)/\(inputFilenameWithoutExt).xcstrings"
|
let stringsFilePathURL = URL(fileURLWithPath: xcStringsFilePath)
|
||||||
let stringsFilePathURL = URL(fileURLWithPath: stringsFilePath)
|
|
||||||
do {
|
do {
|
||||||
try fileContent.write(to: stringsFilePathURL, atomically: false, encoding: .utf8)
|
try fileContent.write(to: stringsFilePathURL, atomically: false, encoding: .utf8)
|
||||||
} catch {
|
} catch {
|
||||||
let error = StringiumError.writeFile(error.localizedDescription, stringsFilePath)
|
let error = StringiumError.writeFile(error.localizedDescription, xcStringsFilePath)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
Stringium.exit(withError: error)
|
Stringium.exit(withError: error)
|
||||||
}
|
}
|
||||||
@ -254,7 +251,8 @@ enum StringsFileGenerator {
|
|||||||
inputFilename: String,
|
inputFilename: String,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
extensionFilePath: String,
|
extensionFilePath: String,
|
||||||
extensionSuffix: String
|
extensionSuffix: String,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) {
|
) {
|
||||||
// Get extension content
|
// Get extension content
|
||||||
let extensionFileContent = Self.getExtensionContent(
|
let extensionFileContent = Self.getExtensionContent(
|
||||||
@ -264,7 +262,8 @@ enum StringsFileGenerator {
|
|||||||
staticVar: staticVar,
|
staticVar: staticVar,
|
||||||
inputFilename: inputFilename,
|
inputFilename: inputFilename,
|
||||||
extensionName: extensionName,
|
extensionName: extensionName,
|
||||||
extensionSuffix: extensionSuffix
|
extensionSuffix: extensionSuffix,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Write content
|
// Write content
|
||||||
@ -287,7 +286,8 @@ enum StringsFileGenerator {
|
|||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
inputFilename: String,
|
inputFilename: String,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
extensionSuffix: String
|
extensionSuffix: String,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
[
|
[
|
||||||
Self.getHeader(
|
Self.getHeader(
|
||||||
@ -298,13 +298,15 @@ enum StringsFileGenerator {
|
|||||||
sections: sections,
|
sections: sections,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
extensionClassname: extensionName,
|
extensionClassname: extensionName,
|
||||||
extensionSuffix: extensionSuffix
|
extensionSuffix: extensionSuffix,
|
||||||
|
visibility: visibility
|
||||||
),
|
),
|
||||||
Self.getProperties(
|
Self.getProperties(
|
||||||
sections: sections,
|
sections: sections,
|
||||||
defaultLang: lang,
|
defaultLang: lang,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
staticVar: staticVar
|
staticVar: staticVar,
|
||||||
|
visibility: visibility
|
||||||
),
|
),
|
||||||
Self.getFooter()
|
Self.getFooter()
|
||||||
]
|
]
|
||||||
@ -329,9 +331,10 @@ enum StringsFileGenerator {
|
|||||||
sections: [Section],
|
sections: [Section],
|
||||||
tags: [String],
|
tags: [String],
|
||||||
extensionClassname: String,
|
extensionClassname: String,
|
||||||
extensionSuffix: String
|
extensionSuffix: String,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
var enumDefinition = "\n enum Key\(extensionSuffix.uppercasedFirst()): String {\n"
|
var enumDefinition = "\n \(visibility) enum Key\(extensionSuffix.uppercasedFirst()): String {\n"
|
||||||
|
|
||||||
// Enum
|
// Enum
|
||||||
sections.forEach { section in
|
sections.forEach { section in
|
||||||
@ -350,7 +353,7 @@ enum StringsFileGenerator {
|
|||||||
|
|
||||||
// KeyPath accessors
|
// KeyPath accessors
|
||||||
enumDefinition += "\n"
|
enumDefinition += "\n"
|
||||||
enumDefinition += " var keyPath: KeyPath<\(extensionClassname), String> {\n"
|
enumDefinition += " \(visibility) var keyPath: KeyPath<\(extensionClassname), String> {\n"
|
||||||
enumDefinition += " switch self {\n"
|
enumDefinition += " switch self {\n"
|
||||||
sections.forEach { section in
|
sections.forEach { section in
|
||||||
// Check that at least one string will be generated
|
// Check that at least one string will be generated
|
||||||
@ -372,7 +375,13 @@ enum StringsFileGenerator {
|
|||||||
return enumDefinition
|
return enumDefinition
|
||||||
}
|
}
|
||||||
|
|
||||||
private static func getProperties(sections: [Section], defaultLang lang: String, tags: [String], staticVar: Bool) -> String {
|
private static func getProperties(
|
||||||
|
sections: [Section],
|
||||||
|
defaultLang lang: String,
|
||||||
|
tags: [String],
|
||||||
|
staticVar: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
sections.compactMap { section in
|
sections.compactMap { section in
|
||||||
// Check that at least one string will be generated
|
// Check that at least one string will be generated
|
||||||
guard section.hasOneOrMoreMatchingTags(tags: tags) else {
|
guard section.hasOneOrMoreMatchingTags(tags: tags) else {
|
||||||
@ -385,10 +394,21 @@ enum StringsFileGenerator {
|
|||||||
return nil // Go to next definition
|
return nil // Go to next definition
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let property: String = {
|
||||||
if staticVar {
|
if staticVar {
|
||||||
return "\n\(definition.getNSLocalizedStringStaticProperty(forLang: lang))"
|
definition.getNSLocalizedStringStaticProperty(
|
||||||
|
forLang: lang,
|
||||||
|
visibility: visibility
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
definition.getNSLocalizedStringProperty(
|
||||||
|
forLang: lang,
|
||||||
|
visibility: visibility
|
||||||
|
)
|
||||||
}
|
}
|
||||||
return "\n\(definition.getNSLocalizedStringProperty(forLang: lang))"
|
}()
|
||||||
|
|
||||||
|
return "\n\(property)"
|
||||||
}
|
}
|
||||||
.joined(separator: "\n")
|
.joined(separator: "\n")
|
||||||
return res
|
return res
|
||||||
|
@ -17,7 +17,8 @@ enum TagsGenerator {
|
|||||||
tags: [String],
|
tags: [String],
|
||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String,
|
extensionName: String,
|
||||||
extensionFilePath: String
|
extensionFilePath: String,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) {
|
) {
|
||||||
// Get extension content
|
// Get extension content
|
||||||
let extensionFileContent = Self.getExtensionContent(
|
let extensionFileContent = Self.getExtensionContent(
|
||||||
@ -25,7 +26,8 @@ enum TagsGenerator {
|
|||||||
lang: lang,
|
lang: lang,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
staticVar: staticVar,
|
staticVar: staticVar,
|
||||||
extensionName: extensionName
|
extensionName: extensionName,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Write content
|
// Write content
|
||||||
@ -46,7 +48,8 @@ enum TagsGenerator {
|
|||||||
lang: String,
|
lang: String,
|
||||||
tags: [String],
|
tags: [String],
|
||||||
staticVar: Bool,
|
staticVar: Bool,
|
||||||
extensionName: String
|
extensionName: String,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
[
|
[
|
||||||
Self.getHeader(
|
Self.getHeader(
|
||||||
@ -57,7 +60,8 @@ enum TagsGenerator {
|
|||||||
sections: sections,
|
sections: sections,
|
||||||
lang: lang,
|
lang: lang,
|
||||||
tags: tags,
|
tags: tags,
|
||||||
staticVar: staticVar
|
staticVar: staticVar,
|
||||||
|
visibility: visibility
|
||||||
),
|
),
|
||||||
Self.getFooter()
|
Self.getFooter()
|
||||||
]
|
]
|
||||||
@ -80,7 +84,8 @@ enum TagsGenerator {
|
|||||||
sections: [Section],
|
sections: [Section],
|
||||||
lang: String,
|
lang: String,
|
||||||
tags: [String],
|
tags: [String],
|
||||||
staticVar: Bool
|
staticVar: Bool,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
sections
|
sections
|
||||||
.compactMap { section in
|
.compactMap { section in
|
||||||
@ -96,9 +101,9 @@ enum TagsGenerator {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if staticVar {
|
if staticVar {
|
||||||
res += "\n\n\(definition.getStaticProperty(forLang: lang))"
|
res += "\n\n\(definition.getStaticProperty(forLang: lang, visibility: visibility))"
|
||||||
} else {
|
} else {
|
||||||
res += "\n\n\(definition.getProperty(forLang: lang))"
|
res += "\n\n\(definition.getProperty(forLang: lang, visibility: visibility))"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return res
|
return res
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
// swiftlint:disable force_unwrapping
|
// swiftlint:disable force_unwrapping
|
||||||
|
|
||||||
@ -99,14 +100,20 @@ class Definition {
|
|||||||
return (inputParameters: inputParameters, translationArguments: translationArguments)
|
return (inputParameters: inputParameters, translationArguments: translationArguments)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func getBaseProperty(lang: String, translation: String, isStatic: Bool, comment: String?) -> String {
|
private func getBaseProperty(
|
||||||
|
lang: String,
|
||||||
|
translation: String,
|
||||||
|
isStatic: Bool,
|
||||||
|
comment: String?,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
|
) -> String {
|
||||||
"""
|
"""
|
||||||
/// Translation in \(lang) :
|
/// Translation in \(lang) :
|
||||||
/// \(translation)
|
/// \(translation)
|
||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
||||||
\(isStatic ? "static " : "")var \(name): String {
|
\(visibility) \(isStatic ? "static " : "")var \(name): String {
|
||||||
NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "\(comment ?? "")")
|
NSLocalizedString("\(name)", tableName: kStringsFileName, bundle: Bundle.main, value: "\(translation)", comment: "\(comment ?? "")")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -118,7 +125,8 @@ class Definition {
|
|||||||
isStatic: Bool,
|
isStatic: Bool,
|
||||||
inputParameters: [String],
|
inputParameters: [String],
|
||||||
translationArguments: [String],
|
translationArguments: [String],
|
||||||
comment: String?
|
comment: String?,
|
||||||
|
visibility: ExtensionVisibility
|
||||||
) -> String {
|
) -> String {
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@ -127,13 +135,13 @@ class Definition {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
||||||
\(isStatic ? "static " : "")func \(name)(\(inputParameters.joined(separator: ", "))) -> String {
|
\(visibility) \(isStatic ? "static " : "")func \(name)(\(inputParameters.joined(separator: ", "))) -> String {
|
||||||
String(format: \(isStatic ? "Self" : "self").\(name), \(translationArguments.joined(separator: ", ")))
|
String(format: \(isStatic ? "Self" : "self").\(name), \(translationArguments.joined(separator: ", ")))
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNSLocalizedStringProperty(forLang lang: String) -> String {
|
func getNSLocalizedStringProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
|
||||||
guard let translation = translations[lang] else {
|
guard let translation = translations[lang] else {
|
||||||
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
@ -145,7 +153,8 @@ class Definition {
|
|||||||
lang: lang,
|
lang: lang,
|
||||||
translation: translation,
|
translation: translation,
|
||||||
isStatic: false,
|
isStatic: false,
|
||||||
comment: self.comment
|
comment: self.comment,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Generate method
|
// Generate method
|
||||||
@ -157,14 +166,15 @@ class Definition {
|
|||||||
isStatic: false,
|
isStatic: false,
|
||||||
inputParameters: parameters.inputParameters,
|
inputParameters: parameters.inputParameters,
|
||||||
translationArguments: parameters.translationArguments,
|
translationArguments: parameters.translationArguments,
|
||||||
comment: self.comment
|
comment: self.comment,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
return property + method
|
return property + method
|
||||||
}
|
}
|
||||||
|
|
||||||
func getNSLocalizedStringStaticProperty(forLang lang: String) -> String {
|
func getNSLocalizedStringStaticProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
|
||||||
guard let translation = translations[lang] else {
|
guard let translation = translations[lang] else {
|
||||||
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
@ -176,7 +186,8 @@ class Definition {
|
|||||||
lang: lang,
|
lang: lang,
|
||||||
translation: translation,
|
translation: translation,
|
||||||
isStatic: true,
|
isStatic: true,
|
||||||
comment: self.comment
|
comment: self.comment,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
|
|
||||||
// Generate method
|
// Generate method
|
||||||
@ -188,7 +199,8 @@ class Definition {
|
|||||||
isStatic: true,
|
isStatic: true,
|
||||||
inputParameters: parameters.inputParameters,
|
inputParameters: parameters.inputParameters,
|
||||||
translationArguments: parameters.translationArguments,
|
translationArguments: parameters.translationArguments,
|
||||||
comment: self.comment
|
comment: self.comment,
|
||||||
|
visibility: visibility
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -197,7 +209,7 @@ class Definition {
|
|||||||
|
|
||||||
// MARK: - Raw strings
|
// MARK: - Raw strings
|
||||||
|
|
||||||
func getProperty(forLang lang: String) -> String {
|
func getProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
|
||||||
guard let translation = translations[lang] else {
|
guard let translation = translations[lang] else {
|
||||||
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
@ -210,14 +222,13 @@ class Definition {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
||||||
|
\(visibility) var \(name): String {
|
||||||
var \(name): String {
|
|
||||||
"\(translation)"
|
"\(translation)"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
|
|
||||||
func getStaticProperty(forLang lang: String) -> String {
|
func getStaticProperty(forLang lang: String, visibility: ExtensionVisibility) -> String {
|
||||||
guard let translation = translations[lang] else {
|
guard let translation = translations[lang] else {
|
||||||
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
let error = StringiumError.langNotDefined(lang, name, reference != nil)
|
||||||
print(error.description)
|
print(error.description)
|
||||||
@ -230,7 +241,7 @@ class Definition {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
/// \(comment?.isEmpty == false ? comment! : "No comment")
|
||||||
static var \(name): String {
|
\(visibility) static var \(name): String {
|
||||||
"\(translation)"
|
"\(translation)"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -21,7 +21,6 @@ struct Stringium: ParsableCommand {
|
|||||||
// MARK: - Static
|
// MARK: - Static
|
||||||
|
|
||||||
static let toolName = "Stringium"
|
static let toolName = "Stringium"
|
||||||
static let defaultExtensionName = "String"
|
|
||||||
static let noTranslationTag: String = "notranslation"
|
static let noTranslationTag: String = "notranslation"
|
||||||
|
|
||||||
// MARK: - Command options
|
// MARK: - Command options
|
||||||
@ -49,8 +48,7 @@ struct Stringium: ParsableCommand {
|
|||||||
langs: options.langs,
|
langs: options.langs,
|
||||||
defaultLang: options.defaultLang,
|
defaultLang: options.defaultLang,
|
||||||
tags: options.tags,
|
tags: options.tags,
|
||||||
outputPath: options.stringsFileOutputPath,
|
lprojPathFormat: options.lprojPathFormat
|
||||||
inputFilenameWithoutExt: options.inputFilenameWithoutExt
|
|
||||||
)
|
)
|
||||||
} else {
|
} else {
|
||||||
StringsFileGenerator.writeXcStringsFiles(
|
StringsFileGenerator.writeXcStringsFiles(
|
||||||
@ -58,22 +56,26 @@ struct Stringium: ParsableCommand {
|
|||||||
langs: options.langs,
|
langs: options.langs,
|
||||||
defaultLang: options.defaultLang,
|
defaultLang: options.defaultLang,
|
||||||
tags: options.tags,
|
tags: options.tags,
|
||||||
outputPath: options.stringsFileOutputPath,
|
xcStringsFilePath: options.xcStringsFilePath
|
||||||
inputFilenameWithoutExt: options.inputFilenameWithoutExt
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Generate extension
|
// Generate extension
|
||||||
|
if let extensionName = options.extensionName,
|
||||||
|
let extensionFilePath = options.extensionFilePath {
|
||||||
|
print("Will generate extensions")
|
||||||
StringsFileGenerator.writeExtensionFiles(
|
StringsFileGenerator.writeExtensionFiles(
|
||||||
sections: sections,
|
sections: sections,
|
||||||
defaultLang: options.defaultLang,
|
defaultLang: options.defaultLang,
|
||||||
tags: options.tags,
|
tags: options.tags,
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
inputFilename: options.inputFilenameWithoutExt,
|
inputFilename: options.inputFilenameWithoutExt,
|
||||||
extensionName: options.extensionName,
|
extensionName: extensionName,
|
||||||
extensionFilePath: options.extensionFilePath,
|
extensionFilePath: extensionFilePath,
|
||||||
extensionSuffix: options.extensionSuffix
|
extensionSuffix: options.extensionSuffix ?? "",
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
}
|
||||||
|
|
||||||
print("[\(Self.toolName)] Strings generated")
|
print("[\(Self.toolName)] Strings generated")
|
||||||
}
|
}
|
||||||
@ -104,10 +106,18 @@ struct Stringium: ParsableCommand {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Check if needed to regenerate
|
// Check if needed to regenerate
|
||||||
|
let fileToCompareToInput: String = {
|
||||||
|
// If there is no extension file to compare
|
||||||
|
// Then check the xcassets file instead
|
||||||
|
if options.xcStrings {
|
||||||
|
return options.xcStringsFilePath
|
||||||
|
}
|
||||||
|
return String(format: options.lprojPathFormat, options.defaultLang)
|
||||||
|
}()
|
||||||
guard GeneratorChecker.shouldGenerate(
|
guard GeneratorChecker.shouldGenerate(
|
||||||
force: options.forceGeneration,
|
force: options.forceGeneration,
|
||||||
inputFilePath: options.inputFile,
|
inputFilePath: options.inputFile,
|
||||||
extensionFilePath: options.extensionFilePath
|
extensionFilePath: fileToCompareToInput
|
||||||
) else {
|
) else {
|
||||||
print("[\(Self.toolName)] Strings are already up to date :) ")
|
print("[\(Self.toolName)] Strings are already up to date :) ")
|
||||||
return false
|
return false
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
// swiftlint:disable no_grouping_extension
|
// swiftlint:disable no_grouping_extension
|
||||||
|
|
||||||
@ -15,35 +16,58 @@ struct StringiumOptions: ParsableArguments {
|
|||||||
@Flag(name: [.customShort("f"), .customShort("F")], help: "Should force generation")
|
@Flag(name: [.customShort("f"), .customShort("F")], help: "Should force generation")
|
||||||
var forceGeneration = false
|
var forceGeneration = false
|
||||||
|
|
||||||
@Argument(help: "Input files where strings are defined.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Argument(
|
||||||
|
help: "Input files where strings are defined.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
var inputFile: String
|
var inputFile: String
|
||||||
|
|
||||||
@Option(name: .customLong("output-path"), help: "Path where to strings file.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(
|
||||||
|
name: .customLong("output-path"),
|
||||||
|
help: "Path where to find the .xcStrings file or the lproj folders.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
fileprivate var outputPathRaw: String
|
fileprivate var outputPathRaw: String
|
||||||
|
|
||||||
@Option(name: .customLong("langs"), help: "Langs to generate.")
|
@Option(
|
||||||
|
name: .customLong("langs"),
|
||||||
|
help: "Langs to generate."
|
||||||
|
)
|
||||||
fileprivate var langsRaw: String
|
fileprivate var langsRaw: String
|
||||||
|
|
||||||
@Option(help: "Default langs.")
|
@Option(help: "Default langs.")
|
||||||
var defaultLang: String
|
var defaultLang: String
|
||||||
|
|
||||||
@Option(name: .customLong("tags"), help: "Tags to generate.")
|
@Option(
|
||||||
|
name: .customLong("tags"),
|
||||||
|
help: "Tags to generate."
|
||||||
|
)
|
||||||
fileprivate var tagsRaw: String = "ios iosonly iosOnly notranslation"
|
fileprivate var tagsRaw: String = "ios iosonly iosOnly notranslation"
|
||||||
|
|
||||||
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(help: "Generate static properties. False by default")
|
||||||
var extensionOutputPath: String
|
|
||||||
|
|
||||||
@Option(help: "Tell if it will generate static properties or not")
|
|
||||||
var staticMembers: Bool = false
|
var staticMembers: Bool = false
|
||||||
|
|
||||||
@Option(help: "Tell if it will generate xcStrings file or not")
|
@Option(help: "Tell if it will generate xcStrings file or lproj file. True by default")
|
||||||
var xcStrings: Bool = false
|
var xcStrings: Bool = true
|
||||||
|
|
||||||
@Option(help: "Extension name. If not specified, it will generate an String extension.")
|
@Option(
|
||||||
var extensionName: String = Stringium.defaultExtensionName
|
name: .customLong("visibility"),
|
||||||
|
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
|
||||||
|
completion: .list(["public", "private", "package", "internal"])
|
||||||
|
)
|
||||||
|
var extensionVisibility: ExtensionVisibility = .internal
|
||||||
|
|
||||||
|
@Option(
|
||||||
|
help: "Path where to generate the extension.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
|
var extensionOutputPath: String?
|
||||||
|
|
||||||
|
@Option(help: "Extension name. If not specified, no extension will be generated.")
|
||||||
|
var extensionName: String?
|
||||||
|
|
||||||
@Option(help: "Extension suffix: {extensionName}+{extensionSuffix}.swift")
|
@Option(help: "Extension suffix: {extensionName}+{extensionSuffix}.swift")
|
||||||
var extensionSuffix: String
|
var extensionSuffix: String?
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Private var getter
|
// MARK: - Private var getter
|
||||||
@ -75,12 +99,21 @@ extension StringiumOptions {
|
|||||||
|
|
||||||
extension StringiumOptions {
|
extension StringiumOptions {
|
||||||
|
|
||||||
var extensionFileName: String {
|
private var extensionFileName: String? {
|
||||||
"\(extensionName)+\(extensionSuffix).swift"
|
if let extensionName {
|
||||||
|
if let extensionSuffix {
|
||||||
|
return "\(extensionName)+\(extensionSuffix).swift"
|
||||||
|
}
|
||||||
|
return "\(extensionName).swift"
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var extensionFilePath: String {
|
var extensionFilePath: String? {
|
||||||
"\(extensionOutputPath)/\(extensionFileName)"
|
if let extensionOutputPath, let extensionFileName {
|
||||||
|
return "\(extensionOutputPath)/\(extensionFileName)"
|
||||||
|
}
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var inputFilenameWithoutExt: String {
|
var inputFilenameWithoutExt: String {
|
||||||
@ -88,4 +121,12 @@ extension StringiumOptions {
|
|||||||
.deletingPathExtension()
|
.deletingPathExtension()
|
||||||
.lastPathComponent
|
.lastPathComponent
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var xcStringsFilePath: String {
|
||||||
|
"\(stringsFileOutputPath)/\(inputFilenameWithoutExt).xcstrings"
|
||||||
|
}
|
||||||
|
|
||||||
|
var lprojPathFormat: String {
|
||||||
|
"\(stringsFileOutputPath)/%@.lproj/\(inputFilenameWithoutExt).strings"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,8 @@ struct Tags: ParsableCommand {
|
|||||||
tags: ["ios", "iosonly", Self.noTranslationTag],
|
tags: ["ios", "iosonly", Self.noTranslationTag],
|
||||||
staticVar: options.staticMembers,
|
staticVar: options.staticMembers,
|
||||||
extensionName: options.extensionName,
|
extensionName: options.extensionName,
|
||||||
extensionFilePath: options.extensionFilePath
|
extensionFilePath: options.extensionFilePath,
|
||||||
|
visibility: options.extensionVisibility
|
||||||
)
|
)
|
||||||
|
|
||||||
print("[\(Self.toolName)] Tags generated")
|
print("[\(Self.toolName)] Tags generated")
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
import ArgumentParser
|
import ArgumentParser
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import ToolCore
|
||||||
|
|
||||||
// swiftlint:disable no_grouping_extension
|
// swiftlint:disable no_grouping_extension
|
||||||
|
|
||||||
@ -21,7 +22,17 @@ struct TagsOptions: ParsableArguments {
|
|||||||
@Option(help: "Lang to generate. (\"ium\" by default)")
|
@Option(help: "Lang to generate. (\"ium\" by default)")
|
||||||
var lang: String = "ium"
|
var lang: String = "ium"
|
||||||
|
|
||||||
@Option(help: "Path where to generate the extension.", transform: { $0.replaceTiltWithHomeDirectoryPath() })
|
@Option(
|
||||||
|
name: .customLong("visibility"),
|
||||||
|
help: "Visibility of extension and properties. Possibles values: public, private, package, internal. Default is internal",
|
||||||
|
completion: .list(["public", "private", "package", "internal"])
|
||||||
|
)
|
||||||
|
var extensionVisibility: ExtensionVisibility = .internal
|
||||||
|
|
||||||
|
@Option(
|
||||||
|
help: "Path where to generate the extension.",
|
||||||
|
transform: { $0.replaceTiltWithHomeDirectoryPath() }
|
||||||
|
)
|
||||||
var extensionOutputPath: String
|
var extensionOutputPath: String
|
||||||
|
|
||||||
@Option(help: "Tell if it will generate static properties or not")
|
@Option(help: "Tell if it will generate static properties or not")
|
||||||
|
34
Sources/ToolCore/ExtensionVisibility.swift
Normal file
34
Sources/ToolCore/ExtensionVisibility.swift
Normal file
@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// ExtensionVisibility.swift
|
||||||
|
// ResgenSwift
|
||||||
|
//
|
||||||
|
// Created by Thibaut Schmitt on 17/07/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import ArgumentParser
|
||||||
|
|
||||||
|
package enum ExtensionVisibility: String, CustomStringConvertible, ExpressibleByArgument {
|
||||||
|
|
||||||
|
case `public`
|
||||||
|
case `private`
|
||||||
|
case `internal`
|
||||||
|
case `package`
|
||||||
|
|
||||||
|
// MARK: - CustomStringConvertible
|
||||||
|
|
||||||
|
package var description: String {
|
||||||
|
switch self {
|
||||||
|
case .public:
|
||||||
|
"public"
|
||||||
|
|
||||||
|
case .private:
|
||||||
|
"private"
|
||||||
|
|
||||||
|
case .internal:
|
||||||
|
"internal"
|
||||||
|
|
||||||
|
case .package:
|
||||||
|
"package"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -9,4 +9,4 @@ import Foundation
|
|||||||
|
|
||||||
// swiftlint:disable prefixed_toplevel_constant identifier_name
|
// swiftlint:disable prefixed_toplevel_constant identifier_name
|
||||||
|
|
||||||
public let ResgenSwiftVersion = "2.1.0"
|
public let ResgenSwiftVersion = "2.2.0"
|
||||||
|
@ -55,14 +55,15 @@ final class AnalyticsDefinitionTests: XCTestCase {
|
|||||||
definition.path = "ecran_un/"
|
definition.path = "ecran_un/"
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyScreen = definition.getProperty()
|
let propertyScreen = definition.getProperty(visibility: .internal)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectScreen = """
|
let expectScreen = """
|
||||||
func logScreenDefinitionName() {
|
internal func logScreenDefinitionName() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "Ecran un",
|
name: "Ecran un",
|
||||||
path: "ecran_un/"
|
path: "ecran_un/",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -75,16 +76,16 @@ final class AnalyticsDefinitionTests: XCTestCase {
|
|||||||
let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .event)
|
let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .event)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyEvent = definition.getProperty()
|
let propertyEvent = definition.getProperty(visibility: .public)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectEvent = """
|
let expectEvent = """
|
||||||
func logEventDefinitionName() {
|
public func logEventDefinitionName() {
|
||||||
logEvent(
|
logEvent(
|
||||||
name: "Ecran un",
|
name: "Ecran un",
|
||||||
action: "",
|
action: "",
|
||||||
category: "",
|
category: "",
|
||||||
params: [:]
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -98,14 +99,15 @@ final class AnalyticsDefinitionTests: XCTestCase {
|
|||||||
definition.path = "ecran_un/"
|
definition.path = "ecran_un/"
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyScreen = definition.getStaticProperty()
|
let propertyScreen = definition.getStaticProperty(visibility: .private)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectScreen = """
|
let expectScreen = """
|
||||||
static func logScreenDefinitionName() {
|
private static func logScreenDefinitionName() {
|
||||||
logScreen(
|
AnalyticsManager.shared.logScreen(
|
||||||
name: "Ecran un",
|
name: "Ecran un",
|
||||||
path: "ecran_un/"
|
path: "ecran_un/",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -118,16 +120,16 @@ final class AnalyticsDefinitionTests: XCTestCase {
|
|||||||
let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .event)
|
let definition = AnalyticsDefinition(id: "definition_name", name: "Ecran un", type: .event)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyEvent = definition.getStaticProperty()
|
let propertyEvent = definition.getStaticProperty(visibility: .package)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectEvent = """
|
let expectEvent = """
|
||||||
static func logEventDefinitionName() {
|
package static func logEventDefinitionName() {
|
||||||
logEvent(
|
AnalyticsManager.shared.logEvent(
|
||||||
name: "Ecran un",
|
name: "Ecran un",
|
||||||
action: "",
|
action: "",
|
||||||
category: "",
|
category: "",
|
||||||
params: [:]
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -32,6 +32,182 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
return definition
|
return definition
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private func protocolString(visibility: ExtensionVisibility) -> String {
|
||||||
|
"""
|
||||||
|
// MARK: - Protocol
|
||||||
|
|
||||||
|
\(visibility) protocol AnalyticsManagerProtocol {
|
||||||
|
|
||||||
|
func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
)
|
||||||
|
|
||||||
|
func logEvent(
|
||||||
|
name: String,
|
||||||
|
action: String,
|
||||||
|
category: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
)
|
||||||
|
|
||||||
|
func setEnable(_ enable: Bool)
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
private func firebaseString() -> String {
|
||||||
|
"""
|
||||||
|
// MARK: - Firebase
|
||||||
|
|
||||||
|
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
||||||
|
|
||||||
|
// MARK: - Methods
|
||||||
|
|
||||||
|
func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
|
var parameters = [
|
||||||
|
AnalyticsParameterScreenName: name as NSObject
|
||||||
|
]
|
||||||
|
|
||||||
|
if path.isEmpty == false {
|
||||||
|
parameters["path"] = path + "/iOS" as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
|
if let supplementaryParameters = params {
|
||||||
|
for (newKey, newValue) in supplementaryParameters {
|
||||||
|
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||||
|
key == newKey
|
||||||
|
}) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
parameters[newKey] = newValue as? NSObject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Analytics.logEvent(
|
||||||
|
AnalyticsEventScreenView,
|
||||||
|
parameters: parameters
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func logEvent(
|
||||||
|
name: String,
|
||||||
|
action: String,
|
||||||
|
category: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
|
var parameters: [String:NSObject] = [
|
||||||
|
AnalyticsParameterItemName: name.replacingOccurrences(of: " ", with: "_") as NSObject
|
||||||
|
]
|
||||||
|
|
||||||
|
if category.isEmpty == false {
|
||||||
|
parameters["AnalyticsParameterItemCategory"] = category as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
|
if action.isEmpty == false {
|
||||||
|
parameters["action"] = action as NSObject
|
||||||
|
}
|
||||||
|
|
||||||
|
if let supplementaryParameters = params {
|
||||||
|
for (newKey, newValue) in supplementaryParameters {
|
||||||
|
if parameters.contains(where: { (key: String, value: NSObject) in
|
||||||
|
key == newKey
|
||||||
|
}) {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
parameters[newKey] = newValue as? NSObject
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Analytics.logEvent(
|
||||||
|
AnalyticsEventSelectContent,
|
||||||
|
parameters: parameters
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setEnable(_ enable: Bool) {
|
||||||
|
Analytics.setAnalyticsCollectionEnabled(enable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
|
private func matomoString() -> String {
|
||||||
|
"""
|
||||||
|
// MARK: - Matomo
|
||||||
|
|
||||||
|
class MatomoAnalyticsManager: AnalyticsManagerProtocol {
|
||||||
|
|
||||||
|
// MARK: - Properties
|
||||||
|
|
||||||
|
private var tracker: MatomoTracker
|
||||||
|
|
||||||
|
// MARK: - Init
|
||||||
|
|
||||||
|
init(siteId: String, url: String) {
|
||||||
|
debugPrint("[Matomo service] Server URL: \\(url)")
|
||||||
|
debugPrint("[Matomo service] Site ID: \\(siteId)")
|
||||||
|
tracker = MatomoTracker(
|
||||||
|
siteId: siteId,
|
||||||
|
baseURL: URL(string: url)!
|
||||||
|
)
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
tracker.dispatchInterval = 5
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if DEBUG
|
||||||
|
tracker.logger = DefaultLogger(minLevel: .verbose)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
debugPrint("[Matomo service] Configured with content base: \\(tracker.contentBase?.absoluteString ?? "-")")
|
||||||
|
debugPrint("[Matomo service] Opt out: \\(tracker.isOptedOut)")
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Methods
|
||||||
|
|
||||||
|
func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
|
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
||||||
|
|
||||||
|
let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS")
|
||||||
|
tracker.track(
|
||||||
|
view: [name],
|
||||||
|
url: urlString
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func logEvent(
|
||||||
|
name: String,
|
||||||
|
action: String,
|
||||||
|
category: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
|
tracker.track(
|
||||||
|
eventWithCategory: category,
|
||||||
|
action: action,
|
||||||
|
name: name,
|
||||||
|
number: nil,
|
||||||
|
url: nil
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func setEnable(_ enable: Bool) {
|
||||||
|
tracker.isOptedOut = !enable
|
||||||
|
}
|
||||||
|
}
|
||||||
|
"""
|
||||||
|
}
|
||||||
|
|
||||||
func testGeneratedExtensionContentFirebase() {
|
func testGeneratedExtensionContentFirebase() {
|
||||||
// Given
|
// Given
|
||||||
let sectionOne = AnalyticsCategory(id: "section_one")
|
let sectionOne = AnalyticsCategory(id: "section_one")
|
||||||
@ -58,100 +234,86 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
sections: [sectionOne, sectionTwo, sectionThree],
|
sections: [sectionOne, sectionTwo, sectionThree],
|
||||||
tags: ["ios", "iosonly"],
|
tags: ["ios", "iosonly"],
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenAnalytics"
|
visibility: .public
|
||||||
)
|
)
|
||||||
|
|
||||||
// Expect Analytics
|
// Expect Analytics
|
||||||
let expect = """
|
let expect = """
|
||||||
// Generated by ResgenSwift.Analytics \(ResgenSwiftVersion)
|
// Generated by ResgenSwift.Analytics \(ResgenSwiftVersion)
|
||||||
|
|
||||||
|
import Foundation
|
||||||
import FirebaseAnalytics
|
import FirebaseAnalytics
|
||||||
|
|
||||||
// MARK: - Protocol
|
\(protocolString(visibility: .public))
|
||||||
|
|
||||||
protocol AnalyticsManagerProtocol {
|
\(firebaseString())
|
||||||
|
|
||||||
func logScreen(name: String, path: String)
|
// MARK: - Traker Type
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Firebase
|
public enum TrackerType: CaseIterable {
|
||||||
|
|
||||||
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
case firebase
|
||||||
|
|
||||||
func logScreen(name: String, path: String) {
|
|
||||||
var parameters = [
|
|
||||||
AnalyticsParameterScreenName: name as NSObject
|
|
||||||
]
|
|
||||||
|
|
||||||
Analytics.logEvent(
|
|
||||||
AnalyticsEventScreenView,
|
|
||||||
parameters: parameters
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
) {
|
|
||||||
var parameters: [String:NSObject] = [
|
|
||||||
"action": action as NSObject,
|
|
||||||
"category": category as NSObject,
|
|
||||||
]
|
|
||||||
|
|
||||||
if let supplementaryParameters = params {
|
|
||||||
for (newKey, newValue) in supplementaryParameters {
|
|
||||||
if parameters.contains(where: { (key: String, value: NSObject) in
|
|
||||||
key == newKey
|
|
||||||
}) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
parameters[newKey] = newValue as? NSObject
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Analytics.logEvent(
|
|
||||||
name.replacingOccurrences(of: [" "], with: "_"),
|
|
||||||
parameters: parameters
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Manager
|
// MARK: - Manager
|
||||||
|
|
||||||
class AnalyticsManager {
|
public class AnalyticsManager {
|
||||||
|
|
||||||
static var shared = AnalyticsManager()
|
public static var shared = AnalyticsManager()
|
||||||
|
|
||||||
|
private init() {}
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
var managers: [AnalyticsManagerProtocol] = []
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
private var isEnabled: Bool = true
|
private var isEnabled: Bool {
|
||||||
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
// MARK: - Methods
|
false
|
||||||
|
} else {
|
||||||
func setAnalyticsEnabled(_ enable: Bool) {
|
true
|
||||||
isEnabled = enable
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func configure() {
|
// MARK: - Enable Methods
|
||||||
managers.append(FirebaseAnalyticsManager())
|
|
||||||
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
|
managers.forEach { (key, value) in
|
||||||
|
if analytics.contains(where: { type in
|
||||||
|
type == key
|
||||||
|
}) {
|
||||||
|
value.setEnable(enable)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private func logScreen(name: String, path: String) {
|
public func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: true, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: false, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
public func configure() {
|
||||||
|
managers[TrackerType.firebase] = FirebaseAnalyticsManager()
|
||||||
|
}
|
||||||
|
|
||||||
|
// MARK: - Private Log Methods
|
||||||
|
|
||||||
|
private func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logScreen(name: name, path: path)
|
manager.logScreen(
|
||||||
|
name: name,
|
||||||
|
path: path,
|
||||||
|
params: params
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,7 +325,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
@ -175,28 +337,30 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - section_one
|
// MARK: - section_one
|
||||||
|
|
||||||
func logScreenS1DefOne() {
|
public func logScreenS1DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s1 def one",
|
name: "s1 def one",
|
||||||
path: ""
|
path: "",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func logEventS1DefTwo() {
|
public func logEventS1DefTwo() {
|
||||||
logEvent(
|
logEvent(
|
||||||
name: "s1 def two",
|
name: "s1 def two",
|
||||||
action: "",
|
action: "",
|
||||||
category: "",
|
category: "",
|
||||||
params: [:]
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - section_two
|
// MARK: - section_two
|
||||||
|
|
||||||
func logScreenS2DefOne() {
|
public func logScreenS2DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s2 def one",
|
name: "s2 def one",
|
||||||
path: ""
|
path: "",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -235,120 +399,88 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
sections: [sectionOne, sectionTwo, sectionThree],
|
sections: [sectionOne, sectionTwo, sectionThree],
|
||||||
tags: ["ios", "iosonly"],
|
tags: ["ios", "iosonly"],
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenAnalytics"
|
visibility: .package
|
||||||
)
|
)
|
||||||
// Expect Analytics
|
// Expect Analytics
|
||||||
let expect = """
|
let expect = """
|
||||||
// Generated by ResgenSwift.Analytics \(ResgenSwiftVersion)
|
// Generated by ResgenSwift.Analytics \(ResgenSwiftVersion)
|
||||||
|
|
||||||
|
import Foundation
|
||||||
import MatomoTracker
|
import MatomoTracker
|
||||||
|
|
||||||
// MARK: - Protocol
|
\(protocolString(visibility: .package))
|
||||||
|
|
||||||
protocol AnalyticsManagerProtocol {
|
\(matomoString())
|
||||||
|
|
||||||
func logScreen(name: String, path: String)
|
// MARK: - Traker Type
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Matomo
|
package enum TrackerType: CaseIterable {
|
||||||
|
|
||||||
class MatomoAnalyticsManager: AnalyticsManagerProtocol {
|
case matomo
|
||||||
|
|
||||||
// MARK: - Properties
|
|
||||||
|
|
||||||
private var tracker: MatomoTracker
|
|
||||||
|
|
||||||
// MARK: - Init
|
|
||||||
|
|
||||||
init(siteId: String, url: String) {
|
|
||||||
debugPrint("[Matomo service] Server URL: \\(url)")
|
|
||||||
debugPrint("[Matomo service] Site ID: \\(siteId)")
|
|
||||||
tracker = MatomoTracker(
|
|
||||||
siteId: siteId,
|
|
||||||
baseURL: URL(string: url)!
|
|
||||||
)
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
tracker.dispatchInterval = 5
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
tracker.logger = DefaultLogger(minLevel: .verbose)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
debugPrint("[Matomo service] Configured with content base: \\(tracker.contentBase?.absoluteString ?? "-")")
|
|
||||||
debugPrint("[Matomo service] Opt out: \\(tracker.isOptedOut)")
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Methods
|
|
||||||
|
|
||||||
func logScreen(name: String, path: String) {
|
|
||||||
guard !tracker.isOptedOut else { return }
|
|
||||||
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
|
||||||
|
|
||||||
let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS")
|
|
||||||
tracker.track(
|
|
||||||
view: [name],
|
|
||||||
url: urlString
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
) {
|
|
||||||
guard !tracker.isOptedOut else { return }
|
|
||||||
|
|
||||||
tracker.track(
|
|
||||||
eventWithCategory: category,
|
|
||||||
action: action,
|
|
||||||
name: name,
|
|
||||||
number: nil,
|
|
||||||
url: nil
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Manager
|
// MARK: - Manager
|
||||||
|
|
||||||
class AnalyticsManager {
|
package class AnalyticsManager {
|
||||||
|
|
||||||
static var shared = AnalyticsManager()
|
package static var shared = AnalyticsManager()
|
||||||
|
|
||||||
|
private init() {}
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
var managers: [AnalyticsManagerProtocol] = []
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
private var isEnabled: Bool = true
|
private var isEnabled: Bool {
|
||||||
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
// MARK: - Methods
|
false
|
||||||
|
} else {
|
||||||
func setAnalyticsEnabled(_ enable: Bool) {
|
true
|
||||||
isEnabled = enable
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func configure(siteId: String, url: String) {
|
// MARK: - Enable Methods
|
||||||
managers.append(
|
|
||||||
MatomoAnalyticsManager(
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
|
managers.forEach { (key, value) in
|
||||||
|
if analytics.contains(where: { type in
|
||||||
|
type == key
|
||||||
|
}) {
|
||||||
|
value.setEnable(enable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
package func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: true, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
package func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: false, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
package func configure(siteId: String, url: String) {
|
||||||
|
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
||||||
siteId: siteId,
|
siteId: siteId,
|
||||||
url: url
|
url: url
|
||||||
)
|
)
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func logScreen(name: String, path: String) {
|
// MARK: - Private Log Methods
|
||||||
|
|
||||||
|
private func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logScreen(name: name, path: path)
|
manager.logScreen(
|
||||||
|
name: name,
|
||||||
|
path: path,
|
||||||
|
params: params
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -360,7 +492,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
@ -372,28 +504,30 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - section_one
|
// MARK: - section_one
|
||||||
|
|
||||||
func logScreenS1DefOne() {
|
package func logScreenS1DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s1 def one",
|
name: "s1 def one",
|
||||||
path: "s1_def_one/"
|
path: "s1_def_one/",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func logEventS1DefTwo() {
|
package func logEventS1DefTwo() {
|
||||||
logEvent(
|
logEvent(
|
||||||
name: "s1 def two",
|
name: "s1 def two",
|
||||||
action: "test",
|
action: "test",
|
||||||
category: "test",
|
category: "test",
|
||||||
params: [:]
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - section_two
|
// MARK: - section_two
|
||||||
|
|
||||||
func logScreenS2DefOne() {
|
package func logScreenS2DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s2 def one",
|
name: "s2 def one",
|
||||||
path: "s2_def_one/"
|
path: "s2_def_one/",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -432,167 +566,94 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
sections: [sectionOne, sectionTwo, sectionThree],
|
sections: [sectionOne, sectionTwo, sectionThree],
|
||||||
tags: ["ios", "iosonly"],
|
tags: ["ios", "iosonly"],
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenAnalytics"
|
visibility: .internal
|
||||||
)
|
)
|
||||||
|
|
||||||
// Expect Analytics
|
// Expect Analytics
|
||||||
let expect = """
|
let expect = """
|
||||||
// Generated by ResgenSwift.Analytics \(ResgenSwiftVersion)
|
// Generated by ResgenSwift.Analytics \(ResgenSwiftVersion)
|
||||||
|
|
||||||
|
import Foundation
|
||||||
import MatomoTracker
|
import MatomoTracker
|
||||||
import FirebaseAnalytics
|
import FirebaseAnalytics
|
||||||
|
|
||||||
// MARK: - Protocol
|
\(protocolString(visibility: .internal))
|
||||||
|
|
||||||
protocol AnalyticsManagerProtocol {
|
\(matomoString())
|
||||||
|
|
||||||
func logScreen(name: String, path: String)
|
\(firebaseString())
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Matomo
|
// MARK: - Traker Type
|
||||||
|
|
||||||
class MatomoAnalyticsManager: AnalyticsManagerProtocol {
|
internal enum TrackerType: CaseIterable {
|
||||||
|
|
||||||
// MARK: - Properties
|
case matomo
|
||||||
|
case firebase
|
||||||
private var tracker: MatomoTracker
|
|
||||||
|
|
||||||
// MARK: - Init
|
|
||||||
|
|
||||||
init(siteId: String, url: String) {
|
|
||||||
debugPrint("[Matomo service] Server URL: \\(url)")
|
|
||||||
debugPrint("[Matomo service] Site ID: \\(siteId)")
|
|
||||||
tracker = MatomoTracker(
|
|
||||||
siteId: siteId,
|
|
||||||
baseURL: URL(string: url)!
|
|
||||||
)
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
tracker.dispatchInterval = 5
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if DEBUG
|
|
||||||
tracker.logger = DefaultLogger(minLevel: .verbose)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
debugPrint("[Matomo service] Configured with content base: \\(tracker.contentBase?.absoluteString ?? "-")")
|
|
||||||
debugPrint("[Matomo service] Opt out: \\(tracker.isOptedOut)")
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Methods
|
|
||||||
|
|
||||||
func logScreen(name: String, path: String) {
|
|
||||||
guard !tracker.isOptedOut else { return }
|
|
||||||
guard let trackerUrl = tracker.contentBase?.absoluteString else { return }
|
|
||||||
|
|
||||||
let urlString = URL(string: "\\(trackerUrl)" + "/" + "\\(path)" + "iOS")
|
|
||||||
tracker.track(
|
|
||||||
view: [name],
|
|
||||||
url: urlString
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
) {
|
|
||||||
guard !tracker.isOptedOut else { return }
|
|
||||||
|
|
||||||
tracker.track(
|
|
||||||
eventWithCategory: category,
|
|
||||||
action: action,
|
|
||||||
name: name,
|
|
||||||
number: nil,
|
|
||||||
url: nil
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: - Firebase
|
|
||||||
|
|
||||||
class FirebaseAnalyticsManager: AnalyticsManagerProtocol {
|
|
||||||
func logScreen(name: String, path: String) {
|
|
||||||
var parameters = [
|
|
||||||
AnalyticsParameterScreenName: name as NSObject
|
|
||||||
]
|
|
||||||
|
|
||||||
Analytics.logEvent(
|
|
||||||
AnalyticsEventScreenView,
|
|
||||||
parameters: parameters
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
func logEvent(
|
|
||||||
name: String,
|
|
||||||
action: String,
|
|
||||||
category: String,
|
|
||||||
params: [String: Any]?
|
|
||||||
) {
|
|
||||||
var parameters: [String:NSObject] = [
|
|
||||||
"action": action as NSObject,
|
|
||||||
"category": category as NSObject,
|
|
||||||
]
|
|
||||||
|
|
||||||
if let supplementaryParameters = params {
|
|
||||||
for (newKey, newValue) in supplementaryParameters {
|
|
||||||
if parameters.contains(where: { (key: String, value: NSObject) in
|
|
||||||
key == newKey
|
|
||||||
}) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
parameters[newKey] = newValue as? NSObject
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Analytics.logEvent(
|
|
||||||
name.replacingOccurrences(of: [" "], with: "_"),
|
|
||||||
parameters: parameters
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Manager
|
// MARK: - Manager
|
||||||
|
|
||||||
class AnalyticsManager {
|
internal class AnalyticsManager {
|
||||||
|
|
||||||
static var shared = AnalyticsManager()
|
internal static var shared = AnalyticsManager()
|
||||||
|
|
||||||
|
private init() {}
|
||||||
|
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
|
|
||||||
var managers: [AnalyticsManagerProtocol] = []
|
var managers: [TrackerType: AnalyticsManagerProtocol] = [:]
|
||||||
|
|
||||||
private var isEnabled: Bool = true
|
private var isEnabled: Bool {
|
||||||
|
if ProcessInfo.processInfo.environment["XCODE_RUNNING_FOR_PREVIEWS"] == "1" {
|
||||||
// MARK: - Methods
|
false
|
||||||
|
} else {
|
||||||
func setAnalyticsEnabled(_ enable: Bool) {
|
true
|
||||||
isEnabled = enable
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func configure(siteId: String, url: String) {
|
// MARK: - Enable Methods
|
||||||
managers.append(
|
|
||||||
MatomoAnalyticsManager(
|
private func setAnalytics(enable: Bool, _ analytics: [TrackerType]) {
|
||||||
|
managers.forEach { (key, value) in
|
||||||
|
if analytics.contains(where: { type in
|
||||||
|
type == key
|
||||||
|
}) {
|
||||||
|
value.setEnable(enable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal func enableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: true, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal func disableAnalytics(_ analytics: [TrackerType] = TrackerType.allCases) {
|
||||||
|
setAnalytics(enable: false, analytics)
|
||||||
|
}
|
||||||
|
|
||||||
|
internal func configure(siteId: String, url: String) {
|
||||||
|
managers[TrackerType.matomo] = MatomoAnalyticsManager(
|
||||||
siteId: siteId,
|
siteId: siteId,
|
||||||
url: url
|
url: url
|
||||||
)
|
)
|
||||||
)
|
managers[TrackerType.firebase] = FirebaseAnalyticsManager()
|
||||||
managers.append(FirebaseAnalyticsManager())
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func logScreen(name: String, path: String) {
|
// MARK: - Private Log Methods
|
||||||
|
|
||||||
|
private func logScreen(
|
||||||
|
name: String,
|
||||||
|
path: String,
|
||||||
|
params: [String: Any]?
|
||||||
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logScreen(name: name, path: path)
|
manager.logScreen(
|
||||||
|
name: name,
|
||||||
|
path: path,
|
||||||
|
params: params
|
||||||
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -604,7 +665,7 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
) {
|
) {
|
||||||
guard isEnabled else { return }
|
guard isEnabled else { return }
|
||||||
|
|
||||||
managers.forEach { manager in
|
managers.values.forEach { manager in
|
||||||
manager.logEvent(
|
manager.logEvent(
|
||||||
name: name,
|
name: name,
|
||||||
action: action,
|
action: action,
|
||||||
@ -616,28 +677,30 @@ final class AnalyticsGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
// MARK: - section_one
|
// MARK: - section_one
|
||||||
|
|
||||||
func logScreenS1DefOne() {
|
internal func logScreenS1DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s1 def one",
|
name: "s1 def one",
|
||||||
path: "s1_def_one/"
|
path: "s1_def_one/",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
func logEventS1DefTwo() {
|
internal func logEventS1DefTwo() {
|
||||||
logEvent(
|
logEvent(
|
||||||
name: "s1 def two",
|
name: "s1 def two",
|
||||||
action: "test",
|
action: "test",
|
||||||
category: "test",
|
category: "test",
|
||||||
params: [:]
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - section_two
|
// MARK: - section_two
|
||||||
|
|
||||||
func logScreenS2DefOne() {
|
internal func logScreenS2DefOne() {
|
||||||
logScreen(
|
logScreen(
|
||||||
name: "s2 def one",
|
name: "s2 def one",
|
||||||
path: "s2_def_one/"
|
path: "s2_def_one/",
|
||||||
|
params: nil
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -21,10 +21,13 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ColorExtensionGenerator.getExtensionContent(colors: colors,
|
let extensionContent = ColorExtensionGenerator.getExtensionContent(
|
||||||
|
colors: colors,
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenColors",
|
extensionName: "GenColors",
|
||||||
isSwiftUI: false)
|
isSwiftUI: false,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -35,12 +38,12 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
extension GenColors {
|
extension GenColors {
|
||||||
|
|
||||||
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
||||||
@objc var colorOne: UIColor {
|
@objc public var colorOne: UIColor {
|
||||||
UIColor(named: "colorOne")!
|
UIColor(named: "colorOne")!
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
||||||
@objc var colorTwo: UIColor {
|
@objc public var colorTwo: UIColor {
|
||||||
UIColor(named: "colorTwo")!
|
UIColor(named: "colorTwo")!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,10 +60,13 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ColorExtensionGenerator.getExtensionContent(colors: colors,
|
let extensionContent = ColorExtensionGenerator.getExtensionContent(
|
||||||
|
colors: colors,
|
||||||
staticVar: true,
|
staticVar: true,
|
||||||
extensionName: "GenColor",
|
extensionName: "GenColor",
|
||||||
isSwiftUI: false)
|
isSwiftUI: false,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -71,12 +77,12 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
extension GenColor {
|
extension GenColor {
|
||||||
|
|
||||||
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
||||||
static var colorOne: UIColor {
|
public static var colorOne: UIColor {
|
||||||
UIColor(named: "colorOne")!
|
UIColor(named: "colorOne")!
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
||||||
static var colorTwo: UIColor {
|
public static var colorTwo: UIColor {
|
||||||
UIColor(named: "colorTwo")!
|
UIColor(named: "colorTwo")!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,10 +99,13 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ColorExtensionGenerator.getExtensionContent(colors: colors,
|
let extensionContent = ColorExtensionGenerator.getExtensionContent(
|
||||||
|
colors: colors,
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenColors",
|
extensionName: "GenColors",
|
||||||
isSwiftUI: true)
|
isSwiftUI: true,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -107,12 +116,12 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
extension GenColors {
|
extension GenColors {
|
||||||
|
|
||||||
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
||||||
var colorOne: Color {
|
package var colorOne: Color {
|
||||||
Color("colorOne")
|
Color("colorOne")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
||||||
var colorTwo: Color {
|
package var colorTwo: Color {
|
||||||
Color("colorTwo")
|
Color("colorTwo")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,10 +138,13 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ColorExtensionGenerator.getExtensionContent(colors: colors,
|
let extensionContent = ColorExtensionGenerator.getExtensionContent(
|
||||||
|
colors: colors,
|
||||||
staticVar: true,
|
staticVar: true,
|
||||||
extensionName: "GenColor",
|
extensionName: "GenColor",
|
||||||
isSwiftUI: true)
|
isSwiftUI: true,
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -143,12 +155,12 @@ final class ColorExtensionGeneratorTests: XCTestCase {
|
|||||||
extension GenColor {
|
extension GenColor {
|
||||||
|
|
||||||
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
/// Color colorOne is #FF00FF (light) or #00FF00 (dark)"
|
||||||
static var colorOne: Color {
|
internal static var colorOne: Color {
|
||||||
Color("colorOne")
|
Color("colorOne")
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
/// Color colorTwo is #F0F0F0 (light) or #0F0F0F (dark)"
|
||||||
static var colorTwo: Color {
|
internal static var colorTwo: Color {
|
||||||
Color("colorTwo")
|
Color("colorTwo")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,12 +17,16 @@ final class ParsedColorTests: XCTestCase {
|
|||||||
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = color.getColorProperty(isStatic: false, isSwiftUI: false)
|
let property = color.getColorProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
||||||
@objc var red: UIColor {
|
@objc public var red: UIColor {
|
||||||
UIColor(named: "red")!
|
UIColor(named: "red")!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -35,12 +39,16 @@ final class ParsedColorTests: XCTestCase {
|
|||||||
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = color.getColorProperty(isStatic: true, isSwiftUI: false)
|
let property = color.getColorProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .private
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
||||||
static var red: UIColor {
|
private static var red: UIColor {
|
||||||
UIColor(named: "red")!
|
UIColor(named: "red")!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -53,12 +61,16 @@ final class ParsedColorTests: XCTestCase {
|
|||||||
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = color.getColorProperty(isStatic: false, isSwiftUI: true)
|
let property = color.getColorProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
||||||
var red: Color {
|
package var red: Color {
|
||||||
Color("red")
|
Color("red")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -71,12 +83,16 @@ final class ParsedColorTests: XCTestCase {
|
|||||||
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
let color = ParsedColor(name: "red", light: "#FF0000", dark: "#0000FF")
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = color.getColorProperty(isStatic: true, isSwiftUI: true)
|
let property = color.getColorProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
/// Color red is #FF0000 (light) or #0000FF (dark)"
|
||||||
static var red: Color {
|
internal static var red: Color {
|
||||||
Color("red")
|
Color("red")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -21,10 +21,13 @@ final class FontExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = FontExtensionGenerator.getExtensionContent(fontsNames: fontNames,
|
let extensionContent = FontExtensionGenerator.getExtensionContent(
|
||||||
|
fontsNames: fontNames,
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenFonts",
|
extensionName: "GenFonts",
|
||||||
isSwiftUI: false)
|
isSwiftUI: false,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -34,18 +37,18 @@ final class FontExtensionGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
extension GenFonts {
|
extension GenFonts {
|
||||||
|
|
||||||
enum FontName: String {
|
public enum FontName: String {
|
||||||
case CircularStdRegular = "CircularStd-Regular"
|
case CircularStdRegular = "CircularStd-Regular"
|
||||||
case CircularStdBold = "CircularStd-Bold"
|
case CircularStdBold = "CircularStd-Bold"
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Getter
|
// MARK: - Getter
|
||||||
|
|
||||||
func CircularStdRegular(withSize size: CGFloat) -> UIFont {
|
public func CircularStdRegular(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.CircularStdRegular.rawValue, size: size)!
|
UIFont(name: FontName.CircularStdRegular.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
func CircularStdBold(withSize size: CGFloat) -> UIFont {
|
public func CircularStdBold(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.CircularStdBold.rawValue, size: size)!
|
UIFont(name: FontName.CircularStdBold.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,10 +67,13 @@ final class FontExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = FontExtensionGenerator.getExtensionContent(fontsNames: fontNames,
|
let extensionContent = FontExtensionGenerator.getExtensionContent(
|
||||||
|
fontsNames: fontNames,
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenFonts",
|
extensionName: "GenFonts",
|
||||||
isSwiftUI: true)
|
isSwiftUI: true,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -77,18 +83,18 @@ final class FontExtensionGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
extension GenFonts {
|
extension GenFonts {
|
||||||
|
|
||||||
enum FontName: String {
|
package enum FontName: String {
|
||||||
case CircularStdRegular = "CircularStd-Regular"
|
case CircularStdRegular = "CircularStd-Regular"
|
||||||
case CircularStdBold = "CircularStd-Bold"
|
case CircularStdBold = "CircularStd-Bold"
|
||||||
}
|
}
|
||||||
|
|
||||||
// MARK: - Getter
|
// MARK: - Getter
|
||||||
|
|
||||||
func CircularStdRegular(withSize size: CGFloat) -> Font {
|
package func CircularStdRegular(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.CircularStdRegular.rawValue, size: size)
|
Font.custom(FontName.CircularStdRegular.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
func CircularStdBold(withSize size: CGFloat) -> Font {
|
package func CircularStdBold(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.CircularStdBold.rawValue, size: size)
|
Font.custom(FontName.CircularStdBold.rawValue, size: size)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,11 +21,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: true, isSwiftUI: false)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
static let CircularStdBold: ((_ size: CGFloat) -> UIFont) = { size in
|
internal static let CircularStdBold: ((_ size: CGFloat) -> UIFont) = { size in
|
||||||
UIFont(name: FontName.CircularStdBold.rawValue, size: size)!
|
UIFont(name: FontName.CircularStdBold.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -42,11 +46,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: true, isSwiftUI: false)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
static let CircularStdBoldUnderline: ((_ size: CGFloat) -> UIFont) = { size in
|
package static let CircularStdBoldUnderline: ((_ size: CGFloat) -> UIFont) = { size in
|
||||||
UIFont(name: FontName.CircularStdBoldUnderline.rawValue, size: size)!
|
UIFont(name: FontName.CircularStdBoldUnderline.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -63,11 +71,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: false, isSwiftUI: false)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .private
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
func CircularStdBold(withSize size: CGFloat) -> UIFont {
|
private func CircularStdBold(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.CircularStdBold.rawValue, size: size)!
|
UIFont(name: FontName.CircularStdBold.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -84,11 +96,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: false, isSwiftUI: false)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
func CircularStdBoldUnderline(withSize size: CGFloat) -> UIFont {
|
public func CircularStdBoldUnderline(withSize size: CGFloat) -> UIFont {
|
||||||
UIFont(name: FontName.CircularStdBoldUnderline.rawValue, size: size)!
|
UIFont(name: FontName.CircularStdBoldUnderline.rawValue, size: size)!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -105,11 +121,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: true, isSwiftUI: true)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
static let CircularStdBold: ((_ size: CGFloat) -> Font) = { size in
|
public static let CircularStdBold: ((_ size: CGFloat) -> Font) = { size in
|
||||||
Font.custom(FontName.CircularStdBold.rawValue, size: size)
|
Font.custom(FontName.CircularStdBold.rawValue, size: size)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -126,11 +146,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: true, isSwiftUI: true)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
static let CircularStdBoldUnderline: ((_ size: CGFloat) -> Font) = { size in
|
package static let CircularStdBoldUnderline: ((_ size: CGFloat) -> Font) = { size in
|
||||||
Font.custom(FontName.CircularStdBoldUnderline.rawValue, size: size)
|
Font.custom(FontName.CircularStdBoldUnderline.rawValue, size: size)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -147,11 +171,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: false, isSwiftUI: true)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
func CircularStdBold(withSize size: CGFloat) -> Font {
|
package func CircularStdBold(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.CircularStdBold.rawValue, size: size)
|
Font.custom(FontName.CircularStdBold.rawValue, size: size)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -168,11 +196,15 @@ final class FontNameTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = fontName.getProperty(isStatic: false, isSwiftUI: true)
|
let property = fontName.getProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
func CircularStdBoldUnderline(withSize size: CGFloat) -> Font {
|
internal func CircularStdBoldUnderline(withSize size: CGFloat) -> Font {
|
||||||
Font.custom(FontName.CircularStdBoldUnderline.rawValue, size: size)
|
Font.custom(FontName.CircularStdBoldUnderline.rawValue, size: size)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -0,0 +1,76 @@
|
|||||||
|
//
|
||||||
|
// AnalyticsConfigurationTests.swift
|
||||||
|
// ResgenSwift
|
||||||
|
//
|
||||||
|
// Created by Thibaut Schmitt on 18/07/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
@testable import ResgenSwift
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
final class AnalyticsConfigurationTests: XCTestCase {
|
||||||
|
|
||||||
|
let projectDirectory = "projectDirectory/"
|
||||||
|
|
||||||
|
func test_argsGeneration_requiredArgs() {
|
||||||
|
// Given
|
||||||
|
let testingConfiguration = AnalyticsConfiguration(
|
||||||
|
inputFile: "path/to/tags.yml",
|
||||||
|
target: "matomo firebase",
|
||||||
|
outputFile: "Analytics/Generated/AnalyticsManager.swift",
|
||||||
|
visibility: nil,
|
||||||
|
staticMembers: nil
|
||||||
|
)
|
||||||
|
|
||||||
|
// When
|
||||||
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: false
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expect
|
||||||
|
let expectedArguments = [
|
||||||
|
"projectDirectory/path/to/tags.yml",
|
||||||
|
"--target",
|
||||||
|
"matomo firebase",
|
||||||
|
"--output-file",
|
||||||
|
"projectDirectory/Analytics/Generated/AnalyticsManager.swift",
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_argsGeneration_allArguments() {
|
||||||
|
// Given
|
||||||
|
let testingConfiguration = AnalyticsConfiguration(
|
||||||
|
inputFile: "path/to/tags.yml",
|
||||||
|
target: "matomo firebase",
|
||||||
|
outputFile: "Analytics/Generated/AnalyticsManager.swift",
|
||||||
|
visibility: "public",
|
||||||
|
staticMembers: false
|
||||||
|
)
|
||||||
|
|
||||||
|
// When
|
||||||
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: true
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expect
|
||||||
|
let expectedArguments = [
|
||||||
|
"-f",
|
||||||
|
"projectDirectory/path/to/tags.yml",
|
||||||
|
"--target",
|
||||||
|
"matomo firebase",
|
||||||
|
"--output-file",
|
||||||
|
"projectDirectory/Analytics/Generated/AnalyticsManager.swift",
|
||||||
|
"--visibility",
|
||||||
|
"public",
|
||||||
|
"--static-members",
|
||||||
|
"false"
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
}
|
||||||
|
}
|
@ -16,16 +16,22 @@ final class ColorsConfigurationTests: XCTestCase {
|
|||||||
|
|
||||||
func test_argsGeneration_requiredArgs() {
|
func test_argsGeneration_requiredArgs() {
|
||||||
// Given
|
// Given
|
||||||
let testingConfiguration = ColorsConfiguration(inputFile: "path/to/colors.txt",
|
let testingConfiguration = ColorsConfiguration(
|
||||||
|
inputFile: "path/to/colors.txt",
|
||||||
style: ColorStyle.all.rawValue,
|
style: ColorStyle.all.rawValue,
|
||||||
xcassetsPath: "path/to/assets.xcassets",
|
xcassetsPath: "path/to/assets.xcassets",
|
||||||
extensionOutputPath: "Colors/Generated",
|
extensionOutputPath: nil,
|
||||||
extensionName: nil,
|
extensionName: nil,
|
||||||
extensionNameUIKit: nil,
|
extensionNameUIKit: nil,
|
||||||
extensionSuffix: nil,
|
extensionSuffix: nil,
|
||||||
staticMembers: false)
|
visibility: nil,
|
||||||
|
staticMembers: false
|
||||||
|
)
|
||||||
// When
|
// When
|
||||||
let arguments = testingConfiguration.getArguments(projectDirectory: projectDirectory, force: false)
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: false
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectedArguments = [
|
let expectedArguments = [
|
||||||
@ -34,8 +40,6 @@ final class ColorsConfigurationTests: XCTestCase {
|
|||||||
"all",
|
"all",
|
||||||
"--xcassets-path",
|
"--xcassets-path",
|
||||||
"projectDirectory/path/to/assets.xcassets",
|
"projectDirectory/path/to/assets.xcassets",
|
||||||
"--extension-output-path",
|
|
||||||
"projectDirectory/Colors/Generated",
|
|
||||||
"--static-members",
|
"--static-members",
|
||||||
"false"
|
"false"
|
||||||
]
|
]
|
||||||
@ -45,16 +49,22 @@ final class ColorsConfigurationTests: XCTestCase {
|
|||||||
|
|
||||||
func test_argsGeneration_allArguments() {
|
func test_argsGeneration_allArguments() {
|
||||||
// Given
|
// Given
|
||||||
let testingConfiguration = ColorsConfiguration(inputFile: "path/to/colors.txt",
|
let testingConfiguration = ColorsConfiguration(
|
||||||
|
inputFile: "path/to/colors.txt",
|
||||||
style: ColorStyle.all.rawValue,
|
style: ColorStyle.all.rawValue,
|
||||||
xcassetsPath: "path/to/assets.xcassets",
|
xcassetsPath: "path/to/assets.xcassets",
|
||||||
extensionOutputPath: "Colors/Generated",
|
extensionOutputPath: "Colors/Generated",
|
||||||
extensionName: "AppUIColor",
|
extensionName: "AppUIColor",
|
||||||
extensionNameUIKit: "AppColor",
|
extensionNameUIKit: "AppColor",
|
||||||
extensionSuffix: "Testing",
|
extensionSuffix: "Testing",
|
||||||
staticMembers: false)
|
visibility: "public",
|
||||||
|
staticMembers: false
|
||||||
|
)
|
||||||
// When
|
// When
|
||||||
let arguments = testingConfiguration.getArguments(projectDirectory: projectDirectory, force: true)
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: true
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectedArguments = [
|
let expectedArguments = [
|
||||||
@ -66,14 +76,16 @@ final class ColorsConfigurationTests: XCTestCase {
|
|||||||
"projectDirectory/path/to/assets.xcassets",
|
"projectDirectory/path/to/assets.xcassets",
|
||||||
"--extension-output-path",
|
"--extension-output-path",
|
||||||
"projectDirectory/Colors/Generated",
|
"projectDirectory/Colors/Generated",
|
||||||
"--static-members",
|
|
||||||
"false",
|
|
||||||
"--extension-name",
|
"--extension-name",
|
||||||
"AppUIColor",
|
"AppUIColor",
|
||||||
"--extension-name-ui-kit",
|
"--extension-name-ui-kit",
|
||||||
"AppColor",
|
"AppColor",
|
||||||
"--extension-suffix",
|
"--extension-suffix",
|
||||||
"Testing",
|
"Testing",
|
||||||
|
"--visibility",
|
||||||
|
"public",
|
||||||
|
"--static-members",
|
||||||
|
"false"
|
||||||
]
|
]
|
||||||
|
|
||||||
XCTAssertEqual(arguments, expectedArguments)
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
@ -16,23 +16,25 @@ final class FontsConfigurationTests: XCTestCase {
|
|||||||
|
|
||||||
func test_argsGeneration_requiredArgs() {
|
func test_argsGeneration_requiredArgs() {
|
||||||
// Given
|
// Given
|
||||||
let testingConfiguration = FontsConfiguration(inputFile: "path/to/fonts.txt",
|
let testingConfiguration = FontsConfiguration(
|
||||||
extensionOutputPath: "Fonts/Generated",
|
inputFile: "path/to/fonts.txt",
|
||||||
|
extensionOutputPath: nil,
|
||||||
extensionName: nil,
|
extensionName: nil,
|
||||||
extensionNameUIKit: nil,
|
extensionNameUIKit: nil,
|
||||||
extensionSuffix: nil,
|
extensionSuffix: nil,
|
||||||
infoPlistPaths: nil,
|
infoPlistPaths: nil,
|
||||||
staticMembers: nil)
|
visibility: nil,
|
||||||
|
staticMembers: nil
|
||||||
|
)
|
||||||
// When
|
// When
|
||||||
let arguments = testingConfiguration.getArguments(projectDirectory: projectDirectory, force: false)
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: false
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectedArguments = [
|
let expectedArguments = [
|
||||||
"projectDirectory/path/to/fonts.txt",
|
"projectDirectory/path/to/fonts.txt"
|
||||||
"--extension-output-path",
|
|
||||||
"projectDirectory/Fonts/Generated",
|
|
||||||
"--static-members",
|
|
||||||
"false"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
XCTAssertEqual(arguments, expectedArguments)
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
@ -40,15 +42,21 @@ final class FontsConfigurationTests: XCTestCase {
|
|||||||
|
|
||||||
func test_argsGeneration_allArguments() {
|
func test_argsGeneration_allArguments() {
|
||||||
// Given
|
// Given
|
||||||
let testingConfiguration = FontsConfiguration(inputFile: "path/to/fonts.txt",
|
let testingConfiguration = FontsConfiguration(
|
||||||
|
inputFile: "path/to/fonts.txt",
|
||||||
extensionOutputPath: "Fonts/Generated",
|
extensionOutputPath: "Fonts/Generated",
|
||||||
extensionName: "AppUIFont",
|
extensionName: "AppUIFont",
|
||||||
extensionNameUIKit: "AppFont",
|
extensionNameUIKit: "AppFont",
|
||||||
extensionSuffix: "Testing",
|
extensionSuffix: "Testing",
|
||||||
infoPlistPaths: "path/to/plist1.plist path/to/plist2.plist",
|
infoPlistPaths: "path/to/plist1.plist path/to/plist2.plist",
|
||||||
staticMembers: true)
|
visibility: "package",
|
||||||
|
staticMembers: true
|
||||||
|
)
|
||||||
// When
|
// When
|
||||||
let arguments = testingConfiguration.getArguments(projectDirectory: projectDirectory, force: true)
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: true
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectedArguments = [
|
let expectedArguments = [
|
||||||
@ -56,14 +64,16 @@ final class FontsConfigurationTests: XCTestCase {
|
|||||||
"projectDirectory/path/to/fonts.txt",
|
"projectDirectory/path/to/fonts.txt",
|
||||||
"--extension-output-path",
|
"--extension-output-path",
|
||||||
"projectDirectory/Fonts/Generated",
|
"projectDirectory/Fonts/Generated",
|
||||||
"--static-members",
|
|
||||||
"true",
|
|
||||||
"--extension-name",
|
"--extension-name",
|
||||||
"AppUIFont",
|
"AppUIFont",
|
||||||
"--extension-name-ui-kit",
|
"--extension-name-ui-kit",
|
||||||
"AppFont",
|
"AppFont",
|
||||||
"--extension-suffix",
|
"--extension-suffix",
|
||||||
"Testing",
|
"Testing",
|
||||||
|
"--visibility",
|
||||||
|
"package",
|
||||||
|
"--static-members",
|
||||||
|
"true",
|
||||||
"--info-plist-paths",
|
"--info-plist-paths",
|
||||||
"projectDirectory/path/to/plist1.plist projectDirectory/path/to/plist2.plist"
|
"projectDirectory/path/to/plist1.plist projectDirectory/path/to/plist2.plist"
|
||||||
]
|
]
|
||||||
|
@ -16,26 +16,28 @@ final class ImagesConfigurationTests: XCTestCase {
|
|||||||
|
|
||||||
func test_argsGeneration_requiredArgs() {
|
func test_argsGeneration_requiredArgs() {
|
||||||
// Given
|
// Given
|
||||||
let testingConfiguration = ImagesConfiguration(inputFile: "path/to/images.txt",
|
let testingConfiguration = ImagesConfiguration(
|
||||||
|
inputFile: "path/to/images.txt",
|
||||||
xcassetsPath: "path/to/assets.xcassets",
|
xcassetsPath: "path/to/assets.xcassets",
|
||||||
extensionOutputPath: "Images/Generated",
|
extensionOutputPath: nil,
|
||||||
extensionName: nil,
|
extensionName: nil,
|
||||||
extensionNameUIKit: nil,
|
extensionNameUIKit: nil,
|
||||||
extensionSuffix: nil,
|
extensionSuffix: nil,
|
||||||
staticMembers: nil)
|
visibility: nil,
|
||||||
|
staticMembers: nil
|
||||||
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let arguments = testingConfiguration.getArguments(projectDirectory: projectDirectory, force: false)
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: false
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectedArguments = [
|
let expectedArguments = [
|
||||||
"projectDirectory/path/to/images.txt",
|
"projectDirectory/path/to/images.txt",
|
||||||
"--xcassets-path",
|
"--xcassets-path",
|
||||||
"projectDirectory/path/to/assets.xcassets",
|
"projectDirectory/path/to/assets.xcassets"
|
||||||
"--extension-output-path",
|
|
||||||
"projectDirectory/Images/Generated",
|
|
||||||
"--static-members",
|
|
||||||
"false"
|
|
||||||
]
|
]
|
||||||
|
|
||||||
XCTAssertEqual(arguments, expectedArguments)
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
@ -43,16 +45,22 @@ final class ImagesConfigurationTests: XCTestCase {
|
|||||||
|
|
||||||
func test_argsGeneration_allArguments() {
|
func test_argsGeneration_allArguments() {
|
||||||
// Given
|
// Given
|
||||||
let testingConfiguration = ImagesConfiguration(inputFile: "path/to/images.txt",
|
let testingConfiguration = ImagesConfiguration(
|
||||||
|
inputFile: "path/to/images.txt",
|
||||||
xcassetsPath: "path/to/assets.xcassets",
|
xcassetsPath: "path/to/assets.xcassets",
|
||||||
extensionOutputPath: "Images/Generated",
|
extensionOutputPath: "Images/Generated",
|
||||||
extensionName: "AppUIImage",
|
extensionName: "AppUIImage",
|
||||||
extensionNameUIKit: "AppImage",
|
extensionNameUIKit: "AppImage",
|
||||||
extensionSuffix: "Testing",
|
extensionSuffix: "Testing",
|
||||||
staticMembers: true)
|
visibility: "private",
|
||||||
|
staticMembers: true
|
||||||
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let arguments = testingConfiguration.getArguments(projectDirectory: projectDirectory, force: true)
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: true
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectedArguments = [
|
let expectedArguments = [
|
||||||
@ -62,14 +70,16 @@ final class ImagesConfigurationTests: XCTestCase {
|
|||||||
"projectDirectory/path/to/assets.xcassets",
|
"projectDirectory/path/to/assets.xcassets",
|
||||||
"--extension-output-path",
|
"--extension-output-path",
|
||||||
"projectDirectory/Images/Generated",
|
"projectDirectory/Images/Generated",
|
||||||
"--static-members",
|
|
||||||
"true",
|
|
||||||
"--extension-name",
|
"--extension-name",
|
||||||
"AppUIImage",
|
"AppUIImage",
|
||||||
"--extension-name-ui-kit",
|
"--extension-name-ui-kit",
|
||||||
"AppImage",
|
"AppImage",
|
||||||
"--extension-suffix",
|
"--extension-suffix",
|
||||||
"Testing",
|
"Testing",
|
||||||
|
"--visibility",
|
||||||
|
"private",
|
||||||
|
"--static-members",
|
||||||
|
"true"
|
||||||
]
|
]
|
||||||
|
|
||||||
XCTAssertEqual(arguments, expectedArguments)
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
@ -0,0 +1,98 @@
|
|||||||
|
//
|
||||||
|
// StringsConfigurationTests.swift
|
||||||
|
// ResgenSwift
|
||||||
|
//
|
||||||
|
// Created by Thibaut Schmitt on 18/07/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
@testable import ResgenSwift
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
final class StringsConfigurationTests: XCTestCase {
|
||||||
|
|
||||||
|
let projectDirectory = "projectDirectory/"
|
||||||
|
|
||||||
|
func test_argsGeneration_requiredArgs() {
|
||||||
|
// Given
|
||||||
|
let testingConfiguration = StringsConfiguration(
|
||||||
|
inputFile: "path/to/strings.txt",
|
||||||
|
outputPath: "Strings/Generated",
|
||||||
|
langs: "fr en en-us",
|
||||||
|
defaultLang: "en",
|
||||||
|
extensionOutputPath: nil, // Strings/Generated
|
||||||
|
extensionName: nil, // String
|
||||||
|
extensionSuffix: nil, // Testing
|
||||||
|
visibility: nil, // "internal"
|
||||||
|
staticMembers: nil, // true
|
||||||
|
xcStrings: nil // true
|
||||||
|
)
|
||||||
|
|
||||||
|
// When
|
||||||
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: false
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expect
|
||||||
|
let expectedArguments = [
|
||||||
|
"projectDirectory/path/to/strings.txt",
|
||||||
|
"--output-path",
|
||||||
|
"projectDirectory/Strings/Generated",
|
||||||
|
"--langs",
|
||||||
|
"fr en en-us",
|
||||||
|
"--default-lang",
|
||||||
|
"en"
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_argsGeneration_allArguments() {
|
||||||
|
// Given
|
||||||
|
let testingConfiguration = StringsConfiguration(
|
||||||
|
inputFile: "path/to/strings.txt",
|
||||||
|
outputPath: "Strings/Generated",
|
||||||
|
langs: "fr en en-us",
|
||||||
|
defaultLang: "en",
|
||||||
|
extensionOutputPath: "Strings/Generated",
|
||||||
|
extensionName: "AppString",
|
||||||
|
extensionSuffix: "Testing",
|
||||||
|
visibility: "internal",
|
||||||
|
staticMembers: true,
|
||||||
|
xcStrings: true
|
||||||
|
)
|
||||||
|
|
||||||
|
// When
|
||||||
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: true
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expect
|
||||||
|
let expectedArguments = [
|
||||||
|
"-f",
|
||||||
|
"projectDirectory/path/to/strings.txt",
|
||||||
|
"--output-path",
|
||||||
|
"projectDirectory/Strings/Generated",
|
||||||
|
"--langs",
|
||||||
|
"fr en en-us",
|
||||||
|
"--default-lang",
|
||||||
|
"en",
|
||||||
|
"--extension-output-path",
|
||||||
|
"projectDirectory/Strings/Generated",
|
||||||
|
"--extension-name",
|
||||||
|
"AppString",
|
||||||
|
"--extension-suffix",
|
||||||
|
"Testing",
|
||||||
|
"--visibility",
|
||||||
|
"internal",
|
||||||
|
"--xc-strings",
|
||||||
|
"true",
|
||||||
|
"--static-members",
|
||||||
|
"true"
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
}
|
||||||
|
}
|
84
Tests/ResgenSwiftTests/Generate/TagsConfigurationTests.swift
Normal file
84
Tests/ResgenSwiftTests/Generate/TagsConfigurationTests.swift
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
//
|
||||||
|
// TagsConfigurationTests.swift
|
||||||
|
// ResgenSwift
|
||||||
|
//
|
||||||
|
// Created by Thibaut Schmitt on 18/07/2025.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
@testable import ResgenSwift
|
||||||
|
import XCTest
|
||||||
|
|
||||||
|
final class TagsConfigurationTests: XCTestCase {
|
||||||
|
|
||||||
|
let projectDirectory = "projectDirectory/"
|
||||||
|
|
||||||
|
func test_argsGeneration_requiredArgs() {
|
||||||
|
// Given
|
||||||
|
let testingConfiguration = TagsConfiguration(
|
||||||
|
inputFile: "path/to/tags.txt",
|
||||||
|
lang: "ium",
|
||||||
|
extensionOutputPath: "Tags/Generated",
|
||||||
|
extensionName: nil,
|
||||||
|
extensionSuffix: nil,
|
||||||
|
visibility: nil,
|
||||||
|
staticMembers: nil
|
||||||
|
)
|
||||||
|
|
||||||
|
// When
|
||||||
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: false
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expect
|
||||||
|
let expectedArguments = [
|
||||||
|
"projectDirectory/path/to/tags.txt",
|
||||||
|
"--lang",
|
||||||
|
"ium",
|
||||||
|
"--extension-output-path",
|
||||||
|
"projectDirectory/Tags/Generated"
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
}
|
||||||
|
|
||||||
|
func test_argsGeneration_allArguments() {
|
||||||
|
// Given
|
||||||
|
let testingConfiguration = TagsConfiguration(
|
||||||
|
inputFile: "path/to/tags.txt",
|
||||||
|
lang: "ium",
|
||||||
|
extensionOutputPath: "Tags/Generated",
|
||||||
|
extensionName: "AppTag",
|
||||||
|
extensionSuffix: "Testing",
|
||||||
|
visibility: "private",
|
||||||
|
staticMembers: true
|
||||||
|
)
|
||||||
|
|
||||||
|
// When
|
||||||
|
let arguments = testingConfiguration.getArguments(
|
||||||
|
projectDirectory: projectDirectory,
|
||||||
|
force: true
|
||||||
|
)
|
||||||
|
|
||||||
|
// Expect
|
||||||
|
let expectedArguments = [
|
||||||
|
"-f",
|
||||||
|
"projectDirectory/path/to/tags.txt",
|
||||||
|
"--lang",
|
||||||
|
"ium",
|
||||||
|
"--extension-output-path",
|
||||||
|
"projectDirectory/Tags/Generated",
|
||||||
|
"--extension-name",
|
||||||
|
"AppTag",
|
||||||
|
"--extension-suffix",
|
||||||
|
"Testing",
|
||||||
|
"--visibility",
|
||||||
|
"private",
|
||||||
|
"--static-members",
|
||||||
|
"true"
|
||||||
|
]
|
||||||
|
|
||||||
|
XCTAssertEqual(arguments, expectedArguments)
|
||||||
|
}
|
||||||
|
}
|
@ -21,11 +21,14 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ImageExtensionGenerator.getExtensionContent(images: images,
|
let extensionContent = ImageExtensionGenerator.getExtensionContent(
|
||||||
|
images: images,
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenImages",
|
extensionName: "GenImages",
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
isSwiftUI: false)
|
isSwiftUI: false,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -36,11 +39,11 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
extension GenImages {
|
extension GenImages {
|
||||||
|
|
||||||
var image_one: UIImage {
|
public var image_one: UIImage {
|
||||||
UIImage(named: "image_one")!
|
UIImage(named: "image_one")!
|
||||||
}
|
}
|
||||||
|
|
||||||
var image_two: UIImage {
|
public var image_two: UIImage {
|
||||||
UIImage(named: "image_two")!
|
UIImage(named: "image_two")!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -57,11 +60,14 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ImageExtensionGenerator.getExtensionContent(images: images,
|
let extensionContent = ImageExtensionGenerator.getExtensionContent(
|
||||||
|
images: images,
|
||||||
staticVar: true,
|
staticVar: true,
|
||||||
extensionName: "GenImages",
|
extensionName: "GenImages",
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
isSwiftUI: false)
|
isSwiftUI: false,
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -72,11 +78,11 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
extension GenImages {
|
extension GenImages {
|
||||||
|
|
||||||
static var image_one: UIImage {
|
internal static var image_one: UIImage {
|
||||||
UIImage(named: "image_one")!
|
UIImage(named: "image_one")!
|
||||||
}
|
}
|
||||||
|
|
||||||
static var image_two: UIImage {
|
internal static var image_two: UIImage {
|
||||||
UIImage(named: "image_two")!
|
UIImage(named: "image_two")!
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -93,11 +99,14 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ImageExtensionGenerator.getExtensionContent(images: images,
|
let extensionContent = ImageExtensionGenerator.getExtensionContent(
|
||||||
|
images: images,
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenImages",
|
extensionName: "GenImages",
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
isSwiftUI: true)
|
isSwiftUI: true,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -108,11 +117,11 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
extension GenImages {
|
extension GenImages {
|
||||||
|
|
||||||
var image_one: Image {
|
public var image_one: Image {
|
||||||
Image("image_one")
|
Image("image_one")
|
||||||
}
|
}
|
||||||
|
|
||||||
var image_two: Image {
|
public var image_two: Image {
|
||||||
Image("image_two")
|
Image("image_two")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -129,11 +138,14 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = ImageExtensionGenerator.getExtensionContent(images: images,
|
let extensionContent = ImageExtensionGenerator.getExtensionContent(
|
||||||
|
images: images,
|
||||||
staticVar: true,
|
staticVar: true,
|
||||||
extensionName: "GenImages",
|
extensionName: "GenImages",
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
isSwiftUI: true)
|
isSwiftUI: true,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
@ -144,11 +156,11 @@ final class ImageExtensionGeneratorTests: XCTestCase {
|
|||||||
|
|
||||||
extension GenImages {
|
extension GenImages {
|
||||||
|
|
||||||
static var image_one: Image {
|
package static var image_one: Image {
|
||||||
Image("image_one")
|
Image("image_one")
|
||||||
}
|
}
|
||||||
|
|
||||||
static var image_two: Image {
|
package static var image_two: Image {
|
||||||
Image("image_two")
|
Image("image_two")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -37,17 +37,23 @@ final class ParsedImageTests: XCTestCase {
|
|||||||
func test_uiKit_GeneratedProperty() {
|
func test_uiKit_GeneratedProperty() {
|
||||||
// Given
|
// Given
|
||||||
let imageName = "the_name"
|
let imageName = "the_name"
|
||||||
let parsedImage = ParsedImage(name: imageName,
|
let parsedImage = ParsedImage(
|
||||||
|
name: imageName,
|
||||||
tags: "id",
|
tags: "id",
|
||||||
width: 10,
|
width: 10,
|
||||||
height: 10)
|
height: 10
|
||||||
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = parsedImage.getImageProperty(isStatic: false, isSwiftUI: false)
|
let property = parsedImage.getImageProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
var \(imageName): UIImage {
|
public var \(imageName): UIImage {
|
||||||
UIImage(named: "\(imageName)")!
|
UIImage(named: "\(imageName)")!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -58,17 +64,23 @@ final class ParsedImageTests: XCTestCase {
|
|||||||
func test_uiKit_GeneratedStaticProperty() {
|
func test_uiKit_GeneratedStaticProperty() {
|
||||||
// Given
|
// Given
|
||||||
let imageName = "the_name"
|
let imageName = "the_name"
|
||||||
let parsedImage = ParsedImage(name: imageName,
|
let parsedImage = ParsedImage(
|
||||||
|
name: imageName,
|
||||||
tags: "id",
|
tags: "id",
|
||||||
width: 10,
|
width: 10,
|
||||||
height: 10)
|
height: 10
|
||||||
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = parsedImage.getImageProperty(isStatic: true, isSwiftUI: false)
|
let property = parsedImage.getImageProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: false,
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
static var \(imageName): UIImage {
|
internal static var \(imageName): UIImage {
|
||||||
UIImage(named: "\(imageName)")!
|
UIImage(named: "\(imageName)")!
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -79,17 +91,23 @@ final class ParsedImageTests: XCTestCase {
|
|||||||
func test_swiftUI_GeneratedProperty() {
|
func test_swiftUI_GeneratedProperty() {
|
||||||
// Given
|
// Given
|
||||||
let imageName = "the_name"
|
let imageName = "the_name"
|
||||||
let parsedImage = ParsedImage(name: imageName,
|
let parsedImage = ParsedImage(
|
||||||
|
name: imageName,
|
||||||
tags: "id",
|
tags: "id",
|
||||||
width: 10,
|
width: 10,
|
||||||
height: 10)
|
height: 10
|
||||||
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = parsedImage.getImageProperty(isStatic: false, isSwiftUI: true)
|
let property = parsedImage.getImageProperty(
|
||||||
|
isStatic: false,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .private
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
var \(imageName): Image {
|
private var \(imageName): Image {
|
||||||
Image("\(imageName)")
|
Image("\(imageName)")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -100,17 +118,23 @@ final class ParsedImageTests: XCTestCase {
|
|||||||
func test_swiftUI_GeneratedStaticProperty() {
|
func test_swiftUI_GeneratedStaticProperty() {
|
||||||
// Given
|
// Given
|
||||||
let imageName = "the_name"
|
let imageName = "the_name"
|
||||||
let parsedImage = ParsedImage(name: imageName,
|
let parsedImage = ParsedImage(
|
||||||
|
name: imageName,
|
||||||
tags: "id",
|
tags: "id",
|
||||||
width: 10,
|
width: 10,
|
||||||
height: 10)
|
height: 10
|
||||||
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = parsedImage.getImageProperty(isStatic: true, isSwiftUI: true)
|
let property = parsedImage.getImageProperty(
|
||||||
|
isStatic: true,
|
||||||
|
isSwiftUI: true,
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = """
|
let expect = """
|
||||||
static var \(imageName): Image {
|
package static var \(imageName): Image {
|
||||||
Image("\(imageName)")
|
Image("\(imageName)")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -121,10 +145,12 @@ final class ParsedImageTests: XCTestCase {
|
|||||||
func testAssetContentJson() {
|
func testAssetContentJson() {
|
||||||
// Given
|
// Given
|
||||||
let imageName = "the_name"
|
let imageName = "the_name"
|
||||||
let parsedImage = ParsedImage(name: imageName,
|
let parsedImage = ParsedImage(
|
||||||
|
name: imageName,
|
||||||
tags: "id",
|
tags: "id",
|
||||||
width: 10,
|
width: 10,
|
||||||
height: 10)
|
height: 10
|
||||||
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let property = parsedImage.generateImageContent(isVector: false)
|
let property = parsedImage.generateImageContent(isVector: false)
|
||||||
|
@ -8,9 +8,9 @@
|
|||||||
// CPD-OFF
|
// CPD-OFF
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
import XCTest
|
|
||||||
|
|
||||||
@testable import ResgenSwift
|
@testable import ResgenSwift
|
||||||
|
import ToolCore
|
||||||
|
import XCTest
|
||||||
|
|
||||||
final class DefinitionTests: XCTestCase {
|
final class DefinitionTests: XCTestCase {
|
||||||
|
|
||||||
@ -94,9 +94,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr", visibility: .public)
|
||||||
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en")
|
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en", visibility: .public)
|
||||||
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us")
|
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us", visibility: .public)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -105,7 +105,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -116,7 +116,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -127,7 +127,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -149,9 +149,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr", visibility: .private)
|
||||||
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en")
|
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en", visibility: .private)
|
||||||
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us")
|
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us", visibility: .private)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -160,7 +160,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
private var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -171,7 +171,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
private var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -182,7 +182,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
private var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -203,9 +203,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr", visibility: .public)
|
||||||
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en")
|
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en", visibility: .public)
|
||||||
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us")
|
let propertyEnUs = definition.getNSLocalizedStringProperty(forLang: "en-us", visibility: .public)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -214,7 +214,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -225,7 +225,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -236,7 +236,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -260,9 +260,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr", visibility: .public)
|
||||||
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en")
|
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en", visibility: .public)
|
||||||
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us")
|
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us", visibility: .public)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -271,7 +271,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
static var definition_name: String {
|
public static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -282,7 +282,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
static var definition_name: String {
|
public static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -293,7 +293,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
static var definition_name: String {
|
public static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -315,9 +315,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr", visibility: .internal)
|
||||||
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en")
|
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en", visibility: .internal)
|
||||||
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us")
|
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us", visibility: .internal)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -326,7 +326,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -337,7 +337,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -348,7 +348,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -369,9 +369,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringStaticProperty(forLang: "fr", visibility: .internal)
|
||||||
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en")
|
let propertyEn = definition.getNSLocalizedStringStaticProperty(forLang: "en", visibility: .internal)
|
||||||
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us")
|
let propertyEnUs = definition.getNSLocalizedStringStaticProperty(forLang: "en-us", visibility: .internal)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -380,7 +380,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "C'est la traduction francaise", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -391,7 +391,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -402,7 +402,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "This is the english us translation", comment: "")
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -422,7 +422,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr", visibility: .internal)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -431,7 +431,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
internal var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" !", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -440,7 +440,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
func definition_name(arg0: String) -> String {
|
internal func definition_name(arg0: String) -> String {
|
||||||
String(format: self.definition_name, arg0)
|
String(format: self.definition_name, arg0)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -458,7 +458,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr", visibility: .private)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -467,7 +467,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
private var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" ! Your age is %d :) Your weight is %f ;-)", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Welcome \"%@\" ! Your age is %d :) Your weight is %f ;-)", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -476,7 +476,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
func definition_name(arg0: String, arg1: Int, arg2: Double) -> String {
|
private func definition_name(arg0: String, arg1: Int, arg2: Double) -> String {
|
||||||
String(format: self.definition_name, arg0, arg1, arg2)
|
String(format: self.definition_name, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -495,8 +495,8 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr")
|
let propertyFr = definition.getNSLocalizedStringProperty(forLang: "fr", visibility: .public)
|
||||||
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en")
|
let propertyEn = definition.getNSLocalizedStringProperty(forLang: "en", visibility: .public)
|
||||||
|
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
/// Translation in fr :
|
/// Translation in fr :
|
||||||
@ -504,7 +504,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Vous %%: %1$@ %2$@ Age: %3$d", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "Vous %%: %1$@ %2$@ Age: %3$d", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -513,7 +513,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
public func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
||||||
String(format: self.definition_name, arg0, arg1, arg2)
|
String(format: self.definition_name, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -524,7 +524,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "This is a comment")
|
NSLocalizedString("definition_name", tableName: kStringsFileName, bundle: Bundle.main, value: "You %%: %2$@ %1$@ Age: %3$d", comment: "This is a comment")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -533,7 +533,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
public func definition_name(arg0: String, arg1: String, arg2: Int) -> String {
|
||||||
String(format: self.definition_name, arg0, arg1, arg2)
|
String(format: self.definition_name, arg0, arg1, arg2)
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -556,9 +556,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getProperty(forLang: "fr")
|
let propertyFr = definition.getProperty(forLang: "fr", visibility: .public)
|
||||||
let propertyEn = definition.getProperty(forLang: "en")
|
let propertyEn = definition.getProperty(forLang: "en", visibility: .public)
|
||||||
let propertyEnUs = definition.getProperty(forLang: "en-us")
|
let propertyEnUs = definition.getProperty(forLang: "en-us", visibility: .public)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -567,7 +567,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -578,7 +578,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -589,7 +589,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
var definition_name: String {
|
public var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -611,9 +611,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getProperty(forLang: "fr")
|
let propertyFr = definition.getProperty(forLang: "fr", visibility: .package)
|
||||||
let propertyEn = definition.getProperty(forLang: "en")
|
let propertyEn = definition.getProperty(forLang: "en", visibility: .package)
|
||||||
let propertyEnUs = definition.getProperty(forLang: "en-us")
|
let propertyEnUs = definition.getProperty(forLang: "en-us", visibility: .package)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -622,7 +622,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
package var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -633,7 +633,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
package var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -644,7 +644,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
package var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -665,9 +665,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getProperty(forLang: "fr")
|
let propertyFr = definition.getProperty(forLang: "fr", visibility: .private)
|
||||||
let propertyEn = definition.getProperty(forLang: "en")
|
let propertyEn = definition.getProperty(forLang: "en", visibility: .private)
|
||||||
let propertyEnUs = definition.getProperty(forLang: "en-us")
|
let propertyEnUs = definition.getProperty(forLang: "en-us", visibility: .private)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -676,7 +676,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
private var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -687,7 +687,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
private var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -698,7 +698,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var definition_name: String {
|
private var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -722,9 +722,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getStaticProperty(forLang: "fr")
|
let propertyFr = definition.getStaticProperty(forLang: "fr", visibility: .internal)
|
||||||
let propertyEn = definition.getStaticProperty(forLang: "en")
|
let propertyEn = definition.getStaticProperty(forLang: "en", visibility: .internal)
|
||||||
let propertyEnUs = definition.getStaticProperty(forLang: "en-us")
|
let propertyEnUs = definition.getStaticProperty(forLang: "en-us", visibility: .internal)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -733,7 +733,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -744,7 +744,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -755,7 +755,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// This is a comment
|
/// This is a comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -777,9 +777,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getStaticProperty(forLang: "fr")
|
let propertyFr = definition.getStaticProperty(forLang: "fr", visibility: .internal)
|
||||||
let propertyEn = definition.getStaticProperty(forLang: "en")
|
let propertyEn = definition.getStaticProperty(forLang: "en", visibility: .internal)
|
||||||
let propertyEnUs = definition.getStaticProperty(forLang: "en-us")
|
let propertyEnUs = definition.getStaticProperty(forLang: "en-us", visibility: .internal)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -788,7 +788,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -799,7 +799,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -810,7 +810,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -831,9 +831,9 @@ final class DefinitionTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let propertyFr = definition.getStaticProperty(forLang: "fr")
|
let propertyFr = definition.getStaticProperty(forLang: "fr", visibility: .internal)
|
||||||
let propertyEn = definition.getStaticProperty(forLang: "en")
|
let propertyEn = definition.getStaticProperty(forLang: "en", visibility: .internal)
|
||||||
let propertyEnUs = definition.getStaticProperty(forLang: "en-us")
|
let propertyEnUs = definition.getStaticProperty(forLang: "en-us", visibility: .internal)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expectFr = """
|
let expectFr = """
|
||||||
@ -842,7 +842,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"C'est la traduction francaise"
|
"C'est la traduction francaise"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -853,7 +853,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"This is the english translation"
|
"This is the english translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
@ -864,7 +864,7 @@ final class DefinitionTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
static var definition_name: String {
|
internal static var definition_name: String {
|
||||||
"This is the english us translation"
|
"This is the english us translation"
|
||||||
}
|
}
|
||||||
"""
|
"""
|
||||||
|
@ -20,6 +20,7 @@ extension StringsFileGeneratorTests {
|
|||||||
s2DefOneComment: String = "",
|
s2DefOneComment: String = "",
|
||||||
s2DefTwoFr: String = "Section Deux - Definition Deux",
|
s2DefTwoFr: String = "Section Deux - Definition Deux",
|
||||||
s2DefTwoComment: String = "",
|
s2DefTwoComment: String = "",
|
||||||
|
visibility: ExtensionVisibility = .internal
|
||||||
) -> String {
|
) -> String {
|
||||||
"""
|
"""
|
||||||
// Generated by ResgenSwift.Strings.Stringium \(ResgenSwiftVersion)
|
// Generated by ResgenSwift.Strings.Stringium \(ResgenSwiftVersion)
|
||||||
@ -30,13 +31,13 @@ extension StringsFileGeneratorTests {
|
|||||||
|
|
||||||
extension GenStrings {
|
extension GenStrings {
|
||||||
|
|
||||||
enum KeyStrings: String {
|
\(visibility) enum KeyStrings: String {
|
||||||
case s1_def_one = "s1_def_one"
|
case s1_def_one = "s1_def_one"
|
||||||
case s1_def_two = "s1_def_two"
|
case s1_def_two = "s1_def_two"
|
||||||
case s2_def_one = "s2_def_one"
|
case s2_def_one = "s2_def_one"
|
||||||
case s2_def_two = "s2_def_two"
|
case s2_def_two = "s2_def_two"
|
||||||
|
|
||||||
var keyPath: KeyPath<GenStrings, String> {
|
\(visibility) var keyPath: KeyPath<GenStrings, String> {
|
||||||
switch self {
|
switch self {
|
||||||
case .s1_def_one: return \\GenStrings.s1_def_one
|
case .s1_def_one: return \\GenStrings.s1_def_one
|
||||||
case .s1_def_two: return \\GenStrings.s1_def_two
|
case .s1_def_two: return \\GenStrings.s1_def_two
|
||||||
@ -53,7 +54,7 @@ extension StringsFileGeneratorTests {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(s1DefOneComment.isEmpty ? "No comment" : s1DefOneComment)
|
/// \(s1DefOneComment.isEmpty ? "No comment" : s1DefOneComment)
|
||||||
\(staticVar ? "static " : "")var s1_def_one: String {
|
\(visibility) \(staticVar ? "static " : "")var s1_def_one: String {
|
||||||
NSLocalizedString("s1_def_one", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Un - Definition Un", comment: "\(s1DefOneComment)")
|
NSLocalizedString("s1_def_one", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Un - Definition Un", comment: "\(s1DefOneComment)")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -62,7 +63,7 @@ extension StringsFileGeneratorTests {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(s1DefTwoComment.isEmpty ? "No comment" : s1DefTwoComment)
|
/// \(s1DefTwoComment.isEmpty ? "No comment" : s1DefTwoComment)
|
||||||
\(staticVar ? "static " : "")var s1_def_two: String {
|
\(visibility) \(staticVar ? "static " : "")var s1_def_two: String {
|
||||||
NSLocalizedString("s1_def_two", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Un - Definition Deux", comment: "\(s1DefTwoComment)")
|
NSLocalizedString("s1_def_two", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Un - Definition Deux", comment: "\(s1DefTwoComment)")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -73,7 +74,7 @@ extension StringsFileGeneratorTests {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(s2DefOneComment.isEmpty ? "No comment" : s2DefOneComment)
|
/// \(s2DefOneComment.isEmpty ? "No comment" : s2DefOneComment)
|
||||||
\(staticVar ? "static " : "")var s2_def_one: String {
|
\(visibility) \(staticVar ? "static " : "")var s2_def_one: String {
|
||||||
NSLocalizedString("s2_def_one", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Deux - Definition Un", comment: "\(s2DefOneComment)")
|
NSLocalizedString("s2_def_one", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Deux - Definition Un", comment: "\(s2DefOneComment)")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -82,7 +83,7 @@ extension StringsFileGeneratorTests {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// \(s2DefTwoComment.isEmpty ? "No comment" : s2DefTwoComment)
|
/// \(s2DefTwoComment.isEmpty ? "No comment" : s2DefTwoComment)
|
||||||
\(staticVar ? "static " : "")var s2_def_two: String {
|
\(visibility) \(staticVar ? "static " : "")var s2_def_two: String {
|
||||||
NSLocalizedString("s2_def_two", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Deux - Definition Deux", comment: "\(s2DefTwoComment)")
|
NSLocalizedString("s2_def_two", tableName: kStringsFileName, bundle: Bundle.main, value: "Section Deux - Definition Deux", comment: "\(s2DefTwoComment)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -373,13 +373,16 @@ final class StringsFileGeneratorTests: XCTestCase {
|
|||||||
let sectionTwo = Section.Mock.getSectionTwo()
|
let sectionTwo = Section.Mock.getSectionTwo()
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = StringsFileGenerator.getExtensionContent(sections: [sectionOne, sectionTwo],
|
let extensionContent = StringsFileGenerator.getExtensionContent(
|
||||||
|
sections: [sectionOne, sectionTwo],
|
||||||
defaultLang: "fr",
|
defaultLang: "fr",
|
||||||
tags: ["ios", "iosonly", "notranslation"],
|
tags: ["ios", "iosonly", "notranslation"],
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
extensionName: "GenStrings",
|
extensionName: "GenStrings",
|
||||||
extensionSuffix: "strings")
|
extensionSuffix: "strings",
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = Self.getExtensionContentExpectation(
|
let expect = Self.getExtensionContentExpectation(
|
||||||
@ -404,13 +407,16 @@ final class StringsFileGeneratorTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = StringsFileGenerator.getExtensionContent(sections: [sectionOne, sectionTwo],
|
let extensionContent = StringsFileGenerator.getExtensionContent(
|
||||||
|
sections: [sectionOne, sectionTwo],
|
||||||
defaultLang: "fr",
|
defaultLang: "fr",
|
||||||
tags: ["ios", "iosonly", "notranslation"],
|
tags: ["ios", "iosonly", "notranslation"],
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
extensionName: "GenStrings",
|
extensionName: "GenStrings",
|
||||||
extensionSuffix: "strings")
|
extensionSuffix: "strings",
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = Self.getExtensionContentExpectation(
|
let expect = Self.getExtensionContentExpectation(
|
||||||
@ -419,6 +425,7 @@ final class StringsFileGeneratorTests: XCTestCase {
|
|||||||
s1DefTwoComment: "This is a comment",
|
s1DefTwoComment: "This is a comment",
|
||||||
s2DefOneComment: "This is a comment",
|
s2DefOneComment: "This is a comment",
|
||||||
s2DefTwoComment: "This is a comment",
|
s2DefTwoComment: "This is a comment",
|
||||||
|
visibility: .public
|
||||||
)
|
)
|
||||||
|
|
||||||
if extensionContent != expect {
|
if extensionContent != expect {
|
||||||
@ -434,17 +441,21 @@ final class StringsFileGeneratorTests: XCTestCase {
|
|||||||
let sectionTwo = Section.Mock.getSectionTwo()
|
let sectionTwo = Section.Mock.getSectionTwo()
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = StringsFileGenerator.getExtensionContent(sections: [sectionOne, sectionTwo],
|
let extensionContent = StringsFileGenerator.getExtensionContent(
|
||||||
|
sections: [sectionOne, sectionTwo],
|
||||||
defaultLang: "fr",
|
defaultLang: "fr",
|
||||||
tags: ["ios", "iosonly", "notranslation"],
|
tags: ["ios", "iosonly", "notranslation"],
|
||||||
staticVar: true,
|
staticVar: true,
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
extensionName: "GenStrings",
|
extensionName: "GenStrings",
|
||||||
extensionSuffix: "strings")
|
extensionSuffix: "strings",
|
||||||
|
visibility: .package
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = Self.getExtensionContentExpectation(
|
let expect = Self.getExtensionContentExpectation(
|
||||||
staticVar: true
|
staticVar: true,
|
||||||
|
visibility: .package
|
||||||
)
|
)
|
||||||
|
|
||||||
if extensionContent != expect {
|
if extensionContent != expect {
|
||||||
@ -465,13 +476,16 @@ final class StringsFileGeneratorTests: XCTestCase {
|
|||||||
)
|
)
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = StringsFileGenerator.getExtensionContent(sections: [sectionOne, sectionTwo],
|
let extensionContent = StringsFileGenerator.getExtensionContent(
|
||||||
|
sections: [sectionOne, sectionTwo],
|
||||||
defaultLang: "fr",
|
defaultLang: "fr",
|
||||||
tags: ["ios", "iosonly", "notranslation"],
|
tags: ["ios", "iosonly", "notranslation"],
|
||||||
staticVar: true,
|
staticVar: true,
|
||||||
inputFilename: "myInputFilename",
|
inputFilename: "myInputFilename",
|
||||||
extensionName: "GenStrings",
|
extensionName: "GenStrings",
|
||||||
extensionSuffix: "strings")
|
extensionSuffix: "strings",
|
||||||
|
visibility: .internal
|
||||||
|
)
|
||||||
|
|
||||||
// Expect
|
// Expect
|
||||||
let expect = Self.getExtensionContentExpectation(
|
let expect = Self.getExtensionContentExpectation(
|
||||||
@ -480,6 +494,7 @@ final class StringsFileGeneratorTests: XCTestCase {
|
|||||||
s1DefTwoComment: "This is a comment",
|
s1DefTwoComment: "This is a comment",
|
||||||
s2DefOneComment: "This is a comment",
|
s2DefOneComment: "This is a comment",
|
||||||
s2DefTwoComment: "This is a comment",
|
s2DefTwoComment: "This is a comment",
|
||||||
|
visibility: .internal
|
||||||
)
|
)
|
||||||
|
|
||||||
if extensionContent != expect {
|
if extensionContent != expect {
|
||||||
|
@ -13,7 +13,11 @@ import ToolCore
|
|||||||
|
|
||||||
final class TagsGeneratorTests: XCTestCase {
|
final class TagsGeneratorTests: XCTestCase {
|
||||||
|
|
||||||
private func getDefinition(name: String, lang: String, tags: [String]) -> Definition {
|
private func getDefinition(
|
||||||
|
name: String,
|
||||||
|
lang: String,
|
||||||
|
tags: [String]
|
||||||
|
) -> Definition {
|
||||||
let definition = Definition(name: name)
|
let definition = Definition(name: name)
|
||||||
definition.tags = tags
|
definition.tags = tags
|
||||||
definition.translations = [lang: "Some translation"]
|
definition.translations = [lang: "Some translation"]
|
||||||
@ -41,11 +45,15 @@ final class TagsGeneratorTests: XCTestCase {
|
|||||||
]
|
]
|
||||||
|
|
||||||
// When
|
// When
|
||||||
let extensionContent = TagsGenerator.getExtensionContent(sections: [sectionOne, sectionTwo, sectionThree],
|
let extensionContent = TagsGenerator.getExtensionContent(
|
||||||
|
sections: [sectionOne, sectionTwo, sectionThree],
|
||||||
lang: "ium",
|
lang: "ium",
|
||||||
tags: ["ios", "iosonly"],
|
tags: ["ios", "iosonly"],
|
||||||
staticVar: false,
|
staticVar: false,
|
||||||
extensionName: "GenTags")
|
extensionName: "GenTags",
|
||||||
|
visibility: .public
|
||||||
|
)
|
||||||
|
|
||||||
// Expect Tags
|
// Expect Tags
|
||||||
let expect = """
|
let expect = """
|
||||||
// Generated by ResgenSwift.Strings.Tags \(ResgenSwiftVersion)
|
// Generated by ResgenSwift.Strings.Tags \(ResgenSwiftVersion)
|
||||||
@ -60,7 +68,7 @@ final class TagsGeneratorTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var s1_def_one: String {
|
public var s1_def_one: String {
|
||||||
"Some translation"
|
"Some translation"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -69,7 +77,7 @@ final class TagsGeneratorTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var s1_def_two: String {
|
public var s1_def_two: String {
|
||||||
"Some translation"
|
"Some translation"
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -80,7 +88,7 @@ final class TagsGeneratorTests: XCTestCase {
|
|||||||
///
|
///
|
||||||
/// Comment :
|
/// Comment :
|
||||||
/// No comment
|
/// No comment
|
||||||
var s2_def_one: String {
|
public var s2_def_one: String {
|
||||||
"Some translation"
|
"Some translation"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user