Skip to content

Commit d419998

Browse files
committed
Sets up spec to generate files using Elixir
This adds necessary dependencies to the Spec package to begin generating the language specs in Elixir using Liquid.
1 parent 7e358f5 commit d419998

File tree

7 files changed

+215
-17
lines changed

7 files changed

+215
-17
lines changed

bin/setup

+36-15
Original file line numberDiff line numberDiff line change
@@ -18,47 +18,68 @@ export OQ_VERSION="1.0.2"
1818

1919
# Setup ASDF version manager and install deps
2020
setup_asdf() {
21-
_info_banner "[ASDF] Setting up"
21+
local prefix="[ASDF]"
22+
23+
_info_banner "${prefix} Setting up"
2224

2325
# Version manager for multiple languages
2426
_prompt_for_command_install "asdf"
2527

2628
_info_message "Installing/Updating ASDF dependencies"
27-
(asdf install && _success_message "Success - ASDF dependencies up to date") || \
28-
_error_message "Failed to update ASDF dependencies"
29+
(asdf install && _success_message "${prefix} Success: dependencies up to date") || \
30+
_error_message "${prefix} Failed to update dependencies"
31+
}
32+
33+
# Setup Ruby dependencies (used for Danger and generating templated specs)
34+
setup_ruby() {
35+
local prefix="[Ruby]"
36+
37+
_info_banner "${prefix} Setting up"
38+
39+
_info_message "${prefix} Installing/Updating RubyGems"
40+
(bundle install && _success_message "${prefix} Success: RubyGems up to date") || \
41+
_error_message "${prefix} Failed to update RubyGems"
2942
}
3043

44+
_elixir_update() {
45+
local subpath="${1?}"
46+
local prefix="[${subpath}]"
3147

32-
# Setup dependencies for Elixir
33-
setup_elixir() {
34-
_info_banner "[Elixir] Setting up"
35-
pushd statifier-ex 1>/dev/null
48+
_info_banner "${prefix} Updating Elixir dependencies"
3649

50+
pushd "${subpath}" 1>/dev/null
3751
# shellcheck disable=SC1010
3852
mix do deps.get, compile
39-
4053
popd 1>/dev/null
41-
_success_message "[Elixir] All up to date!"
54+
55+
_success_message "${prefix} Success: Elixir dependencies up to date"
56+
}
57+
58+
# Setup dependencies for statifier-ex
59+
setup_statifier_ex() {
60+
_elixir_update statifier-ex
4261
}
4362

4463
# Setup dependencies for Spec
4564
setup_spec() {
46-
_info_banner "[Spec] Setting up"
65+
_elixir_update spec
4766

48-
# Working with YAML, XML and JSON files
49-
_prompt_for_oq_install
50-
51-
_success_message "[Spec] All up to date!"
67+
# # Working with YAML, XML and JSON files
68+
# _prompt_for_oq_install
5269
}
5370

5471

5572
# Setup entire project. First global dependencies, then each package.
5673
setup_project() {
5774
_info_banner "Setting up Statifier"
5875

76+
# Global Setup
5977
setup_asdf
78+
setup_ruby
79+
80+
# Package specific
6081
setup_spec
61-
setup_elixir
82+
setup_statifier_ex
6283

6384
_success_banner "Project successfully setup"
6485
}

bin/spec

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
#!/usr/bin/env bash
2+
3+
set -u # raise an error on use of uninitialized variable
4+
set -e # exit after the first error
5+
6+
# Wrapper around using the spec/Makefile using make v4
7+
8+
trap "popd 1>/dev/null" EXIT
9+
pushd "spec" 1> /dev/null
10+
11+
gmake "$@"

spec/Makefile

+17-2
Original file line numberDiff line numberDiff line change
@@ -18,13 +18,28 @@ endif
1818
.DEFAULT_GOAL := help
1919

2020
help: ## Displays help message describing each task
21-
> @foo="bar"
2221
> @printf "\n%s\n\n" "Statifier Spec Make Tasks"
2322
> @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-${HELP_TASK_WIDTH}s\033[0m %s\n", $$1, $$2}'
24-
> @printf "\n%s" "${foo}"
2523
# Don't look for this on the filesystem
2624
.PHONY: help
2725

26+
generate: generated/.elixir ## Generate all specs
27+
> @echo "Done!"
28+
# Don't look for this on the filesystem
29+
.PHONY: generate
30+
31+
generated/.elixir: generated/
32+
> @mix run generate.exs elixir $@
33+
34+
generated/:
35+
> @mkdir -p generated
36+
37+
# w3c/.manifest: w3c/manifest.xml w3c_manifest.exs
38+
# > @mix run w3c_manifest.exs w3c/manifest.xml $@ $(W3C_SUITE)
39+
40+
clean: ## Cleanup (remove) all generated files.
41+
> @rm -rf generated
42+
2843
collect: $(shell find . -type d | grep '[0-9][0-9][0-9]' | awk '{printf $1 "/all.yml"}') ## Collect all sub specs into the **/*__all.yml file
2944
> @echo
3045
> @echo "hi"

spec/generate.exs

+12
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
defmodule SpecGenerator do
2+
def process(language, touchfile) do
3+
full_touchfile = Path.expand(touchfile, ".")
4+
5+
IO.puts("Hi from Elixir: #{language} #{full_touchfile}")
6+
7+
File.touch!(full_touchfile)
8+
end
9+
end
10+
11+
[language, touchfile] = System.argv()
12+
SpecGenerator.process(language, touchfile)

spec/mix.exs

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
defmodule Statifier.MixProject do
2+
use Mix.Project
3+
4+
def project do
5+
[
6+
app: :statifier_spec,
7+
version: "0.1.0",
8+
elixir: "~> 1.8",
9+
start_permanent: Mix.env() == :prod,
10+
docs: [extras: ["README.md"]],
11+
description: description(),
12+
# package: package(),
13+
deps: deps()
14+
]
15+
end
16+
17+
def description, do: "Statifier Spec Generator"
18+
19+
# def package do
20+
# [
21+
# name: :statifier_spec,
22+
# maintainers: ["JohnnyT"],
23+
# licenses: ["MIT"],
24+
# docs: [extras: ["README.md"]],
25+
# links: %{"GitHub" => "https://github.com/riddler/statifier-ex"}
26+
# ]
27+
# end
28+
29+
# # Run "mix help compile.app" to learn about applications.
30+
# def application do
31+
# [
32+
# extra_applications: [:logger]
33+
# ]
34+
# end
35+
36+
# Run "mix help deps" to learn about dependencies.
37+
defp deps do
38+
[
39+
{:credo, "~> 1.4", only: [:dev, :test], runtime: false},
40+
{:ex_doc, ">= 0.0.0", only: :dev},
41+
{:liquid, "~> 0.9"},
42+
{:yaml_elixir, "~> 2.4"}
43+
]
44+
end
45+
end

spec/mix.lock

+25
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
%{
2+
"bunt": {:hex, :bunt, "0.2.0", "951c6e801e8b1d2cbe58ebbd3e616a869061ddadcc4863d0a2182541acae9a38", [:mix], [], "hexpm", "7af5c7e09fe1d40f76c8e4f9dd2be7cebd83909f31fee7cd0e9eadc567da8353"},
3+
"certifi": {:hex, :certifi, "2.5.1", "867ce347f7c7d78563450a18a6a28a8090331e77fa02380b4a21962a65d36ee5", [:rebar3], [{:parse_trans, "~>3.3", [hex: :parse_trans, repo: "hexpm", optional: false]}], "hexpm", "805abd97539caf89ec6d4732c91e62ba9da0cda51ac462380bbd28ee697a8c42"},
4+
"combine": {:hex, :combine, "0.10.0", "eff8224eeb56498a2af13011d142c5e7997a80c8f5b97c499f84c841032e429f", [:mix], [], "hexpm", "1b1dbc1790073076580d0d1d64e42eae2366583e7aecd455d1215b0d16f2451b"},
5+
"credo": {:hex, :credo, "1.4.0", "92339d4cbadd1e88b5ee43d427b639b68a11071b6f73854e33638e30a0ea11f5", [:mix], [{:bunt, "~> 0.2.0", [hex: :bunt, repo: "hexpm", optional: false]}, {:jason, "~> 1.0", [hex: :jason, repo: "hexpm", optional: false]}], "hexpm", "1fd3b70dce216574ce3c18bdf510b57e7c4c85c2ec9cad4bff854abaf7e58658"},
6+
"earmark": {:hex, :earmark, "1.4.3", "364ca2e9710f6bff494117dbbd53880d84bebb692dafc3a78eb50aa3183f2bfd", [:mix], [], "hexpm", "8cf8a291ebf1c7b9539e3cddb19e9cef066c2441b1640f13c34c1d3cfc825fec"},
7+
"ex_doc": {:hex, :ex_doc, "0.21.3", "857ec876b35a587c5d9148a2512e952e24c24345552259464b98bfbb883c7b42", [:mix], [{:earmark, "~> 1.4", [hex: :earmark, repo: "hexpm", optional: false]}, {:makeup_elixir, "~> 0.14", [hex: :makeup_elixir, repo: "hexpm", optional: false]}], "hexpm", "0db1ee8d1547ab4877c5b5dffc6604ef9454e189928d5ba8967d4a58a801f161"},
8+
"gettext": {:hex, :gettext, "0.17.4", "f13088e1ec10ce01665cf25f5ff779e7df3f2dc71b37084976cf89d1aa124d5c", [:mix], [], "hexpm", "3c75b5ea8288e2ee7ea503ff9e30dfe4d07ad3c054576a6e60040e79a801e14d"},
9+
"hackney": {:hex, :hackney, "1.15.2", "07e33c794f8f8964ee86cebec1a8ed88db5070e52e904b8f12209773c1036085", [:rebar3], [{:certifi, "2.5.1", [hex: :certifi, repo: "hexpm", optional: false]}, {:idna, "6.0.0", [hex: :idna, repo: "hexpm", optional: false]}, {:metrics, "1.0.1", [hex: :metrics, repo: "hexpm", optional: false]}, {:mimerl, "~>1.1", [hex: :mimerl, repo: "hexpm", optional: false]}, {:ssl_verify_fun, "1.1.5", [hex: :ssl_verify_fun, repo: "hexpm", optional: false]}], "hexpm", "e0100f8ef7d1124222c11ad362c857d3df7cb5f4204054f9f0f4a728666591fc"},
10+
"idna": {:hex, :idna, "6.0.0", "689c46cbcdf3524c44d5f3dde8001f364cd7608a99556d8fbd8239a5798d4c10", [:rebar3], [{:unicode_util_compat, "0.4.1", [hex: :unicode_util_compat, repo: "hexpm", optional: false]}], "hexpm", "4bdd305eb64e18b0273864920695cb18d7a2021f31a11b9c5fbcd9a253f936e2"},
11+
"jason": {:hex, :jason, "1.2.0", "10043418c42d2493d0ee212d3fddd25d7ffe484380afad769a0a38795938e448", [:mix], [{:decimal, "~> 1.0", [hex: :decimal, repo: "hexpm", optional: true]}], "hexpm", "116747dbe057794c3a3e4e143b7c8390b29f634e16c78a7f59ba75bfa6852e7f"},
12+
"liquid": {:hex, :liquid, "0.9.1", "eef4797f4b8b1cdd14c44d6dcd52bb49df9caf6bcf5dacfd61911fba8b6a628d", [:mix], [{:timex, "~> 3.0", [hex: :timex, repo: "hexpm", optional: false]}], "hexpm", "0472e078709036d0d31a82c6542d559cdad81552c40fb51745e108d4785db8df"},
13+
"makeup": {:hex, :makeup, "1.0.1", "82f332e461dc6c79dbd82fbe2a9c10d48ed07146f0a478286e590c83c52010b5", [:mix], [{:nimble_parsec, "~> 0.5.0", [hex: :nimble_parsec, repo: "hexpm", optional: false]}], "hexpm", "49736fe5b66a08d8575bf5321d716bac5da20c8e6b97714fec2bcd6febcfa1f8"},
14+
"makeup_elixir": {:hex, :makeup_elixir, "0.14.0", "cf8b7c66ad1cff4c14679698d532f0b5d45a3968ffbcbfd590339cb57742f1ae", [:mix], [{:makeup, "~> 1.0", [hex: :makeup, repo: "hexpm", optional: false]}], "hexpm", "d4b316c7222a85bbaa2fd7c6e90e37e953257ad196dc229505137c5e505e9eff"},
15+
"metrics": {:hex, :metrics, "1.0.1", "25f094dea2cda98213cecc3aeff09e940299d950904393b2a29d191c346a8486", [:rebar3], [], "hexpm", "69b09adddc4f74a40716ae54d140f93beb0fb8978d8636eaded0c31b6f099f16"},
16+
"mimerl": {:hex, :mimerl, "1.2.0", "67e2d3f571088d5cfd3e550c383094b47159f3eee8ffa08e64106cdf5e981be3", [:rebar3], [], "hexpm", "f278585650aa581986264638ebf698f8bb19df297f66ad91b18910dfc6e19323"},
17+
"nimble_parsec": {:hex, :nimble_parsec, "0.5.3", "def21c10a9ed70ce22754fdeea0810dafd53c2db3219a0cd54cf5526377af1c6", [:mix], [], "hexpm", "589b5af56f4afca65217a1f3eb3fee7e79b09c40c742fddc1c312b3ac0b3399f"},
18+
"parse_trans": {:hex, :parse_trans, "3.3.0", "09765507a3c7590a784615cfd421d101aec25098d50b89d7aa1d66646bc571c1", [:rebar3], [], "hexpm", "17ef63abde837ad30680ea7f857dd9e7ced9476cdd7b0394432af4bfc241b960"},
19+
"ssl_verify_fun": {:hex, :ssl_verify_fun, "1.1.5", "6eaf7ad16cb568bb01753dbbd7a95ff8b91c7979482b95f38443fe2c8852a79b", [:make, :mix, :rebar3], [], "hexpm", "13104d7897e38ed7f044c4de953a6c28597d1c952075eb2e328bc6d6f2bfc496"},
20+
"timex": {:hex, :timex, "3.6.1", "efdf56d0e67a6b956cc57774353b0329c8ab7726766a11547e529357ffdc1d56", [:mix], [{:combine, "~> 0.10", [hex: :combine, repo: "hexpm", optional: false]}, {:gettext, "~> 0.10", [hex: :gettext, repo: "hexpm", optional: false]}, {:tzdata, "~> 0.1.8 or ~> 0.5 or ~> 1.0.0", [hex: :tzdata, repo: "hexpm", optional: false]}], "hexpm", "f354efb2400dd7a80fd9eb6c8419068c4f632da4ac47f3d8822d6e33f08bc852"},
21+
"tzdata": {:hex, :tzdata, "1.0.3", "73470ad29dde46e350c60a66e6b360d3b99d2d18b74c4c349dbebbc27a09a3eb", [:mix], [{:hackney, "~> 1.0", [hex: :hackney, repo: "hexpm", optional: false]}], "hexpm", "a6e1ee7003c4d04ecbd21dd3ec690d4c6662db5d3bbdd7262d53cdf5e7c746c1"},
22+
"unicode_util_compat": {:hex, :unicode_util_compat, "0.4.1", "d869e4c68901dd9531385bb0c8c40444ebf624e60b6962d95952775cac5e90cd", [:rebar3], [], "hexpm", "1d1848c40487cdb0b30e8ed975e34e025860c02e419cb615d255849f3427439d"},
23+
"yamerl": {:hex, :yamerl, "0.8.0", "8214cfe16bbabe5d1d6c14a14aea11c784b9a21903dd6a7c74f8ce180adae5c7", [:rebar3], [], "hexpm", "010634477bf9c208a0767dcca89116c2442cf0b5e87f9c870f85cd1c3e0c2aab"},
24+
"yaml_elixir": {:hex, :yaml_elixir, "2.4.0", "2f444abc3c994c902851fde56b6a9cb82895c291c05a0490a289035c2e62ae71", [:mix], [{:yamerl, "~> 0.7", [hex: :yamerl, repo: "hexpm", optional: false]}], "hexpm", "4e25a6d5c873e393689c6f1062c5ec90f6cd1be2527b073178ae37eae4c78bee"},
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# AUTOGENERATED FILE - DO NOT EDIT
2+
3+
defmodule Statifier.Spec.<%= spec.specid %>Test do
4+
use ExUnit.Case, async: true
5+
6+
@moduletag spec_id: "<%= spec.specid %>"
7+
@moduletag spec_group: "<%= spec.specgroup %>"
8+
@moduletag spec_subject: "Statechart"
9+
@moduletag spec_description: """
10+
<%= spec.description %>
11+
"""
12+
@moduletag spec_statechart: <%= spec.statechart | elixir_map %>
13+
14+
{% comment %}
15+
alias Statifier.Statechart
16+
17+
setup_all do
18+
%{instructions: <%= instructions %>}
19+
end
20+
<% tests.each do |test| %>
21+
test "<%= test["name"] %>", context do
22+
predicate_context = <% if test["context"].nil? %>nil<% else %><%= elixir_hash test["context"] %><% end %>
23+
expected_result = <% if test["result"].nil? %>nil<% else %><%= test["result"] %><% end %>
24+
25+
result = Predicator.Evaluator.execute context[:instructions], predicate_context
26+
assert expected_result == result
27+
#assert_empty e.stack
28+
end
29+
{% endcomment %}
30+
<% end %>
31+
end
32+
{% comment %}
33+
defmodule Statifier.Spec. do
34+
use ExUnit.Case
35+
36+
alias Statifier.{Statechart, StateDef}
37+
38+
# Definied in test helper
39+
alias Statifier.Spec
40+
41+
test "building basic statechart" do
42+
test_path = Path.join(File.cwd!(), "test/fixtures/basic.yml")
43+
44+
{:ok, test_config} = YamlElixir.read_from_file(test_path)
45+
46+
sc = Statechart.build(test_config["statechart"])
47+
48+
assert %Statechart{
49+
name: "Valid Single State",
50+
states: [%StateDef{id: "greeting"} | _rest]
51+
} = sc
52+
end
53+
54+
# This corresponds to the <scxml> element defined here:
55+
# https://www.w3.org/TR/scxml/#scxml
56+
57+
# A conformant SCXML document must have at least one <state>, <parallel> or
58+
# <final> child.
59+
test "conformance: at least one state" do
60+
spec = Spec.from_fixture("basic.yml")
61+
62+
sc =
63+
Statechart.build(spec.statechart)
64+
|> Statechart.validate()
65+
66+
assert %Statechart{conformant: true} = sc
67+
end
68+
end
69+
{% endcomment %}

0 commit comments

Comments
 (0)