Skip to content

Using protocol to define a scheme version defined json migration process.

Notifications You must be signed in to change notification settings

Binlogo-Archive/JSONVersionable

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

JSONVersionable

Using protocol to define a scheme version defined json migration process.

Goal

  • Type safe as possible.
  • Flexiable migration process definition.
  • Tests cover all version migrate combination.

Requirements

  • iOS 10.0+ / macOS 10.12+ / tvOS 10.0+ / watchOS 3.0+ / Linux(with SPM)
  • Swift 5.0+

Installation

Swift Package Manager

  • File > Swift Packages > Add Package Dependency
  • Add https://github.com/Binlogo/JSONVersionable.git

CocoaPods

[WIP] Not supported yet, but soon.

Example

Person v1:

{
  "people" : [
    {
      "id" : "4E966EDD-893C-4F96-973A-949411B50149",
      "name" : "Fred Weasley"
    },
    {
      "id" : "4545A339-A09F-4AEE-BE46-1C4FCF6466AA",
      "name" : "George Weasley"
    }
  ],
  "schema_version" : 1
}

Person v2:

{
  "people" : [
    {
      "id" : "4E966EDD-893C-4F96-973A-949411B50149",
      "first_name" : "Fred",
      "last_name" : "Weasley"
    },
    {
      "id" : "4545A339-A09F-4AEE-BE46-1C4FCF6466AA",
      "first_name" : "George",
      "last_name" : "Weasley"
    }
  ],
  "schema_version" : 2
}

Migration

Single version jump migration:

let origin = PersonFixtures.simpleV1
let v2Migration = PersonV2Migration().eraseToAnyMigration()
let processor = JSONMigrationProcessor(currentVersion: 2, versionMigrations: [v2Migration])
do {
    let migratedJSON = try processor.migration(origin: origin).json
} catch {
    print(error)
}

Multiple versions migration

let origin = PersonFixtures.simpleV1
let versionMigrations = [
    PersonV2Migration().eraseToAnyMigration(),
    PersonV3Migration().eraseToAnyMigration(),
]
let processor = JSONMigrationProcessor(currentVersion: 3, versionMigrations: versionMigrations)
do {
    let migratedJSON = try processor.migration(origin: origin).json
} catch {
    print(error)
}

Inspirations & Thanks

About

Using protocol to define a scheme version defined json migration process.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages