Skip to content

Resources boilerplate code generator for Swift

Notifications You must be signed in to change notification settings

EduDo-Inc/spmgen

Folders and files

NameName
Last commit message
Last commit date

Latest commit

96f83ae · Sep 21, 2021

History

44 Commits
Jun 29, 2021
May 6, 2021
Jul 22, 2021
Sep 20, 2021
Sep 20, 2021
Jun 9, 2021
May 6, 2021
Jun 15, 2021
Sep 21, 2021
Jun 15, 2021

Repository files navigation

SPMGen

Code generator for Swift.

Installation

Homebrew

brew install edudo-inc/formulae/spmgen

Makefile

# Download repo
git clone https://github.com/edudo-inc/spmgen.git

# Navigate to repo directory
cd spmgen

# Build and install using Make
make install

# You can also delete spmgen using `make uninstall` command

Resources command

SPMGen provides static resource factories for various resource types.

Supported resources:

Resource Extensions Is reliable
ColorResource .xcassets true
FontResource .ttf .otf true
ImageResource .xcassets true
NibResource .xib not used
StoryboardResource .storyboard not used
SCNSceneResource .scnassets/.scn true

Integration

Add SPMGen dependency to your package

.package(url: "https://github.com/edudo-inc/spmgen.git", from: "1.0.1")

Create <#Project#>Resources target with a following structure

Sources
  <#Project#>Resources
    Resources
      <#Assets#>

Specify resource processing and add SPMResources dependency to your target

.target(
  name: "<#Project#>Resources",
  dependencies: [
    .product(
      name: "SPMResources",
      package: "spmgen"
    )
  ],
  resources: [
    .process("Resources")
  ]
)

Add a script to your Run Script target build phases

spmgen resources "$SRCROOT/Sources/<#Project#>Resources/Resources" \
  --output "$SRCROOT/Sources/<#Project#>Resources/SPMGen.swift" \
  --indentor " " \
  --indentation-width 2

# You can also add `--disable-exports` flag to disable `@_exported` attribute
# for `import SPMResources` declaration in generated file

Add <#Project#>Resources target as a dependency to other targets

.target(
  name: "<#Project#>Module",
  dependencies: [
    .target(name: "<#Project#>Resources")
  ]
)

Usage

Import your <#Project#>Resources package and initialize objects using .resource() static factory

import <#Project#>Resources
import UIKit

let label = UILabel()
label.backgroundColor = .resource(.accentColor)
label.textColor = .resource(.primaryText)
label.font = .primary(ofSize: 12, weight: .semibold, style: .italic)

let imageView = UIImageView(image: .resource(.logo))

Note: Fonts require additional setup

For example you want to add Monsterrat and Arimo fonts with different styles

  • Download fonts and add them to Sources/<#Project#>Resources/Resources folder

  • Add a static factories for your custom fonts (Example)

  • Register custom fonts on app launch (in AppDelegate, for example)

    • UIFont.bootstrap() if you are using code from the example above.

CasePaths command

Generate CasePaths for all enums in your project using following command

spmgen casepaths "<path_to_sources>" \
  --indentor " " \
  --indentation-width 2

Todo: Support configuration file with exclude paths and typename-based excludes.