Giter Club home page Giter Club logo

semver's Introduction

SemVer

Реализация семантического версионирования. Подробно о нем вы можете прочитать на сайте semver.org

    3.25.12-alpha+sha.5114f85
    - -- -- ----- -----------
    |  |  |   |        |    
Major  |  |   |        Build
   Minor  |   |
      Patch   PreRelease

⚠️ Обратите внимание, что PreRelease и Build
представляются в виде набора идентификаторов,
разделяемых точкой (например, sha.5114f85 
или 23.243.6754.2)

Установка

Добавить библиотеку можно через SPM:

.package(
    url: "https://github.com/RinatAbidullin/SemVer.git", 
    .upToNextMajor(from: "3.0.0")
)

Создание версии

Создать версию можно двумя способами:

  1. Передачей всех компонентов отдельно:

    // 1. Создаем версию "1.4.32"
    let version = try SemVer(
        major: 1,
        minor: 4,
        patch: 32
    )
    
    // 2. Создаем версию "1.4.32-alpha"
    let version = try SemVer(
        major: 1,
        minor: 4,
        patch: 32,
        preReleaseIdentifiers: ["alpha"]
    )
    
    // 3. Создаем версию "1.4.32+exp.sha.fd54sd"
    let version = try SemVer(
        major: 1,
        minor: 4,
        patch: 32,
        buildIdentifiers: ["exp", "sha", "fd54sd"]
    )
    
    // 4. Создаем версию "1.4.32-beta+exp.sha.fd54sd"
    let version = try SemVer(
        major: 1,
        minor: 4,
        patch: 32,
        preReleaseIdentifiers: ["beta"],
        buildIdentifiers: ["exp", "sha", "fd54sd"]
    )
  2. Из строки.

    2.1 Строковое представление версии должно строго соответствовать требованиям SemVer, т.е. недопустимо опускать компоненты Minor или Patch, когда они равны 0:

    // Создаем версию "1.4.0"
    let version = try SemVer(string: "1.4.0")
    
    // Создаем версию "1.4.2-alpha+1032"
    let version = try SemVer(string: "1.4.2-alpha+1032")

    2.2 Строковое представление версии может не соответствовать требованиям SemVer, т.е. возможны случаи, когда опускаются компоненты Minor или Patch, если они равны 0. В этом случае можно использовать опцию .allowSkippingMinorOrPatch:

    // Создаем версию "1.4.0"
    let version = try SemVer(string: "1.4", options: [.allowSkippingMinorOrPatch])
    
    // Создаем версию "2.0.0"
    let version = try SemVer(string: "2", options: [.allowSkippingMinorOrPatch])
    
    // Создаем версию "1.0.0-alpha"
    let version = try SemVer(string: "1.0-alpha")

Сравнение версий

Версии поддерживают сравнения согласно правилам, опубликованным на semver.org:

// "1.2.0" должна быть младше, чем "1.2.1"
let version1 = try SemVer(string: "1.2.0")
let version2 = try SemVer(string: "1.2.1")
version1 < version2 // true

// "1.2.0" должна быть старше, чем "1.2.0-alpha"
let version1 = try SemVer(string: "1.2.0")
let version2 = try SemVer(string: "1.2.0-alpha")
version1 > version2 // true

// "1.2.0-alpha" должна быть младше, чем "1.2.0-beta"
let version1 = try SemVer(string: "1.2.0-alpha")
let version2 = try SemVer(string: "1.2.0-beta")
version1 < version2 // true

// "1.2.0" должна быть эквивалентна "1.2.0+exp.sha.fd54sd", 
// так как Build не учитыватся при сравнении
let version1 = try SemVer(string: "1.2.0")
let version2 = try SemVer(string: "1.2.0+exp.sha.fd54sd")
version1 == version2 // true

// "1.2.0-beta.2" должна быть младше, чем "1.2.0-beta.11" (2 < 11)
let version1 = try SemVer(string: "1.2.0-beta.2")
let version2 = try SemVer(string: "1.2.0-beta.11")
version1 < version2 // true

Преобразование версии в строку

Преобразуйте структуру SemVer в строку, например, когда нужно сохранить ее в БД:

// Создаем версию
let version = try SemVer(
    major: 1,
    minor: 4,
    patch: 32,
    preReleaseIdentifiers: ["beta"],
    buildIdentifiers: ["exp", "sha", "fd54sd"]
)

// Преобразовываем версию в строку, строго следуя правилам semver.org
let representation = version.asString // "1.4.32-beta+exp.sha.fd54sd"

⚠️ При необходимости можно управлять итоговым видом строкового представления версии, передавая дополнительные опции [OutputOption] (но имейте в виду, что это будет являться послаблениями в строгие правила semver.org):

// Создаем версию "1.0.0"
let version = try SemVer(
    major: 1,
    minor: 0,
    patch: 0
)

// Преобразовываем версию в строку, опуская `Patch`, когда он может быть равен 0
let representation = version.asString(with: [.omitPatchIfPossible]) // "1.0"

// Преобразовываем версию в строку, опуская `Minor` и `Patch`, когда они могут быть равны 0
let representation = version.asString(with: [.omitMinorAndPatchIfPossible]) // "1"

Версия приложения (Xcode-проект)

Доступно расширение для Bundle, позволяющее получить версию приложения как SemVer:

app_version

let appVersion = Bundle.semVer // "12.1.1+1153"

Инкрементация версии

Чтобы инкрементировать (повысить) версию, используйте функцию next(...):

let version = try SemVer(string: "1.4.32")
let newMajorVersion = try version.next(.major) // "2.0.0"
let newMinorVersion = try version.next(.minor) // "1.5.0"
let newPatchVersion = try version.next(.patch) // "1.4.33"

По умолчанию компоненты версии PreRelease и Build для инкрементированной версии удаляются:

let version = try SemVer(string: "1.4.32-beta+exp.sha.fd54sd")
let newMinorVersion = try version.next(.minor) // "1.5.0"

Чтобы изменить это поведение, используйте второй параметр. Например, (preRelease: .keep, build: .delete) для инкрементированной версии оставит без изменений PreRelease и удалит Build :

let version = try SemVer(string: "1.4.32-beta+exp.sha.fd54sd")
let newMinorVersion = try version.next(
    .minor, 
    with: (preRelease: .keep, build: .delete)
) 
// "1.5.0-beta"

semver's People

Contributors

rinatabidullin avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.