Packages
petal_components
1.2.0
4.6.2
4.6.1
4.6.0
4.5.0
4.4.0
4.3.0
4.2.1
4.2.0
4.1.2
4.1.1
4.1.0
4.0.12
4.0.11
4.0.10
4.0.6
4.0.5
4.0.4
4.0.3
4.0.1
3.2.2
3.2.1
3.2.0
3.1.0
3.0.2
3.0.1
3.0.0
2.9.3
2.9.2
retired
2.9.1
retired
2.9.0
retired
2.8.4
2.8.3
2.8.2
2.8.1
2.8.0
2.7.4
2.7.3
2.7.2
2.7.1
2.7.0
2.6.1
2.6.0
2.5.2
2.5.1
2.5.0
2.4.3
2.4.2
2.4.1
2.4.0
2.3.0
2.2.1
2.2.0
2.1.2
2.1.1
2.1.0
2.0.6
2.0.5
2.0.4
2.0.3
2.0.2
2.0.1
2.0.0
1.9.3
1.9.2
1.9.1
1.9.0
1.8.0
1.7.1
1.7.0
1.6.2
1.6.1
1.6.0
1.5.5
1.5.4
1.5.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.0
1.2.14
1.2.13
1.2.12
1.2.11
1.2.10
1.2.9
1.2.8
1.2.7
1.2.6
1.2.5
1.2.4
1.2.3
1.2.2
1.2.1
1.2.0
1.1.6
1.1.5
1.1.4
1.1.3
1.1.2
1.1.1
1.1.0
1.0.8
1.0.7
1.0.6
1.0.5
1.0.4
1.0.3
1.0.2
1.0.1
1.0.0
0.19.10
0.19.9
0.19.8
0.19.7
0.19.6
0.19.5
0.19.4
0.19.3
0.19.2
0.19.1
0.19.0
0.18.5
0.18.4
0.18.3
0.18.2
0.18.1
0.18.0
0.17.7
0.17.6
0.17.5
0.17.4
0.17.3
0.17.2
0.17.1
0.17.0
0.16.0
0.15.0
0.14.1
0.14.0
0.13.7
0.13.6
0.13.5
0.13.4
0.13.3
0.13.2
0.13.1
0.13.0
0.12.0
0.11.4
0.11.3
0.11.2
0.11.1
0.11.0
0.10.8
0.10.7
0.10.6
0.10.5
0.10.4
0.10.3
0.10.2
0.10.1
0.10.0
0.9.3
0.9.2
0.9.1
0.9.0
0.8.0
0.7.0
0.6.1
0.6.0
0.5.1
0.5.0
0.4.0
0.3.2
0.3.1
0.3.0
0.2.2
0.2.1
0.2.0
0.1.0
Shadcn-style Phoenix LiveView components that AI assistants can actually use. Pair with the MCP server so AI coding tools can inspect the real component API.
Current section
Files
Jump to
Current section
Files
priv/release.exs
defmodule Releaser.VersionUtils do
@doc """
Some utilities to get and set version numbers in the `mix.exs` file and to programmatically transform version numbers.
1. Create a file RELEASE.md and fill out the following templates.
```
RELEASE_TYPE: patch
- Fixed x
- Added y
```
Release types:
- major: 0.0.1 -> 1.0.0 (when you make incompatible API changes)
- minor: 0.0.1 -> 0.1.0 (when you add functionality in a backwards compatible manner)
- patch: 0.0.1 -> 0.0.2 (when you make backwards compatible bug fixes)
2. Run in the terminal:
mix run priv/release.exs
3. Deploy to Hex.pm
mix hex.publish
4. Push to git
git push origin main
git push --tags
"""
@version_line_regex ~r/(\n\s*@version\s+")([^\n]+)("\n)/
def bump_major(%Version{} = version) do
%{version | major: version.major + 1, minor: 0, patch: 0}
end
def bump_minor(%Version{} = version) do
%{version | minor: version.minor + 1, patch: 0}
end
def bump_patch(%Version{} = version) do
%{version | patch: version.patch + 1}
end
def version_to_string(%Version{} = version) do
"#{version.major}.#{version.minor}.#{version.patch}"
end
def get_version() do
config = File.read!("mix.exs")
case Regex.run(@version_line_regex, config) do
[_line, _pre, version, _post] ->
Version.parse!(version)
_ ->
raise "Invalid project version in your mix.exs file"
end
end
def set_version(old_version, version) do
version_string = version_to_string(version)
old_version_string = version_to_string(old_version)
contents = File.read!("mix.exs")
replaced =
Regex.replace(@version_line_regex, contents, fn _, pre, _version, post ->
"#{pre}#{version_string}#{post}"
end)
File.write!("mix.exs", replaced)
# Update the readme to point to the latest version
readme_contents = File.read!("README.md")
replaced_readme = String.replace(readme_contents, old_version_string, version_string)
File.write!("README.md", replaced_readme)
end
def update_version(%Version{} = version, "major"), do: bump_major(version)
def update_version(%Version{} = version, "minor"), do: bump_minor(version)
def update_version(%Version{} = version, "patch"), do: bump_patch(version)
def update_version(%Version{} = _version, type), do: raise("Invalid version type: #{type}")
end
defmodule Releaser.Changelog do
@doc """
Functions to append entries to the changelog.
"""
alias Releaser.VersionUtils
@release_filename "RELEASE.md"
@release_type_regex ~r/^(RELEASE_TYPE:\s+)(\w+)(.*)/s
@changelog_filename "CHANGELOG.md"
@changelog_entry_header_level 3
@changelog_entries_marker "# Changelog\n"
def remove_release_file() do
File.rm!(@release_filename)
end
def extract_release_type() do
contents = File.read!(@release_filename)
{type, text} =
case Regex.run(@release_type_regex, contents) do
[_line, _pre, type, text] ->
{type, String.trim(text)}
_ ->
raise "Invalid project version in your mix.exs file"
end
{type, text}
end
def changelog_entry(%Version{} = version, %DateTime{} = date_time, text) do
header_prefix = String.duplicate("#", @changelog_entry_header_level)
version_string = VersionUtils.version_to_string(version)
date_time_string =
date_time
|> DateTime.truncate(:second)
|> NaiveDateTime.to_string()
"""
#{header_prefix} #{version_string} - #{date_time_string}
#{text}
"""
end
def add_changelog_entry(entry) do
contents = File.read!(@changelog_filename)
[first, last] = String.split(contents, @changelog_entries_marker)
replaced =
Enum.join([
first,
@changelog_entries_marker,
entry,
last
])
File.write!(@changelog_filename, replaced)
end
end
defmodule Releaser.Git do
@doc """
This module contains some git-specific functionality
"""
alias Releaser.VersionUtils
def add_commit_and_tag(version) do
version_string = VersionUtils.version_to_string(version)
Mix.Shell.IO.cmd("git add .", [])
Mix.Shell.IO.cmd(~s'git commit -m "v#{version_string}"')
Mix.Shell.IO.cmd(~s'git tag -a v#{version_string} -m "Version #{version_string}"')
end
end
defmodule Releaser.Tests do
def run_tests!() do
error_code = Mix.Shell.IO.cmd("mix test", [])
if error_code != 0 do
raise "This version can't be released because tests are failing."
end
:ok
end
end
defmodule Releaser.Publish do
def publish!() do
error_code = Mix.Shell.IO.cmd("mix hex.publish", [])
if error_code != 0 do
raise "Couldn't publish package on hex."
end
:ok
end
end
defmodule Releaser do
alias Releaser.VersionUtils
alias Releaser.Changelog
alias Releaser.Git
alias Releaser.Tests
alias Releaser.Publish
def run() do
# Run the tests before generating the release.
# If any test fails, stop.
Tests.run_tests!()
# Get the current version from the mix.exs file.
version = VersionUtils.get_version()
# Extract the changelog entry and add it to the changelog.
# Use the information in the RELEASE.md file to bump the version number.
{release_type, text} = Changelog.extract_release_type()
new_version = VersionUtils.update_version(version, release_type)
entry = Changelog.changelog_entry(new_version, DateTime.utc_now(), text)
Changelog.add_changelog_entry(entry)
# Set a new version on the mix.exs file
VersionUtils.set_version(version, new_version)
# Remove the release file
Changelog.remove_release_file()
# Commit the changes and ad a new 'v*.*.*' tag
Git.add_commit_and_tag(new_version)
end
end
# Generate and publish a new release
Releaser.run()