This commit is contained in:
Zach Daniel 2023-11-27 11:21:17 -05:00
commit a113f43196
40 changed files with 990 additions and 0 deletions

21
.check.exs Normal file
View file

@ -0,0 +1,21 @@
[
## all available options with default values (see `mix check` docs for description)
# parallel: true,
# skipped: true,
## list of tools (see `mix check` docs for defaults)
tools: [
## curated tools may be disabled (e.g. the check for compilation warnings)
# {:compiler, false},
## ...or adjusted (e.g. use one-line formatter for more compact credo output)
# {:credo, "mix credo --format oneline"},
{:doctor, false}
## custom new tools may be added (mix tasks or arbitrary commands)
# {:my_mix_task, command: "mix release", env: %{"MIX_ENV" => "prod"}},
# {:my_arbitrary_tool, command: "npm test", cd: "assets"},
# {:my_arbitrary_script, command: ["my_script", "argument with spaces"], cd: "scripts"}
]
]

184
.credo.exs Normal file
View file

@ -0,0 +1,184 @@
# This file contains the configuration for Credo and you are probably reading
# this after creating it with `mix credo.gen.config`.
#
# If you find anything wrong or unclear in this file, please report an
# issue on GitHub: https://github.com/rrrene/credo/issues
#
%{
#
# You can have as many configs as you like in the `configs:` field.
configs: [
%{
#
# Run any config using `mix credo -C <name>`. If no config name is given
# "default" is used.
#
name: "default",
#
# These are the files included in the analysis:
files: %{
#
# You can give explicit globs or simply directories.
# In the latter case `**/*.{ex,exs}` will be used.
#
included: [
"lib/",
"src/",
"test/",
"web/",
"apps/*/lib/",
"apps/*/src/",
"apps/*/test/",
"apps/*/web/"
],
excluded: [~r"/_build/", ~r"/deps/", ~r"/node_modules/"]
},
#
# Load and configure plugins here:
#
plugins: [],
#
# If you create your own checks, you must specify the source files for
# them here, so they can be loaded by Credo before running the analysis.
#
requires: [],
#
# If you want to enforce a style guide and need a more traditional linting
# experience, you can change `strict` to `true` below:
#
strict: false,
#
# To modify the timeout for parsing files, change this value:
#
parse_timeout: 5000,
#
# If you want to use uncolored output by default, you can change `color`
# to `false` below:
#
color: true,
#
# You can customize the parameters of any check by adding a second element
# to the tuple.
#
# To disable a check put `false` as second element:
#
# {Credo.Check.Design.DuplicatedCode, false}
#
checks: [
#
## Consistency Checks
#
{Credo.Check.Consistency.ExceptionNames, []},
{Credo.Check.Consistency.LineEndings, []},
{Credo.Check.Consistency.ParameterPatternMatching, []},
{Credo.Check.Consistency.SpaceAroundOperators, []},
{Credo.Check.Consistency.SpaceInParentheses, []},
{Credo.Check.Consistency.TabsOrSpaces, []},
#
## Design Checks
#
# You can customize the priority of any check
# Priority values are: `low, normal, high, higher`
#
{Credo.Check.Design.AliasUsage, false},
# You can also customize the exit_status of each check.
# If you don't want TODO comments to cause `mix credo` to fail, just
# set this value to 0 (zero).
#
{Credo.Check.Design.TagTODO, [exit_status: 2]},
{Credo.Check.Design.TagFIXME, []},
#
## Readability Checks
#
{Credo.Check.Readability.AliasOrder, []},
{Credo.Check.Readability.FunctionNames, []},
{Credo.Check.Readability.LargeNumbers, []},
{Credo.Check.Readability.MaxLineLength, [priority: :low, max_length: 120]},
{Credo.Check.Readability.ModuleAttributeNames, []},
{Credo.Check.Readability.ModuleDoc, []},
{Credo.Check.Readability.ModuleNames, []},
{Credo.Check.Readability.ParenthesesInCondition, []},
{Credo.Check.Readability.ParenthesesOnZeroArityDefs, []},
{Credo.Check.Readability.PredicateFunctionNames, []},
{Credo.Check.Readability.PreferImplicitTry, []},
{Credo.Check.Readability.RedundantBlankLines, []},
{Credo.Check.Readability.Semicolons, []},
{Credo.Check.Readability.SpaceAfterCommas, []},
{Credo.Check.Readability.StringSigils, []},
{Credo.Check.Readability.TrailingBlankLine, []},
{Credo.Check.Readability.TrailingWhiteSpace, []},
{Credo.Check.Readability.UnnecessaryAliasExpansion, []},
{Credo.Check.Readability.VariableNames, []},
#
## Refactoring Opportunities
#
{Credo.Check.Refactor.CondStatements, []},
{Credo.Check.Refactor.CyclomaticComplexity, false},
{Credo.Check.Refactor.FunctionArity, [max_arity: 13]},
{Credo.Check.Refactor.LongQuoteBlocks, false},
{Credo.Check.Refactor.MapInto, false},
{Credo.Check.Refactor.MatchInCondition, []},
{Credo.Check.Refactor.NegatedConditionsInUnless, []},
{Credo.Check.Refactor.NegatedConditionsWithElse, []},
{Credo.Check.Refactor.Nesting, [max_nesting: 6]},
{Credo.Check.Refactor.UnlessWithElse, []},
{Credo.Check.Refactor.WithClauses, []},
#
## Warnings
#
{Credo.Check.Warning.BoolOperationOnSameValues, []},
{Credo.Check.Warning.ExpensiveEmptyEnumCheck, []},
{Credo.Check.Warning.IExPry, []},
{Credo.Check.Warning.IoInspect, []},
{Credo.Check.Warning.LazyLogging, false},
{Credo.Check.Warning.MixEnv, false},
{Credo.Check.Warning.OperationOnSameValues, []},
{Credo.Check.Warning.OperationWithConstantResult, []},
{Credo.Check.Warning.RaiseInsideRescue, []},
{Credo.Check.Warning.UnusedEnumOperation, []},
{Credo.Check.Warning.UnusedFileOperation, []},
{Credo.Check.Warning.UnusedKeywordOperation, []},
{Credo.Check.Warning.UnusedListOperation, []},
{Credo.Check.Warning.UnusedPathOperation, []},
{Credo.Check.Warning.UnusedRegexOperation, []},
{Credo.Check.Warning.UnusedStringOperation, []},
{Credo.Check.Warning.UnusedTupleOperation, []},
{Credo.Check.Warning.UnsafeExec, []},
#
# Checks scheduled for next check update (opt-in for now, just replace `false` with `[]`)
#
# Controversial and experimental checks (opt-in, just replace `false` with `[]`)
#
{Credo.Check.Readability.StrictModuleLayout, false},
{Credo.Check.Consistency.MultiAliasImportRequireUse, false},
{Credo.Check.Consistency.UnusedVariableNames, false},
{Credo.Check.Design.DuplicatedCode, false},
{Credo.Check.Readability.AliasAs, false},
{Credo.Check.Readability.MultiAlias, false},
{Credo.Check.Readability.Specs, false},
{Credo.Check.Readability.SinglePipe, false},
{Credo.Check.Readability.WithCustomTaggedTuple, false},
{Credo.Check.Refactor.ABCSize, false},
{Credo.Check.Refactor.AppendSingleItem, false},
{Credo.Check.Refactor.DoubleBooleanNegation, false},
{Credo.Check.Refactor.ModuleDependencies, false},
{Credo.Check.Refactor.NegatedIsNil, false},
{Credo.Check.Refactor.PipeChainStart, false},
{Credo.Check.Refactor.VariableRebinding, false},
{Credo.Check.Warning.LeakyEnvironment, false},
{Credo.Check.Warning.MapGetUnsafePass, false},
{Credo.Check.Warning.UnsafeToAtom, false}
#
# Custom checks can be created using `mix credo.gen.check`.
#
]
}
]
}

4
.formatter.exs Normal file
View file

@ -0,0 +1,4 @@
# Used by "mix format"
[
inputs: ["{mix,.formatter}.exs", "{config,lib,test}/**/*.{ex,exs}"]
]

76
.github/CODE_OF_CONDUCT.md vendored Normal file
View file

@ -0,0 +1,76 @@
# Contributor Covenant Code of Conduct
## Our Pledge
In the interest of fostering an open and welcoming environment, we as
contributors and maintainers pledge to making participation in our project and
our community a harassment-free experience for everyone, regardless of age, body
size, disability, ethnicity, sex characteristics, gender identity and expression,
level of experience, education, socio-economic status, nationality, personal
appearance, race, religion, or sexual identity and orientation.
## Our Standards
Examples of behavior that contributes to creating a positive environment
include:
* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members
Examples of unacceptable behavior by participants include:
* The use of sexualized language or imagery and unwelcome sexual attention or
advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic
address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
## Our Responsibilities
Project maintainers are responsible for clarifying the standards of acceptable
behavior and are expected to take appropriate and fair corrective action in
response to any instances of unacceptable behavior.
Project maintainers have the right and responsibility to remove, edit, or
reject comments, commits, code, wiki edits, issues, and other contributions
that are not aligned to this Code of Conduct, or to ban temporarily or
permanently any contributor for other behaviors that they deem inappropriate,
threatening, offensive, or harmful.
## Scope
This Code of Conduct applies both within project spaces and in public spaces
when an individual is representing the project or its community. Examples of
representing a project or community include using an official project e-mail
address, posting via an official social media account, or acting as an appointed
representative at an online or offline event. Representation of a project may be
further defined and clarified by project maintainers.
## Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported by contacting the project team at zach@zachdaniel.dev. All
complaints will be reviewed and investigated and will result in a response that
is deemed necessary and appropriate to the circumstances. The project team is
obligated to maintain confidentiality with regard to the reporter of an incident.
Further details of specific enforcement policies may be posted separately.
Project maintainers who do not follow or enforce the Code of Conduct in good
faith may face temporary or permanent repercussions as determined by other
members of the project's leadership.
## Attribution
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4,
available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html
[homepage]: https://www.contributor-covenant.org
For answers to common questions about this code of conduct, see
https://www.contributor-covenant.org/faq

10
.github/CONTRIBUTING.md vendored Normal file
View file

@ -0,0 +1,10 @@
# Contributing to Ash
* We have a zero tolerance policy for failure to abide by our code of conduct. It is very standard, but please make sure
you have read it.
* Issues may be opened to propose new ideas, to ask questions, or to file bugs.
* Before working on a feature, please talk to the core team/the rest of the community via a proposal. We are
building something that needs to be cohesive and well thought out across all use cases. Our top priority is
supporting real life use cases like yours, but we have to make sure that we do that in a sustainable way. The
best compromise there is to make sure that discussions are centered around the *use case* for a feature, rather
than the propsed feature itself.

27
.github/ISSUE_TEMPLATE/bug_report.md vendored Normal file
View file

@ -0,0 +1,27 @@
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: bug, needs review
assignees: ''
-https://hexdocs.pm/ash_graphql--
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
A minimal set of resource definitions and calls that can reproduce the bug.
**Expected behavior**
A clear and concise description of what you expected to happen.
** Runtime
- Elixir version
- Erlang version
- OS
- Ash version
- any related extension versions
**Additional context**
Add any other context about the problem here.

36
.github/ISSUE_TEMPLATE/proposal.md vendored Normal file
View file

@ -0,0 +1,36 @@
---
name: Proposal
about: Suggest an idea for this project
title: ''
labels: enhancement, needs review
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Express the feature either with a change to resource syntax, or with a change to the resource interface**
For example
```elixir
attributes do
attribute :foo, :integer, bar: 10 # <- Adding `bar` here would cause <x>
end
```
Or
```elixir
Api.read(:resource, bar: 10) # <- Adding `bar` here would cause <x>
```
**Additional context**
Add any other context or screenshots about the feature request here.

4
.github/PULL_REQUEST_TEMPLATE.md vendored Normal file
View file

@ -0,0 +1,4 @@
### Contributor checklist
- [ ] Bug fixes include regression tests
- [ ] Features include unit/acceptance tests

14
.github/workflows/elixir.yml vendored Normal file
View file

@ -0,0 +1,14 @@
name: CI
on:
push:
tags:
- "v*"
branches: [main]
pull_request:
branches: [main]
workflow_call:
jobs:
ash-ci:
uses: ash-project/ash/.github/workflows/ash-ci.yml@main
secrets:
HEX_API_KEY: ${{ secrets.HEX_API_KEY }}

26
.gitignore vendored Normal file
View file

@ -0,0 +1,26 @@
# The directory Mix will write compiled artifacts to.
/_build/
# If you run "mix test --cover", coverage assets end up here.
/cover/
# The directory Mix downloads your dependencies sources to.
/deps/
# Where third-party dependencies like ExDoc output generated docs.
/doc/
# Ignore .fetch files in case you like to edit your project deps locally.
/.fetch
# If the VM crashes, it generates a dump, let's ignore it too.
erl_crash.dump
# Also ignore archive artifacts (built via "mix archive.build").
*.ez
# Ignore package tarball (built via "mix hex.build").
ash_money-*.tar
# Temporary files, for example, from tests.
/tmp/

2
.tool-versions Normal file
View file

@ -0,0 +1,2 @@
erlang 26.0.2
elixir 1.15.4

1
FUNDING.yml Normal file
View file

@ -0,0 +1 @@
github: zachdaniel

21
LICENSE Normal file
View file

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2020 Zachary Scott Daniel
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

3
README.md Normal file
View file

@ -0,0 +1,3 @@
# AshMoney
A money extension for Ash.

View file

@ -0,0 +1,50 @@
# Getting Started With AshMoney
The primary thing that AshMoney provides is `AshMoney.Types.Money`. This is backed by `ex_money`. You can use it out of the box like so:
```elixir
attribute :balance, AshMoney.Types.Money
```
Or you can add it to your compile time list of types for easier reference:
```elixir
config :ash, :custom_types, money: AshMoney.Types.Money
```
Then compile ash again, `mix deps.compile ash --force`, and refer to it like so:
```elixir
attribute :balance, :money
```
## AshPostgres Support
Thanks to `ex_money_sql`, there are excellent tools for lowering support for money into your postgres database. This allows for things like aggregates that sum amounts, and referencing money in expressions:
```elixir
sum :sum_of_usd_balances, :accounts, :balance do
filter expr(fragment("(?).currency_code", balance).currency_code == "USD")
end
```
To install it, add `AshMoney.AshPostgresExtension` to your list of `installed_extensions` in your repo, and generate migrations.
```elixir
defmodule YourRepo do
def installed_extensions do
[..., AshMoney.AshPostgresExtension]
end
end
```
## AshGraphql Support
Add the following to your schema file:
```elixir
object :money do
field(:amount, non_null(:decimal))
field(:currency, non_null(:string))
end
```

8
lib/ash_money.ex Normal file
View file

@ -0,0 +1,8 @@
defmodule AshMoney do
@moduledoc """
`AshMoney` provides a type for working with money in your Ash resources.
It also provides an `AshPostgres.Extension` that can be used to add support for
money types and operators to your Postgres database.
"""
end

View file

@ -0,0 +1,26 @@
if Code.ensure_loaded?(AshPostgres.CustomExtension) do
defmodule AshMoney.AshPostgresExtension do
@moduledoc """
Installs the `money_with_currency` type and operators/functions for Postgres.
"""
use AshPostgres.CustomExtension, name: :ash_money, latest_version: 1
def install(1) do
"""
#{Money.DDL.execute_each(Money.DDL.create_money_with_currency())}
#{Money.DDL.execute_each(Money.DDL.define_plus_operator())}
#{Money.DDL.execute_each(Money.DDL.define_minmax_functions())}
#{Money.DDL.execute_each(Money.DDL.define_sum_function())}
"""
end
def uninstall(1) do
"""
#{Money.DDL.execute_each(Money.DDL.drop_sum_function())}
#{Money.DDL.execute_each(Money.DDL.drop_minmax_functions())}
#{Money.DDL.execute_each(Money.DDL.drop_plus_operator())}
#{Money.DDL.execute_each(Money.DDL.drop_money_with_currency())}
"""
end
end
end

View file

@ -0,0 +1,103 @@
defmodule AshMoney.Types.Money do
@moduledoc """
A money type for Ash that uses the `ex_money` library.
"""
use Ash.Type
@impl Ash.Type
def constraints do
[
storage_type: [
type: :atom,
default: :money_with_currency,
doc: "The storage type for the money value. Can be `:money_with_currency` or `:map`."
]
]
end
@impl true
def cast_in_query?(constraints) do
Keyword.get(constraints, :storage_type, :money_with_currency) == :money_with_currency
end
@impl Ash.Type
def storage_type(constraints) do
if constraints[:items] do
Keyword.get(constraints[:items], :storage_type, :money_with_currency)
else
Keyword.get(constraints, :storage_type, :money_with_currency)
end
end
@impl Ash.Type
def cast_input(nil, _constraints), do: {:ok, nil}
def cast_input({amount, currency}, constraints) do
case Money.new(amount, currency) do
{:error, error} -> {:error, error}
money -> cast_input(money, constraints)
end
end
def cast_input(value, constraints) do
if constraints[:storage_type] == :map do
Money.Ecto.Map.Type.cast(value)
else
Money.Ecto.Composite.Type.cast(value)
end
end
@impl Ash.Type
def cast_stored(nil, _), do: {:ok, nil}
def cast_stored(%Money{} = value, _), do: {:ok, value}
def cast_stored({_amount, _currency} = value, _constraints),
do: Money.Ecto.Composite.Type.load(value)
def cast_stored(value, _constraints) do
Money.Ecto.Map.Type.load(value)
end
@impl Ash.Type
def dump_to_embedded(nil, _constraints), do: {:ok, nil}
def dump_to_embedded(value, _constraints) do
Money.Ecto.Map.Type.dump(value)
end
@impl Ash.Type
def dump_to_native(nil, _constraints), do: {:ok, nil}
def dump_to_native(value, constraints) do
if constraints[:storage_type] == :map do
Money.Ecto.Map.Type.dump(value)
else
Money.Ecto.Composite.Type.dump(value)
end
end
if Code.ensure_loaded?(AshGraphql.Type) do
@behaviour AshGraphql.Type
@spec graphql_type(term()) :: atom()
def graphql_type(_), do: :money
@spec graphql_input_type(term()) :: atom()
def graphql_input_type(_), do: :money_input
end
if Code.ensure_loaded?(AshPostgres.Type) do
@behaviour AshPostgres.Type
@impl AshPostgres.Type
def value_to_postgres_default(__MODULE__, constraints, %Money{
amount: amount,
currency: currency
}) do
if Keyword.get(constraints, :storage_type, :money_with_currency) == :map do
{:ok, ~s[fragment("'{\\"amount\\": #{amount}, \\"currency\\": \\"#{currency}\\"}'")]}
else
{:ok, ~s[fragment("('#{currency}', #{amount})")]}
end
end
end
end

1
logos/.gitkeep Normal file
View file

@ -0,0 +1 @@

27
logos/ascii-art.ans Normal file
View file

@ -0,0 +1,27 @@
                                        (                                      
                                      *(((                                     
                                     (((((((                                   
                                   ((((((((((                                  
                                  (((((((((((((                                
                                ((((((((((((((((/                              
                               (((((((((((((((((((                             
                              ((((((((((((((((((((((                           
                            (##((((((((((((((((((((((                          
                          #(###### ((((((((((((((((((((                        
                        (# ##########(((((((((((((((((((.                      
                       ## ############# ((((((((((((((((((                     
                     ###*#################,((((((((((((((((,                   
                    ######################## ((((((((((((((((                  
                  ######################### ##  (((((((((((((((                
                ,#####(##################.#####/##((((((((((((((               
               ######.################# #########(## (((((((((((((             
             ####### ################ ############ ####*(((((((((((            
            #######.############### ##################### (((((((((((          
          #######################,#*((/,#############.######*(((((((((*        
        .###################### ###((((((( ###########.####### (((((((((       
       ######################.####/((((((((((( ################## (((((((*     
     /##########.##########/###### ((((((((((((((/####### #########/(((((((    
    ########### #########,######## (((((((((((((((((( ################ ((((((  
  ############ ########,##########.(((((((((((((((((((((*%##,############/((((,
 ############ #######(############((((((((((((((((((((((((((  ############# ((((


19
logos/ash-auth-logo.svg Normal file
View file

@ -0,0 +1,19 @@
<svg width="939" height="741" viewBox="0 0 939 741" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M470.482 294L743.966 741H729.078L394.43 418.305L470.482 294Z" fill="#FF5757"/>
<path d="M296.391 741H328.49L500.904 533.333L392.216 428.527L296.391 741Z" fill="#FF914D"/>
<path d="M431.037 741H340.052L432.58 629.553L431.037 741Z" fill="#FFBD59"/>
<path d="M439.934 741H606.641L441.62 619.199L439.934 741Z" fill="#FF5757"/>
<path d="M625.59 741L513.772 545.742L716.263 741H625.59Z" fill="#FF914D"/>
<path d="M610.739 732.969L447.037 612.141L502.967 544.774L610.739 732.969Z" fill="#FFBD59"/>
<path d="M287.086 741H196.999L377.62 445.78L287.086 741Z" fill="#FFBD59"/>
<path d="M470.482 294L766.5 741H729.078L394.43 418.305L470.482 294Z" fill="#FF5757"/>
<path d="M610.739 732.969L447.037 612.141L502.967 544.774L610.739 732.969Z" fill="#FFBD59"/>
<path d="M196.999 725.5L218.5 689L366 448.5H269.5L196.999 725.5Z" fill="#FF5757"/>
<path d="M197 688.5L197 294L260.5 441.5L197 688.5Z" fill="#FFBD59"/>
<path d="M763.305 317.27L763.305 690.5L710.805 510.77L763.305 317.27Z" fill="#FF5757"/>
<path d="M764.5 720L481 294L633.5 294L764.5 720Z" fill="#FFBD59"/>
<path d="M218.5 295L458.5 295L380 427.5L218.5 295Z" fill="#FFBD59"/>
<path d="M205 294L378.56 439.5L270.5 439.5L205 294Z" fill="#FF914D"/>
<path d="M641.439 294L763 294L705 500L641.439 294Z" fill="#FF914D"/>
<path d="M321 251.125V189.375C321 148.432 337.264 109.166 366.215 80.2154C395.166 51.2645 434.432 35 475.375 35C516.318 35 555.584 51.2645 584.535 80.2154C613.486 109.166 629.75 148.432 629.75 189.375V251.125" stroke="#FF5757" stroke-width="70" stroke-linecap="square" stroke-linejoin="round"/>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

View file

@ -0,0 +1,11 @@
<svg width="688" height="925" viewBox="0 0 688 925" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M335.379 0L670.76 548.168H652.5L242.115 152.438L335.379 0Z" fill="#FF5757"/>
<path d="M121.886 548.168H161.251L372.687 293.501L239.399 164.974L121.886 548.168Z" fill="#FF914D"/>
<path d="M287.007 548.168H175.43L288.899 411.498L287.007 548.168Z" fill="#FFBD59"/>
<path d="M297.917 548.168H502.355L299.985 398.8L297.917 548.168Z" fill="#FF5757"/>
<path d="M525.591 548.168L388.467 308.718L636.784 548.168H525.591Z" fill="#FF914D"/>
<path d="M507.38 538.319L306.627 390.144L375.216 307.531L507.38 538.319Z" fill="#FFBD59"/>
<path d="M110.476 548.168H0L221.5 186.132L110.476 548.168Z" fill="#FFBD59"/>
<path d="M23.4496 868.311H57.7361V874.242H23.4496V868.311ZM24.1909 901.763H17.3336V836.897H61.8134V842.828H24.1909V901.763ZM75.974 901.763V836.897H100.252C105.751 836.897 110.477 837.793 114.43 839.584C118.384 841.314 121.411 843.847 123.512 847.183C125.674 850.457 126.755 854.442 126.755 859.137C126.755 863.709 125.674 867.662 123.512 870.998C121.411 874.272 118.384 876.805 114.43 878.597C110.477 880.327 105.751 881.192 100.252 881.192H79.7733L82.8312 878.041V901.763H75.974ZM120.268 901.763L103.588 878.226H111.002L127.774 901.763H120.268ZM82.8312 878.597L79.7733 875.354H100.067C106.554 875.354 111.465 873.933 114.801 871.091C118.199 868.249 119.898 864.265 119.898 859.137C119.898 853.948 118.199 849.932 114.801 847.09C111.465 844.249 106.554 842.828 100.067 842.828H79.7733L82.8312 839.584V878.597ZM132.561 901.763L162.214 836.897H168.979L198.632 901.763H191.404L164.16 840.882H166.94L139.696 901.763H132.561ZM144.237 884.435L146.276 878.875H183.991L186.03 884.435H144.237ZM209.363 901.763V836.897H215.015L244.668 887.493H241.703L271.078 836.897H276.731V901.763H270.152V847.183H271.727L244.668 893.516H241.425L214.181 847.183H215.942V901.763H209.363ZM303.982 865.902H338.268V871.74H303.982V865.902ZM304.723 895.833H343.736V901.763H297.866V836.897H342.346V842.828H304.723V895.833ZM373.684 901.763L351.814 836.897H358.857L379.336 897.964H375.815L396.943 836.897H403.244L424.094 897.964H420.758L441.423 836.897H448.002L426.133 901.763H418.905L398.982 843.847H400.835L380.819 901.763H373.684ZM488.388 902.319C483.507 902.319 478.967 901.516 474.766 899.91C470.627 898.242 467.013 895.925 463.924 892.96C460.897 889.933 458.518 886.443 456.789 882.489C455.121 878.473 454.287 874.087 454.287 869.33C454.287 864.573 455.121 860.218 456.789 856.264C458.518 852.249 460.897 848.758 463.924 845.793C467.013 842.766 470.627 840.449 474.766 838.843C478.905 837.175 483.446 836.341 488.388 836.341C493.268 836.341 497.778 837.175 501.917 838.843C506.056 840.449 509.639 842.735 512.666 845.7C515.755 848.666 518.134 852.156 519.802 856.172C521.531 860.187 522.396 864.573 522.396 869.33C522.396 874.087 521.531 878.473 519.802 882.489C518.134 886.504 515.755 889.995 512.666 892.96C509.639 895.925 506.056 898.242 501.917 899.91C497.778 901.516 493.268 902.319 488.388 902.319ZM488.388 896.203C492.28 896.203 495.863 895.555 499.137 894.257C502.473 892.898 505.346 891.014 507.755 888.605C510.226 886.134 512.141 883.292 513.5 880.08C514.859 876.805 515.539 873.222 515.539 869.33C515.539 865.438 514.859 861.886 513.5 858.674C512.141 855.399 510.226 852.558 507.755 850.148C505.346 847.677 502.473 845.793 499.137 844.496C495.863 843.137 492.28 842.457 488.388 842.457C484.496 842.457 480.882 843.137 477.546 844.496C474.21 845.793 471.306 847.677 468.835 850.148C466.426 852.558 464.511 855.399 463.09 858.674C461.731 861.886 461.051 865.438 461.051 869.33C461.051 873.16 461.731 876.713 463.09 879.987C464.511 883.261 466.426 886.134 468.835 888.605C471.306 891.014 474.21 892.898 477.546 894.257C480.882 895.555 484.496 896.203 488.388 896.203ZM537.766 901.763V836.897H562.045C567.543 836.897 572.269 837.793 576.223 839.584C580.177 841.314 583.204 843.847 585.304 847.183C587.466 850.457 588.548 854.442 588.548 859.137C588.548 863.709 587.466 867.662 585.304 870.998C583.204 874.272 580.177 876.805 576.223 878.597C572.269 880.327 567.543 881.192 562.045 881.192H541.566L544.624 878.041V901.763H537.766ZM582.061 901.763L565.381 878.226H572.794L589.567 901.763H582.061ZM544.624 878.597L541.566 875.354H561.86C568.346 875.354 573.258 873.933 576.594 871.091C579.991 868.249 581.69 864.265 581.69 859.137C581.69 853.948 579.991 849.932 576.594 847.09C573.258 844.249 568.346 842.828 561.86 842.828H541.566L544.624 839.584V878.597ZM610.663 885.64L610.385 877.3L649.675 836.897H657.552L628.918 866.921L625.026 871.091L610.663 885.64ZM604.732 901.763V836.897H611.59V901.763H604.732ZM651.343 901.763L623.358 869.516L627.991 864.512L659.498 901.763H651.343Z" fill="#FF5757"/>
<path d="M18.5379 812L126.612 571.836H170.528L278.945 812H232.284L139.306 595.509H157.147L64.5122 812H18.5379ZM68.2862 756.419L80.2944 721.424H209.983L221.991 756.419H68.2862ZM360.306 814.402C344.981 814.402 330.228 812.457 316.047 808.569C302.094 804.452 291.001 799.534 282.767 793.816L299.235 761.222C307.47 766.483 317.305 770.829 328.741 774.26C340.178 777.691 351.614 779.406 363.05 779.406C376.545 779.406 386.266 777.576 392.213 773.917C398.389 770.257 401.477 765.339 401.477 759.164C401.477 754.132 399.418 750.358 395.301 747.842C391.184 745.097 385.809 743.039 379.176 741.666C372.543 740.294 365.109 739.036 356.875 737.892C348.869 736.748 340.75 735.262 332.515 733.432C324.51 731.373 317.191 728.514 310.557 724.855C303.924 720.966 298.549 715.82 294.432 709.415C290.315 703.011 288.256 694.548 288.256 684.027C288.256 672.362 291.573 662.298 298.206 653.835C304.839 645.143 314.103 638.51 325.997 633.935C338.119 629.132 352.415 626.73 368.883 626.73C381.234 626.73 393.7 628.103 406.28 630.847C418.86 633.592 429.267 637.481 437.501 642.513L421.033 675.106C412.341 669.846 403.535 666.3 394.615 664.47C385.923 662.412 377.232 661.383 368.54 661.383C355.502 661.383 345.782 663.327 339.377 667.215C333.201 671.104 330.114 676.021 330.114 681.968C330.114 687.458 332.172 691.575 336.289 694.319C340.406 697.064 345.782 699.237 352.415 700.838C359.048 702.439 366.367 703.812 374.373 704.955C382.607 705.87 390.727 707.357 398.732 709.415C406.738 711.474 414.057 714.333 420.69 717.993C427.552 721.424 433.041 726.341 437.158 732.746C441.275 739.15 443.334 747.499 443.334 757.791C443.334 769.228 439.903 779.178 433.041 787.64C426.408 796.103 416.916 802.737 404.565 807.54C392.213 812.114 377.46 814.402 360.306 814.402ZM584.224 626.73C598.863 626.73 611.9 629.589 623.337 635.308C635.002 641.026 644.151 649.832 650.784 661.726C657.417 673.391 660.734 688.487 660.734 707.014V812H617.847V712.503C617.847 696.264 613.959 684.141 606.182 676.136C598.634 668.13 587.998 664.127 574.275 664.127C564.211 664.127 555.29 666.186 547.513 670.303C539.737 674.42 533.675 680.596 529.329 688.83C525.212 696.835 523.154 707.014 523.154 719.365V812H480.267V557.426H523.154V678.194L513.89 663.098C520.295 651.433 529.558 642.513 541.681 636.337C554.032 629.932 568.213 626.73 584.224 626.73Z" fill="#FFBD59"/>
</svg>

After

Width:  |  Height:  |  Size: 6.8 KiB

9
logos/ash_logo_black.svg Normal file
View file

@ -0,0 +1,9 @@
<svg width="123" height="100" viewBox="0 0 123 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M61.1819 0L122.364 100H119.033L44.1681 27.8086L61.1819 0Z" fill="black"/>
<path d="M22.2352 100H29.4163L67.9877 53.5421L43.6726 30.0954L22.2352 100Z" fill="black"/>
<path d="M52.3575 100H32.0029L52.7027 75.0678L52.3575 100Z" fill="black"/>
<path d="M54.3478 100H91.6425L54.725 72.7514L54.3478 100Z" fill="black"/>
<path d="M95.8815 100L70.8665 56.3181L116.166 100H95.8815Z" fill="black"/>
<path d="M92.5593 98.2033L55.9368 71.1724L68.4492 56.1016L92.5593 98.2033Z" fill="black"/>
<path d="M20.1537 100H0L40.4074 33.9553L20.1537 100Z" fill="black"/>
</svg>

After

Width:  |  Height:  |  Size: 665 B

View file

@ -0,0 +1,9 @@
<svg width="123" height="100" viewBox="0 0 123 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M61.1819 0L122.364 100H119.033L44.1681 27.8086L61.1819 0Z" fill="#FF5757"/>
<path d="M22.2352 100H29.4163L67.9877 53.5421L43.6726 30.0954L22.2352 100Z" fill="#FF914D"/>
<path d="M52.3575 100H32.0029L52.7027 75.0678L52.3575 100Z" fill="#FFBD59"/>
<path d="M54.3478 100H91.6425L54.725 72.7514L54.3478 100Z" fill="#FF5757"/>
<path d="M95.8815 100L70.8665 56.3181L116.166 100H95.8815Z" fill="#FF914D"/>
<path d="M92.5593 98.2033L55.9368 71.1724L68.4492 56.1016L92.5593 98.2033Z" fill="#FFBD59"/>
<path d="M20.1537 100H0L40.4074 33.9553L20.1537 100Z" fill="#FFBD59"/>
</svg>

After

Width:  |  Height:  |  Size: 679 B

9
logos/ash_logo_pride.svg Normal file
View file

@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="123" height="100" fill="none">
<path fill="#FF5757" d="m61.182 0 61.182 100h-3.331L44.168 27.809 61.182 0Z" style="fill:#e50000;fill-opacity:1"/>
<path fill="#FF914D" d="M22.235 100h7.181l38.572-46.458-24.315-23.447L22.235 100Z" style="fill:#004cff;fill-opacity:1"/>
<path fill="#FFBD59" d="M52.358 100H32.002l20.7-24.932L52.357 100Z" style="fill:#000;fill-opacity:1"/>
<path fill="#FF5757" d="M54.348 100h37.294L54.725 72.751 54.348 100Z" style="fill:#028121;fill-opacity:1"/>
<path fill="#FF914D" d="M95.882 100 70.865 56.318l45.3 43.682H95.882Z" style="fill:#ff8d00;fill-opacity:1"/>
<path fill="#FFBD59" d="m92.56 98.203-36.623-27.03 12.512-15.071 24.11 42.101Z" style="fill:#fe0;fill-opacity:1"/>
<path fill="#FFBD59" d="M20.154 100H0l40.407-66.045L20.154 100Z" style="fill:#708;fill-opacity:1"/>
</svg>

After

Width:  |  Height:  |  Size: 884 B

9
logos/ash_logo_trans.svg Normal file
View file

@ -0,0 +1,9 @@
<svg xmlns="http://www.w3.org/2000/svg" width="123" height="100" fill="none">
<path fill="#FF5757" d="m61.182 0 61.182 100h-3.331L44.168 27.809 61.182 0Z" style="fill:#5bcefa;fill-opacity:1"/>
<path fill="#FF914D" d="M22.235 100h7.181l38.572-46.458-24.315-23.447L22.235 100Z" style="fill:#f5a9b8;fill-opacity:1"/>
<path fill="#FFBD59" d="M52.358 100H32.002l20.7-24.932L52.357 100Z" style="fill:#fff;fill-opacity:1"/>
<path fill="#FF5757" d="M54.348 100h37.294L54.725 72.751 54.348 100Z" style="fill:#5bcefa;fill-opacity:1"/>
<path fill="#FF914D" d="M95.882 100 70.865 56.318l45.3 43.682H95.882Z" style="fill:#f5a9b8;fill-opacity:1"/>
<path fill="#FFBD59" d="m92.56 98.203-36.623-27.03 12.512-15.071 24.11 42.101Z" style="fill:#fff;fill-opacity:1"/>
<path fill="#FFBD59" d="M20.154 100H0l40.407-66.045L20.154 100Z" style="fill:#5bcefa;fill-opacity:1"/>
</svg>

After

Width:  |  Height:  |  Size: 887 B

9
logos/ash_logo_white.svg Normal file
View file

@ -0,0 +1,9 @@
<svg width="123" height="100" viewBox="0 0 123 100" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M61.1819 0L122.364 100H119.033L44.1681 27.8086L61.1819 0Z" fill="white"/>
<path d="M22.2352 100H29.4163L67.9877 53.5421L43.6726 30.0954L22.2352 100Z" fill="white"/>
<path d="M52.3575 100H32.0029L52.7027 75.0678L52.3575 100Z" fill="white"/>
<path d="M54.3478 100H91.6425L54.725 72.7514L54.3478 100Z" fill="white"/>
<path d="M95.8815 100L70.8665 56.3181L116.166 100H95.8815Z" fill="white"/>
<path d="M92.5593 98.2033L55.9368 71.1724L68.4492 56.1016L92.5593 98.2033Z" fill="white"/>
<path d="M20.1537 100H0L40.4074 33.9553L20.1537 100Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 665 B

BIN
logos/ashley.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 228 KiB

44
logos/ashley.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 721 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
logos/logo-black-text.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
logos/logo-only.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

BIN
logos/logo-white-text.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

BIN
logos/small-logo.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3 KiB

178
mix.exs Normal file
View file

@ -0,0 +1,178 @@
defmodule AshMoney.MixProject do
use Mix.Project
@version "0.1.0"
@description """
Money extension for Ash.
"""
def project do
[
app: :ash_money,
version: @version,
elixir: "~> 1.15",
start_permanent: Mix.env() == :prod,
deps: deps(),
aliases: aliases(),
package: package(),
elixirc_paths: elixirc_paths(Mix.env()),
dialyzer: [plt_add_apps: [:ash]],
test_coverage: [tool: ExCoveralls],
preferred_cli_env: [
coveralls: :test,
"coveralls.github": :test
],
docs: docs(),
description: @description,
source_url: "https://github.com/ash-project/ash_money",
homepage_url: "https://github.com/ash-project/ash_money"
]
end
# Run "mix help compile.app" to learn about applications.
def application do
[
extra_applications: [:logger]
]
end
defp package do
[
name: :ash_money,
licenses: ["MIT"],
files: ~w(lib .formatter.exs mix.exs README* LICENSE*
CHANGELOG* documentation),
links: %{
GitHub: "https://github.com/ash-project/ash_money"
}
]
end
defp elixirc_paths(:test) do
elixirc_paths(:dev) ++ ["test/support"]
end
defp elixirc_paths(_) do
["lib"]
end
defp extras() do
"documentation/**/*.{md,livemd,cheatmd}"
|> Path.wildcard()
|> Enum.map(fn path ->
title =
path
|> Path.basename(".md")
|> Path.basename(".livemd")
|> Path.basename(".cheatmd")
|> String.split(~r/[-_]/)
|> Enum.map_join(" ", &capitalize/1)
|> case do
"F A Q" ->
"FAQ"
other ->
other
end
{String.to_atom(path),
[
title: title
]}
end)
end
defp capitalize(string) do
string
|> String.split(" ")
|> Enum.map(fn string ->
[hd | tail] = String.graphemes(string)
String.capitalize(hd) <> Enum.join(tail)
end)
end
defp groups_for_extras() do
[
Tutorials: [
~r'documentation/tutorials'
],
"How To": ~r'documentation/how_to',
Topics: ~r'documentation/topics',
DSLs: ~r'documentation/dsls'
]
end
defp docs do
[
main: "get-started-with-ash-money",
source_ref: "v#{@version}",
logo: "logos/small-logo.png",
extra_section: "GUIDES",
before_closing_head_tag: fn type ->
if type == :html do
"""
<script>
if (location.hostname === "hexdocs.pm") {
var script = document.createElement("script");
script.src = "https://plausible.io/js/script.js";
script.setAttribute("defer", "defer")
script.setAttribute("data-domain", "ashhexdocs")
document.head.appendChild(script);
}
</script>
"""
end
end,
extras: extras(),
groups_for_extras: groups_for_extras(),
groups_for_modules: [
AshMoney: [
AshMoney,
AshMoney.Types.Money
],
AshPostgres: [
AshMoney.AshPostgresExtension
],
Internals: ~r/.*/
]
]
end
# Run "mix help deps" to learn about dependencies.
defp deps do
[
{:ash, ash_version("~> 2.0")},
{:ex_money, "~> 5.15"},
{:ex_money_sql, "~> 1.0", optional: true},
{:ex_doc, github: "elixir-lang/ex_doc", only: [:dev, :test], runtime: false},
{:ex_check, "~> 0.12", only: [:dev, :test]},
{:credo, ">= 0.0.0", only: [:dev, :test], runtime: false},
{:dialyxir, ">= 0.0.0", only: [:dev, :test], runtime: false},
{:sobelow, ">= 0.0.0", only: [:dev, :test], runtime: false},
{:git_ops, "~> 2.5", only: [:dev, :test]},
{:excoveralls, "~> 0.13", only: [:dev, :test]},
{:mix_test_watch, "~> 1.0", only: :dev, runtime: false}
]
end
defp aliases do
[
sobelow: "sobelow --skip",
credo: "credo --strict",
docs: [
"docs",
"spark.replace_doc_links"
]
]
end
defp ash_version(default_version) do
case System.get_env("ASH_VERSION") do
nil -> default_version
"local" -> [path: "../ash"]
"main" -> [git: "https://github.com/ash-project/ash.git"]
version -> "~> #{version}"
end
end
end

44
mix.lock Normal file
View file

@ -0,0 +1,44 @@
%{
"ash": {:hex, :ash, "2.17.4", "b672ab9bcd7351e9adb3bf332655b6c777bab6c45e7cb88b3a89117f6a200837", [:mix], [{:comparable, "~> 1.0", [hex: :comparable, repo: "hexpm", optional: false]}, {:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:ecto, "~> 3.7", [hex: :ecto, repo: "hexpm", optional: false]}, {:ets, "~> 0.8", [hex: :ets, repo: "hexpm", optional: false]}, {:jason, ">= 1.0.0", [hex: :jason, repo: "hexpm", optional: false]}, {:picosat_elixir, "~> 0.2", [hex: :picosat_elixir, repo: "hexpm", optional: false]}, {:plug, ">= 0.0.0", [hex: :plug, repo: "hexpm", optional: true]}, {:spark, ">= 1.1.50 and < 2.0.0-0", [hex: :spark, repo: "hexpm", optional: false]}, {:stream_data, "~> 0.6", [hex: :stream_data, repo: "hexpm", optional: false]}, {:telemetry, "~> 1.1", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "941d9edf1ba3511e3a3c40711de168ee476197fa0615f15b16548178e1d50e97"},
"bunt": {:hex, :bunt, "0.2.1", "e2d4792f7bc0ced7583ab54922808919518d0e57ee162901a16a1b6664ef3b14", [:mix], [], "hexpm", "a330bfb4245239787b15005e66ae6845c9cd524a288f0d141c148b02603777a5"},
"cldr_utils": {:hex, :cldr_utils, "2.24.2", "364fa30be55d328e704629568d431eb74cd2f085752b27f8025520b566352859", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:certifi, "~> 2.5", [hex: :certifi, repo: "hexpm", optional: true]}, {:decimal, "~> 1.9 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}], "hexpm", "3362b838836a9f0fa309de09a7127e36e67310e797d556db92f71b548832c7cf"},
"comparable": {:hex, :comparable, "1.0.0", "bb669e91cedd14ae9937053e5bcbc3c52bb2f22422611f43b6e38367d94a495f", [:mix], [{:typable, "~> 0.1", [hex: :typable, repo: "hexpm", optional: false]}], "hexpm", "277c11eeb1cd726e7cd41c6c199e7e52fa16ee6830b45ad4cdc62e51f62eb60c"},
"credo": {:hex, :credo, "1.7.1", "6e26bbcc9e22eefbff7e43188e69924e78818e2fe6282487d0703652bc20fd62", [:mix], [{:bunt, "~> 0.2.1", [hex: :bunt, repo: "hexpm", optional: false]}, {:file_system, "~> 0.2.8", [hex: :file_system, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "e9871c6095a4c0381c89b6aa98bc6260a8ba6addccf7f6a53da8849c748a58a2"},
"db_connection": {:hex, :db_connection, "2.6.0", "77d835c472b5b67fc4f29556dee74bf511bbafecdcaf98c27d27fa5918152086", [:mix], [{:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "c2f992d15725e721ec7fbc1189d4ecdb8afef76648c746a8e1cad35e3b8a35f3"},
"decimal": {:hex, :decimal, "2.1.1", "5611dca5d4b2c3dd497dec8f68751f1f1a54755e8ed2a966c2633cf885973ad6", [:mix], [], "hexpm", "53cfe5f497ed0e7771ae1a475575603d77425099ba5faef9394932b35020ffcc"},
"dialyxir": {:hex, :dialyxir, "1.4.2", "764a6e8e7a354f0ba95d58418178d486065ead1f69ad89782817c296d0d746a5", [:mix], [{:erlex, ">= 0.2.6", [hex: :erlex, repo: "hexpm", optional: false]}], "hexpm", "516603d8067b2fd585319e4b13d3674ad4f314a5902ba8130cd97dc902ce6bbd"},
"digital_token": {:hex, :digital_token, "0.6.0", "13e6de581f0b1f6c686f7c7d12ab11a84a7b22fa79adeb4b50eec1a2d278d258", [:mix], [{:cldr_utils, "~> 2.17", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "2455d626e7c61a128b02a4a8caddb092548c3eb613ac6f6a85e4cbb6caddc4d1"},
"earmark": {:hex, :earmark, "1.4.46", "8c7287bd3137e99d26ae4643e5b7ef2129a260e3dcf41f251750cb4563c8fb81", [:mix], [], "hexpm", "798d86db3d79964e759ddc0c077d5eb254968ed426399fbf5a62de2b5ff8910a"},
"earmark_parser": {:hex, :earmark_parser, "1.4.39", "424642f8335b05bb9eb611aa1564c148a8ee35c9c8a8bba6e129d51a3e3c6769", [:mix], [], "hexpm", "06553a88d1f1846da9ef066b87b57c6f605552cfbe40d20bd8d59cc6bde41944"},
"ecto": {:hex, :ecto, "3.11.0", "ff8614b4e70a774f9d39af809c426def80852048440e8785d93a6e91f48fec00", [:mix], [{:decimal, "~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "7769dad267ef967310d6e988e92d772659b11b09a0c015f101ce0fff81ce1f81"},
"ecto_sql": {:hex, :ecto_sql, "3.11.0", "c787b24b224942b69c9ff7ab9107f258ecdc68326be04815c6cce2941b6fad1c", [:mix], [{:db_connection, "~> 2.4.1 or ~> 2.5", [hex: :db_connection, repo: "hexpm", optional: false]}, {:ecto, "~> 3.11.0", [hex: :ecto, repo: "hexpm", optional: false]}, {:myxql, "~> 0.6.0", [hex: :myxql, repo: "hexpm", optional: true]}, {:postgrex, "~> 0.16.0 or ~> 0.17.0 or ~> 1.0", [hex: :postgrex, repo: "hexpm", optional: true]}, {:tds, "~> 2.1.1 or ~> 2.2", [hex: :tds, repo: "hexpm", optional: true]}, {:telemetry, "~> 0.4.0 or ~> 1.0", [hex: :telemetry, repo: "hexpm", optional: false]}], "hexpm", "77aa3677169f55c2714dda7352d563002d180eb33c0dc29cd36d39c0a1a971f5"},
"elixir_make": {:hex, :elixir_make, "0.7.7", "7128c60c2476019ed978210c245badf08b03dbec4f24d05790ef791da11aa17c", [:mix], [{:castore, "~> 0.1 or ~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}], "hexpm", "5bc19fff950fad52bbe5f211b12db9ec82c6b34a9647da0c2224b8b8464c7e6c"},
"erlex": {:hex, :erlex, "0.2.6", "c7987d15e899c7a2f34f5420d2a2ea0d659682c06ac607572df55a43753aa12e", [:mix], [], "hexpm", "2ed2e25711feb44d52b17d2780eabf998452f6efda104877a3881c2f8c0c0c75"},
"ets": {:hex, :ets, "0.9.0", "79c6a6c205436780486f72d84230c6cba2f8a9920456750ddd1e47389107d5fd", [:mix], [], "hexpm", "2861fdfb04bcaeff370f1a5904eec864f0a56dcfebe5921ea9aadf2a481c822b"},
"ex_check": {:hex, :ex_check, "0.15.0", "074b94c02de11c37bba1ca82ae5cc4926e6ccee862e57a485b6ba60fca2d8dc1", [:mix], [], "hexpm", "33848031a0c7e4209c3b4369ce154019788b5219956220c35ca5474299fb6a0e"},
"ex_cldr": {:hex, :ex_cldr, "2.37.5", "9da6d97334035b961d2c2de167dc6af8cd3e09859301a5b8f49f90bd8b034593", [:mix], [{:cldr_utils, "~> 2.21", [hex: :cldr_utils, repo: "hexpm", optional: false]}, {:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:gettext, "~> 0.19", [hex: :gettext, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: true]}], "hexpm", "74ad5ddff791112ce4156382e171a5f5d3766af9d5c4675e0571f081fe136479"},
"ex_cldr_currencies": {:hex, :ex_cldr_currencies, "2.15.1", "e92ba17c41e7405b7784e0e65f406b5f17cfe313e0e70de9befd653e12854822", [:mix], [{:ex_cldr, "~> 2.34", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "31df8bd37688340f8819bdd770eb17d659652078d34db632b85d4a32864d6a25"},
"ex_cldr_numbers": {:hex, :ex_cldr_numbers, "2.32.3", "b631ff94c982ec518e46bf4736000a30a33d6b58facc085d5f240305f512ad4a", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:digital_token, "~> 0.3 or ~> 1.0", [hex: :digital_token, repo: "hexpm", optional: false]}, {:ex_cldr, "~> 2.37", [hex: :ex_cldr, repo: "hexpm", optional: false]}, {:ex_cldr_currencies, ">= 2.14.2", [hex: :ex_cldr_currencies, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}], "hexpm", "7b626ff1e59a0ec9c3c5db5ce9ca91a6995e2ab56426b71f3cbf67181ea225f5"},
"ex_doc": {:git, "https://github.com/elixir-lang/ex_doc.git", "ae05a4f0791ce5463e28595ff39407b45d2b8b5c", []},
"ex_money": {:hex, :ex_money, "5.15.2", "660139ab73313c2c9ca9b7b4496bbee62e6b0ba87780d2a9af135e0e8a2c6feb", [:mix], [{:decimal, "~> 1.6 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:ex_cldr_numbers, "~> 2.31", [hex: :ex_cldr_numbers, repo: "hexpm", optional: false]}, {:gringotts, "~> 1.1", [hex: :gringotts, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:nimble_parsec, "~> 0.5 or ~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}, {:phoenix_html, "~> 2.0 or ~> 3.0", [hex: :phoenix_html, repo: "hexpm", optional: true]}, {:poison, "~> 3.0 or ~> 4.0 or ~> 5.0", [hex: :poison, repo: "hexpm", optional: true]}], "hexpm", "59b96d83afa69070c595c9afd78ed0802e211c8741a5644e05ee44567f480845"},
"ex_money_sql": {:hex, :ex_money_sql, "1.10.1", "5c0981b29de1e6cd4ef06b5480ceb08525620d9b4939caa52eb1a0deefc7c71a", [:mix], [{:ecto, "~> 3.5", [hex: :ecto, repo: "hexpm", optional: false]}, {:ecto_sql, "~> 3.0", [hex: :ecto_sql, repo: "hexpm", optional: false]}, {:ex_money, "~> 5.7", [hex: :ex_money, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}, {:postgrex, "~> 0.15", [hex: :postgrex, repo: "hexpm", optional: false]}], "hexpm", "75439d10272369a38fc52bb1dc251982d65aca77a0f3ce422e8927f782df43f9"},
"excoveralls": {:hex, :excoveralls, "0.18.0", "b92497e69465dc51bc37a6422226ee690ab437e4c06877e836f1c18daeb35da9", [:mix], [{:castore, "~> 1.0", [hex: :castore, repo: "hexpm", optional: true]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1109bb911f3cb583401760be49c02cbbd16aed66ea9509fc5479335d284da60b"},
"file_system": {:hex, :file_system, "0.2.10", "fb082005a9cd1711c05b5248710f8826b02d7d1784e7c3451f9c1231d4fc162d", [:mix], [], "hexpm", "41195edbfb562a593726eda3b3e8b103a309b733ad25f3d642ba49696bf715dc"},
"git_cli": {:hex, :git_cli, "0.3.0", "a5422f9b95c99483385b976f5d43f7e8233283a47cda13533d7c16131cb14df5", [:mix], [], "hexpm", "78cb952f4c86a41f4d3511f1d3ecb28edb268e3a7df278de2faa1bd4672eaf9b"},
"git_ops": {:hex, :git_ops, "2.6.0", "e0791ee1cf5db03f2c61b7ebd70e2e95cba2bb9b9793011f26609f22c0900087", [:mix], [{:git_cli, "~> 0.2", [hex: :git_cli, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "b98fca849b18aaf490f4ac7d1dd8c6c469b0cc3e6632562d366cab095e666ffe"},
"jason": {:hex, :jason, "1.4.1", "af1504e35f629ddcdd6addb3513c3853991f694921b1b9368b0bd32beb9f1b63", [:mix], [{:decimal, "~> 1.0 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "fbb01ecdfd565b56261302f7e1fcc27c4fb8f32d56eab74db621fc154604a7a1"},
"makeup": {:hex, :makeup, "1.1.1", "fa0bc768698053b2b3869fa8a62616501ff9d11a562f3ce39580d60860c3a55e", [:mix], [{:nimble_parsec, "~> 1.2.2 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "5dc62fbdd0de44de194898b6710692490be74baa02d9d108bc29f007783b0b48"},
"makeup_elixir": {:hex, :makeup_elixir, "0.16.1", "cc9e3ca312f1cfeccc572b37a09980287e243648108384b97ff2b76e505c3555", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}, {:nimble_parsec, "~> 1.2.3 or ~> 1.3", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "e127a341ad1b209bd80f7bd1620a15693a9908ed780c3b763bccf7d200c767c6"},
"makeup_erlang": {:hex, :makeup_erlang, "0.1.2", "ad87296a092a46e03b7e9b0be7631ddcf64c790fa68a9ef5323b6cbb36affc72", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "f3f5a1ca93ce6e092d92b6d9c049bcda58a3b617a8d888f8e7231c85630e8108"},
"mix_test_watch": {:hex, :mix_test_watch, "1.1.1", "eee6fc570d77ad6851c7bc08de420a47fd1e449ef5ccfa6a77ef68b72e7e51ad", [:mix], [{:file_system, "~> 0.2.1 or ~> 0.3", [hex: :file_system, repo: "hexpm", optional: false]}], "hexpm", "f82262b54dee533467021723892e15c3267349849f1f737526523ecba4e6baae"},
"nimble_options": {:hex, :nimble_options, "1.0.2", "92098a74df0072ff37d0c12ace58574d26880e522c22801437151a159392270e", [:mix], [], "hexpm", "fd12a8db2021036ce12a309f26f564ec367373265b53e25403f0ee697380f1b8"},
"nimble_parsec": {:hex, :nimble_parsec, "1.4.0", "51f9b613ea62cfa97b25ccc2c1b4216e81df970acd8e16e8d1bdc58fef21370d", [:mix], [], "hexpm", "9c565862810fb383e9838c1dd2d7d2c437b3d13b267414ba6af33e50d2d1cf28"},
"picosat_elixir": {:hex, :picosat_elixir, "0.2.3", "bf326d0f179fbb3b706bb2c15fbc367dacfa2517157d090fdfc32edae004c597", [:make, :mix], [{:elixir_make, "~> 0.6", [hex: :elixir_make, repo: "hexpm", optional: false]}], "hexpm", "f76c9db2dec9d2561ffaa9be35f65403d53e984e8cd99c832383b7ab78c16c66"},
"postgrex": {:hex, :postgrex, "0.17.3", "c92cda8de2033a7585dae8c61b1d420a1a1322421df84da9a82a6764580c503d", [:mix], [{:db_connection, "~> 2.1", [hex: :db_connection, repo: "hexpm", optional: false]}, {:decimal, "~> 1.5 or ~> 2.0", [hex: :decimal, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: true]}, {:table, "~> 0.1.0", [hex: :table, repo: "hexpm", optional: true]}], "hexpm", "946cf46935a4fdca7a81448be76ba3503cff082df42c6ec1ff16a4bdfbfb098d"},
"sobelow": {:hex, :sobelow, "0.13.0", "218afe9075904793f5c64b8837cc356e493d88fddde126a463839351870b8d1e", [:mix], [{:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "cd6e9026b85fc35d7529da14f95e85a078d9dd1907a9097b3ba6ac7ebbe34a0d"},
"sourceror": {:hex, :sourceror, "0.14.1", "c6fb848d55bd34362880da671debc56e77fd722fa13b4dcbeac89a8998fc8b09", [:mix], [], "hexpm", "8b488a219e4c4d7d9ff29d16346fd4a5858085ccdd010e509101e226bbfd8efc"},
"spark": {:hex, :spark, "1.1.51", "8458de5abbb89d18dd5c9235dd39e3757076eba84a5078d1cdc2c1e23c39aa95", [:mix], [{:jason, "~> 1.4", [hex: :jason, repo: "hexpm", optional: false]}, {:nimble_options, "~> 0.5 or ~> 1.0", [hex: :nimble_options, repo: "hexpm", optional: false]}, {:sourceror, "~> 0.1", [hex: :sourceror, repo: "hexpm", optional: false]}], "hexpm", "ed8410aa8db08867b8fff3d65e54deeb7f6f6cf2b8698fc405a386c1c7a9e4f0"},
"stream_data": {:hex, :stream_data, "0.6.0", "e87a9a79d7ec23d10ff83eb025141ef4915eeb09d4491f79e52f2562b73e5f47", [:mix], [], "hexpm", "b92b5031b650ca480ced047578f1d57ea6dd563f5b57464ad274718c9c29501c"},
"telemetry": {:hex, :telemetry, "1.2.1", "68fdfe8d8f05a8428483a97d7aab2f268aaff24b49e0f599faa091f1d4e7f61c", [:rebar3], [], "hexpm", "dad9ce9d8effc621708f99eac538ef1cbe05d6a874dd741de2e689c47feafed5"},
"typable": {:hex, :typable, "0.3.0", "0431e121d124cd26f312123e313d2689b9a5322b15add65d424c07779eaa3ca1", [:mix], [], "hexpm", "880a0797752da1a4c508ac48f94711e04c86156f498065a83d160eef945858f8"},
}

4
test/ash_money_test.exs Normal file
View file

@ -0,0 +1,4 @@
defmodule AshMoneyTest do
use ExUnit.Case
doctest AshMoney
end

1
test/test_helper.exs Normal file
View file

@ -0,0 +1 @@
ExUnit.start()