Skip to content

Commit

Permalink
Merge pull request #15 from Cosmo/development
Browse files Browse the repository at this point in the history
Development
  • Loading branch information
Cosmo committed Sep 2, 2019
2 parents 7894b55 + 2a125ef commit afdba25
Show file tree
Hide file tree
Showing 52 changed files with 765 additions and 724 deletions.
21 changes: 15 additions & 6 deletions Package.resolved
Expand Up @@ -6,17 +6,17 @@
"repositoryURL": "https://github.com/Cosmo/GrammaticalNumber.git",
"state": {
"branch": null,
"revision": "fe40b466bf5f0619ace5b6f25d943a00c9524931",
"version": "0.0.1"
"revision": "27145a4e0f236d0091800b864614ecbe27b0bdab",
"version": "0.0.2"
}
},
{
"package": "PathKit",
"repositoryURL": "https://github.com/kylef/PathKit.git",
"state": {
"branch": null,
"revision": "e2f5be30e4c8f531c9c1e8765aa7b71c0a45d7a0",
"version": "0.9.2"
"revision": "73f8e9dca9b7a3078cb79128217dc8f2e585a511",
"version": "1.0.0"
}
},
{
Expand All @@ -31,10 +31,19 @@
{
"package": "Stencil",
"repositoryURL": "https://github.com/stencilproject/Stencil.git",
"state": {
"branch": "master",
"revision": "e516ca9389b64da70b71a461925bbca66f65fe61",
"version": null
}
},
{
"package": "StringCase",
"repositoryURL": "https://github.com/Cosmo/StringCase.git",
"state": {
"branch": null,
"revision": "0e9a78d6584e3812cd9c09494d5c7b483e8f533c",
"version": "0.13.1"
"revision": "4266db35a164e833928ac2a9b812e554c0694201",
"version": "1.0.0"
}
}
]
Expand Down
12 changes: 8 additions & 4 deletions Package.swift
Expand Up @@ -11,16 +11,20 @@ let package = Package(
],
dependencies: [
// Dependencies declare other packages that this package depends on.
// .package(url: /* package url */, from: "1.0.0"),
.package(url: "https://github.com/stencilproject/Stencil.git", from: "0.13.0"),
.package(url: "https://github.com/Cosmo/GrammaticalNumber.git", from: "0.0.1")
.package(url: "https://github.com/stencilproject/Stencil.git", .branch("master")),
.package(url: "https://github.com/Cosmo/GrammaticalNumber.git", from: "0.0.2"),
.package(url: "https://github.com/Cosmo/StringCase.git", from: "1.0.0"),
],
targets: [
// Targets are the basic building blocks of a package. A target can define a module or a test suite.
// Targets can depend on other targets in this package, and on products in packages which this package depends on.
.target(
name: "HackManLib",
dependencies: ["Stencil", "GrammaticalNumber"]),
dependencies: [
"Stencil",
"GrammaticalNumber",
"StringCase"]
),
.target(
name: "HackMan",
dependencies: ["HackManLib"]),
Expand Down
Expand Up @@ -6,6 +6,7 @@
//

import Foundation
import StringCase

public struct CommandLineRunner {
public enum Command {
Expand Down Expand Up @@ -50,11 +51,17 @@ public struct CommandLineRunner {
Writer.finish()
case .generate:
guard !arguments.isEmpty else { throw GeneratorCommandError.noGenerator }
let generatorName = arguments.removeFirst().camelCasedIfNeeded(.upper)
let generatorName = arguments.removeFirst().upperCamelCased()
guard let generator = NSClassFromString(generatorName) as? Generator.Type else {
throw GeneratorCommandError.unknownGenerator
}
generator.init().generate(arguments: arguments, options: options)

if options.contains("-h") || options.contains("--help") {
generator.help()
} else {
generator.init().generate(arguments: arguments, options: options)
}

Writer.finish()
case .help:
print("Find help on: https://github.com/Cosmo/HackMan")
Expand Down Expand Up @@ -90,26 +97,35 @@ extension CommandLineRunner {
}

public static func printGeneratorUsage() {
let generators: [Generator.Type] = [
AppDelegate.self,
AssetCatalog.self,
CollectionViewCell.self,
Coordinator.self,
CoordinatorChild.self,
CoordinatorMain.self,
DataSourceTableView.self,
DataSourceTableViewSearchResults.self,
LaunchScreen.self,
Model.self,
ReusableView.self,
Scaffold.self,
SearchResultsController.self,
TableViewCell.self,
ViewController.self,
ViewControllerCollection.self,
ViewControllerDetail.self,
ViewControllerInformation.self,
ViewControllerTable.self,
ViewControllerWeb.self,
]

print("Usage: hackman generate GENERATOR")
print()
print("Generators:")
print(" scaffold NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
print(" app_delegate")
print(" asset_catalog")
print(" launch_screen")
print(" reusable_view")
print(" coordinator")
print(" coordinator_main")
print(" coordinator_child NAME")
print(" model NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
print(" view_controller NAME")
print(" view_controller_collection NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
print(" collection_view_cell NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
print(" view_controller_table NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
print(" table_view_cell NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
print(" view_controller_detail NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
print(" view_controller_web")
print(" view_controller_information")
for generator in generators {
print(" \(generator.singleLineUsage())")
}
print()
print("Example:")
print(" hackman generate scaffold song title:string artist_name:string album_name:string")
Expand Down
26 changes: 26 additions & 0 deletions Sources/HackManLib/Extensions/StringColorExtensions.swift
@@ -0,0 +1,26 @@
//
// File.swift
//
//
// Created by Devran on 06.06.19.
//

import Foundation

extension StringLiteralType {
public enum TerminalColor: String {
case black = "\u{001B}[0;30m"
case red = "\u{001B}[0;31m"
case green = "\u{001B}[0;32m"
case yellow = "\u{001B}[0;33m"
case blue = "\u{001B}[0;34m"
case magenta = "\u{001B}[0;35m"
case cyan = "\u{001B}[0;36m"
case white = "\u{001B}[0;37m"
case `default` = "\u{001B}[0;0m"
}

func colored(_ color: TerminalColor) -> String {
return "\(color.rawValue)\(self)\(TerminalColor.default.rawValue)"
}
}
23 changes: 15 additions & 8 deletions Sources/HackManLib/Generator.swift
Expand Up @@ -7,25 +7,32 @@

import Foundation
import PathKit
import Stencil

public protocol Generator {
init()
func generate(arguments: [String], options: [String])
func help()
static func help()
static func singleLineUsage() -> String
}

extension Generator {
var path: Path {
var generatorName: String {
return String(describing: type(of: self))
}

var basePath: Path {
var bundlePath = Bundle.main.bundlePath.split(separator: "/")
bundlePath.removeLast(2)
let generatorsPath = bundlePath.joined(separator: "/")
return Path("/\(generatorsPath)/Sources/HackManLib/Generators/\(String(describing: type(of: self)))")
return Path("/\(generatorsPath)/Sources/HackManLib/Generators/\(generatorName)")
}

var loader: FileSystemLoader {
return FileSystemLoader(paths: [basePath])
}

func showHelpIfNeeded(options: [String]) {
if options.contains("-h") || options.contains("--help") {
help()
exit(0)
}
var environment: Environment {
Environment(loader: loader)
}
}
13 changes: 6 additions & 7 deletions Sources/HackManLib/Generators/AppDelegate/AppDelegate.swift
Expand Up @@ -6,11 +6,6 @@ class AppDelegate: NSObject, Generator {
required override init() {}

func generate(arguments: [String], options: [String]) {
showHelpIfNeeded(options: options)

let loader = FileSystemLoader(paths: [path])
let environment = Environment(loader: loader)

let containsCoordinator = options.contains("-c") || options.contains("--coordinator")
if containsCoordinator {
Coordinator().generate(arguments: arguments, options: options)
Expand All @@ -26,10 +21,14 @@ class AppDelegate: NSObject, Generator {
Writer.createFile("\(Writer.extractSourcePath(options: options))/AppDelegate.swift", contents: rendered, options: options)
}

func help() {
print("Usage: hackman generate app_delegate")
static func help() {
print("Usage: hackman generate \(singleLineUsage())")
print()
print("Example:")
print(" hackman generate app_delegate")
}

static func singleLineUsage() -> String {
return "app_delegate"
}
}
12 changes: 7 additions & 5 deletions Sources/HackManLib/Generators/AssetCatalog/AssetCatalog.swift
Expand Up @@ -5,9 +5,7 @@ class AssetCatalog: NSObject, Generator {
required override init() {}

func generate(arguments: [String], options: [String]) {
showHelpIfNeeded(options: options)

let url = URL(fileURLWithPath: "\(path)/Assets.xcassets")
let url = URL(fileURLWithPath: "\(basePath)/Assets.xcassets")
let contentsUrl1 = url.appendingPathComponent("Contents.json")
let contents = try! String(contentsOf: contentsUrl1, encoding: String.Encoding.utf8)
Writer.createFile("\(Writer.extractSourcePath(options: options))/Assets.xcassets/Contents.json", contents: contents, options: options)
Expand All @@ -17,10 +15,14 @@ class AssetCatalog: NSObject, Generator {
Writer.createFile("\(Writer.extractSourcePath(options: options))/Assets.xcassets/AppIcon.appiconset/Contents.json", contents: contents2, options: options)
}

func help() {
print("Usage: hackman generate asset_catalog")
static func help() {
print("Usage: hackman generate \(singleLineUsage())")
print()
print("Example:")
print(" hackman generate asset_catalog")
}

static func singleLineUsage() -> String {
return "asset_catalog"
}
}
@@ -1,17 +1,17 @@
//
// {{ className }}.swift
// {{ resource.name }}CollectionViewCell.swift
//

import UIKit

class {{ resourceName }}CollectionViewCell: UICollectionViewCell {
class {{ resource.name }}CollectionViewCell: UICollectionViewCell {
var stackView: UIStackView = {
let stackView = UIStackView()
stackView.axis = NSLayoutConstraint.Axis.vertical
return stackView
}()

{% for property in properties %}
{% for property in resource.properties %}
lazy var {{ property.name }}Label: UILabel = {
let label = UILabel()
{% if forloop.counter == 0 %}
Expand Down Expand Up @@ -42,7 +42,7 @@ class {{ resourceName }}CollectionViewCell: UICollectionViewCell {

contentView.backgroundColor = UIColor.lightGray

{% for property in properties %}
{% for property in resource.properties %}
stackView.addArrangedSubview({{ property.name }}Label)
{% endfor %}

Expand Down Expand Up @@ -78,4 +78,4 @@ class {{ resourceName }}CollectionViewCell: UICollectionViewCell {
}
}

extension {{ resourceName }}CollectionViewCell: ReusableView {}
extension {{ resource.name }}CollectionViewCell: ReusableView {}
Expand Up @@ -6,37 +6,33 @@ class CollectionViewCell: NSObject, Generator {
required override init() {}

func generate(arguments: [String], options: [String]) {
showHelpIfNeeded(options: options)

guard !arguments.isEmpty else {
printUsage()
type(of: self).help()
exit(0)
}

var arguments = arguments
let resourceName = arguments.removeFirst().camelCasedIfNeeded(.upper)
let properties = Property.createList(inputStrings: arguments)

var mutableArguments = arguments
let resource = Resource(
name: mutableArguments.removeFirst(),
properties: Property.createList(inputStrings: mutableArguments)
)
let context: [String: Any] = [
"resourceName": resourceName,
"properties": properties
"resource": resource
]

let loader = FileSystemLoader(paths: [path])
let environment = Environment(loader: loader)
let rendered = try! environment.renderTemplate(name: "CollectionViewCell.stf", context: context)

Writer.createFile("\(Writer.extractSourcePath(options: options))/Views/Cells/\(resourceName)CollectionViewCell.swift", contents: rendered, options: options)
Writer.createFile("\(Writer.extractSourcePath(options: options))/Views/Cells/\(resource.name)CollectionViewCell.swift", contents: rendered, options: options)
}

func printUsage() {
print("Usage: hackman generate collection_view_cell NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …")
static func help() {
print("Usage: hackman generate \(singleLineUsage())")
print()
print("Example:")
print(" hackman generate collection_view_cell song title:string artist_name:string album_name:string")
}

func help() {
printUsage()
static func singleLineUsage() -> String {
return "collection_view_cell NAME [PROPERTY[:TYPE] PROPERTY[:TYPE]] …"
}
}
13 changes: 6 additions & 7 deletions Sources/HackManLib/Generators/Coordinator/Coordinator.swift
Expand Up @@ -6,20 +6,19 @@ class Coordinator: NSObject, Generator {
required override init() {}

func generate(arguments: [String], options: [String]) {
showHelpIfNeeded(options: options)

let loader = FileSystemLoader(paths: [path])
let environment = Environment(loader: loader)
let rendered = try! environment.renderTemplate(name: "Coordinator.stf")

Writer.createFile("\(Writer.extractSourcePath(options: options))/Protocols/Coordinator.swift", contents: rendered, options: options)
}

func help() {
print("Usage: hackman generate coordinator")
static func help() {
print("Usage: hackman generate \(singleLineUsage())")
print()
print("Example:")
print(" hackman generate coordinator")
}


static func singleLineUsage() -> String {
return "coordinator"
}
}

0 comments on commit afdba25

Please sign in to comment.