Add wildcard op, .gitignore & update rebar.configs
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ff8fc4b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+.eunit
+*.beam
+ebin
+doc
+*.swp
+erl_crash.dump
+.project
+log
diff --git a/Makefile b/Makefile
index 616e9cd..7be9a3e 100644
--- a/Makefile
+++ b/Makefile
@@ -20,10 +20,10 @@
 tests: clean app eunit ct
 
 eunit:
-	@$(REBAR) eunit skip_deps=true
+	@$(REBAR) -C rebar.test.config eunit skip_deps=true
 
 ct:
-	@$(REBAR) ct skip_deps=true
+	@$(REBAR) -C rebar.test.config ct skip_deps=true
 
 build-plt:
 	@$(DIALYZER) --build_plt --output_plt .$(APPNAME)_dialyzer.plt \
diff --git a/rebar.config b/rebar.config
index ef5b0d8..3faf52a 100644
--- a/rebar.config
+++ b/rebar.config
@@ -1,12 +1,6 @@
 {cover_enabled, true}.
-{eunit_opts, [{report, {eunit_surefire, [{dir, "."}]}}]}.
 {erl_opts, [
 %%	bin_opt_info,
 %%	warn_missing_spec,
-	warnings_as_errors,
 	warn_export_all
 ]}.
-{deps, [
-    {proper, ".*",
-        {git, "git://github.com/manopapad/proper.git", "master"}}
-]}.
diff --git a/src/glc.erl b/src/glc.erl
index 269adea..ecca4b7 100644
--- a/src/glc.erl
+++ b/src/glc.erl
@@ -30,6 +30,8 @@
 %% glc:eq(a, 0).
 %% %% Select all events where 'a' exists and is less than 0.
 %% glc:lt(a, 0).
+%% %% Select all events where 'a' exists and is anything.
+%% glc:wc(a).
 %%
 %% %% Select no input events. Used as black hole query.
 %% glc:null(false).
@@ -68,7 +70,8 @@
 -export([
     lt/2,
     eq/2,
-    gt/2
+    gt/2,
+    wc/1
 ]).
 
 -export([
@@ -100,6 +103,9 @@
 gt(Key, Term) ->
     glc_ops:gt(Key, Term).
 
+-spec wc(atom()) -> glc_ops:op().
+wc(Key) ->
+    glc_ops:wc(Key).
 
 %% @doc Filter the input using multiple filters.
 %%
diff --git a/src/glc_code.erl b/src/glc_code.erl
index f927055..810ca3c 100644
--- a/src/glc_code.erl
+++ b/src/glc_code.erl
@@ -27,7 +27,7 @@
 
 compile(Module, ModuleData) ->
     {ok, forms, Forms} = abstract_module(Module, ModuleData),
-    {ok, Module, Binary} = compile_forms(Forms, []),
+    {ok, Module, Binary} = compile_forms(Forms, [nowarn_unused_vars]),
     {ok, loaded, Module} = load_binary(Module, Binary),
     {ok, Module}.
 
@@ -150,6 +150,10 @@
     OnMatch(State);
 abstract_filter_({null, false}, _OnMatch, OnNomatch, State) ->
     OnNomatch(State);
+abstract_filter_({Key, '*'}, OnMatch, OnNomatch, State) ->
+    abstract_getkey(Key,
+        _OnMatch=fun(#state{}=State2) -> OnMatch(State2) end,
+        _OnNomatch=fun(State2) -> OnNomatch(State2) end, State);
 abstract_filter_({Key, Op, Value}, OnMatch, OnNomatch, State)
         when Op =:= '>'; Op =:= '='; Op =:= '<' ->
     Op2 = case Op of '=' -> '=:='; Op -> Op end,
@@ -176,7 +180,6 @@
                     OnNomatch(State2))])] end,
         _OnNomatch=fun(State2) -> OnNomatch(State2) end, State).
 
-
 %% @private Generate an `all' filter.
 %% An `all' filter is evaluated by testing all conditions that must hold. If
 %% any of the conditions does not hold the evaluation is short circuted at that
@@ -334,8 +337,8 @@
 
 %% @private Compile an abstract module.
 -spec compile_forms(term(), [term()]) -> {ok, atom(), binary()}.
-compile_forms(Forms, _Opts) ->
-    case compile:forms(Forms) of
+compile_forms(Forms, Opts) ->
+    case compile:forms(Forms, Opts) of
         {ok, Module, Binary} ->
             {ok, Module, Binary};
         {ok, Module, Binary, _Warnings} ->
diff --git a/src/glc_lib.erl b/src/glc_lib.erl
index 014054b..427551f 100644
--- a/src/glc_lib.erl
+++ b/src/glc_lib.erl
@@ -69,6 +69,11 @@
     case gre:find(Key, Event) of
         {true, Term2} -> Term2 > Term;
         false -> false
+    end;
+matches({Key, '*'}, Event) ->
+    case gre:find(Key, Event) of
+        {true, _} -> true;
+        false -> false
     end.
 
 %% @private Repeatedly apply a function to a query.
@@ -88,6 +93,8 @@
     output;
 onoutput({_, '>', _}) ->
     output;
+onoutput({_, '*'}) ->
+    output;
 onoutput(Query) ->
     erlang:error(badarg, [Query]).
 
@@ -237,6 +244,8 @@
     true;
 is_valid({Field, '>', _Term}) when is_atom(Field) ->
     true;
+is_valid({Field, '*'}) when is_atom(Field) ->
+    true;
 is_valid({null, true}) ->
     true;
 is_valid({null, false}) ->
@@ -344,7 +353,8 @@
 default_is_output_test_() ->
     [?_assertEqual(output, glc_lib:onoutput(glc:lt(a, 1))),
      ?_assertEqual(output, glc_lib:onoutput(glc:eq(a, 1))),
-     ?_assertEqual(output, glc_lib:onoutput(glc:gt(a, 1)))
+     ?_assertEqual(output, glc_lib:onoutput(glc:gt(a, 1))),
+     ?_assertEqual(output, glc_lib:onoutput(glc:wc(a)))
     ].
 
 -ifdef(PROPER).
diff --git a/src/glc_ops.erl b/src/glc_ops.erl
index 4be831e..05067c4 100644
--- a/src/glc_ops.erl
+++ b/src/glc_ops.erl
@@ -4,7 +4,8 @@
 -export([
     lt/2,
     eq/2,
-    gt/2
+    gt/2,
+    wc/1
 ]).
 
 -export([
@@ -22,6 +23,7 @@
     {atom(), '<', term()} |
     {atom(), '=', term()} |
     {atom(), '>', term()} |
+    {atom(), '*'} |
     {any, [op(), ...]} |
     {all, [op(), ...]} |
     {null, true|false}.
@@ -49,6 +51,12 @@
 gt(Key, Term) ->
     erlang:error(badarg, [Key, Term]).
 
+%% @doc Test that a field value is exists.
+-spec wc(atom()) -> op().
+wc(Key) when is_atom(Key) ->
+    {Key, '*'};
+wc(Key) ->
+    erlang:error(badarg, [Key]).
 
 %% @doc Filter the input using multiple filters.
 %%