sassc 1.8.0.pre2 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +6 -2
  3. data/ext/libsass/contrib/plugin.cpp +4 -1
  4. data/ext/libsass/docs/README.md +20 -0
  5. data/ext/libsass/docs/api-context-example.md +45 -0
  6. data/ext/libsass/docs/api-context-internal.md +152 -0
  7. data/ext/libsass/docs/api-context.md +268 -0
  8. data/ext/libsass/docs/api-doc.md +160 -0
  9. data/ext/libsass/docs/api-function-example.md +58 -0
  10. data/ext/libsass/docs/api-function-internal.md +8 -0
  11. data/ext/libsass/docs/api-function.md +48 -0
  12. data/ext/libsass/docs/api-importer-example.md +1345 -0
  13. data/ext/libsass/docs/api-importer-internal.md +15 -0
  14. data/ext/libsass/docs/api-importer.md +84 -0
  15. data/ext/libsass/docs/api-value-example.md +0 -0
  16. data/ext/libsass/docs/api-value-internal.md +76 -0
  17. data/ext/libsass/docs/api-value.md +125 -0
  18. data/ext/libsass/docs/build-on-darwin.md +27 -0
  19. data/ext/libsass/docs/build-on-gentoo.md +55 -0
  20. data/ext/libsass/docs/build-on-windows.md +139 -0
  21. data/ext/libsass/docs/build-shared-library.md +35 -0
  22. data/ext/libsass/docs/build-with-autotools.md +68 -0
  23. data/ext/libsass/docs/build-with-makefiles.md +50 -0
  24. data/ext/libsass/docs/build-with-mingw.md +107 -0
  25. data/ext/libsass/docs/build-with-visual-studio.md +90 -0
  26. data/ext/libsass/docs/build.md +97 -0
  27. data/ext/libsass/docs/compatibility-plan.md +48 -0
  28. data/ext/libsass/docs/contributing.md +17 -0
  29. data/ext/libsass/docs/custom-functions-internal.md +120 -0
  30. data/ext/libsass/docs/implementations.md +49 -0
  31. data/ext/libsass/docs/plugins.go +47 -0
  32. data/ext/libsass/docs/setup-environment.md +68 -0
  33. data/ext/libsass/docs/source-map-internals.md +51 -0
  34. data/ext/libsass/docs/trace.md +26 -0
  35. data/ext/libsass/docs/triage.md +17 -0
  36. data/ext/libsass/docs/unicode.md +39 -0
  37. data/ext/libsass/include/sass/context.h +1 -0
  38. data/ext/libsass/include/sass/functions.h +1 -1
  39. data/ext/libsass/src/ast.cpp +12 -2
  40. data/ext/libsass/src/ast.hpp +10 -2
  41. data/ext/libsass/src/bind.cpp +0 -2
  42. data/ext/libsass/src/debug.hpp +4 -0
  43. data/ext/libsass/src/debugger.hpp +2 -1
  44. data/ext/libsass/src/emitter.cpp +2 -0
  45. data/ext/libsass/src/eval.cpp +5 -7
  46. data/ext/libsass/src/expand.cpp +8 -1
  47. data/ext/libsass/src/functions.cpp +19 -4
  48. data/ext/libsass/src/inspect.cpp +17 -0
  49. data/ext/libsass/src/json.cpp +1 -1
  50. data/ext/libsass/src/parser.cpp +10 -1
  51. data/ext/libsass/src/prelexer.cpp +1 -1
  52. data/ext/libsass/src/sass_context.cpp +1 -0
  53. data/ext/libsass/src/sass_values.cpp +1 -1
  54. data/lib/sassc/version.rb +1 -1
  55. data/test/native_test.rb +1 -1
  56. metadata +37 -4
@@ -0,0 +1,48 @@
1
+ This document is to serve as a living, changing plan for getting LibSass caught up with Ruby Sass.
2
+
3
+ _Note: an "s" preceeding a version number is specifying a Ruby Sass version. Without an s, it's a version of LibSass._
4
+
5
+ # Goal
6
+ **Our goal is to reach full s3.4 compatibility as soon as possible. LibSass version 3.4 will behave just like Ruby Sass 3.4**
7
+
8
+ I highlight the goal, because there are some things that are *not* currently priorities. To be clear, they WILL be priorities, but they are not at the moment:
9
+
10
+ * Performance Improvements
11
+ * Extensibility
12
+
13
+ The overriding goal is correctness.
14
+
15
+ ## Verifying Correctness
16
+ LibSass uses the spec for its testing. The spec was originally based off s3.2 tests. Many things have changed in Ruby Sass since then and some of the tests need to be updated and changed in order to get them to match both LibSass and Ruby Sass.
17
+
18
+ Until this project is complete, the spec will be primarily a place to test LibSass. By the time LibSass reaches 3.4, it is our goal that sass-spec will be fully usable as an official testing source for ALL implementations of Sass.
19
+
20
+ ## Version Naming
21
+ Until LibSass reaches parity with Ruby Sass, we will be aggressively bumping versions, and LibSass 3.4 will be the peer to Ruby Sass 3.4 in every way.
22
+
23
+ # Release Plan
24
+
25
+ ## 3.0
26
+ The goal of 3.0 is to introduce some of the most demanded features for LibSass. That is, we are focusing on issues and features that have kept adoption down. This is a mongrel release wrt which version of Sass it's targeting. It's often a mixture of 3.2 / 3.3 / 3.4 behaviours. This is not ideal, but it's favourable to not existing. Targeting 3.4 strictly during this release would mean we never actually release.
27
+
28
+ # 3.1
29
+ The goal of 3.1 is to update all the passing specs to agree with 3.4. This will not be a complete representation of s3.4 (aka, there will me missing features), but the goal is to change existing features and implemented features to match 3.4 behaviour.
30
+
31
+ By the end of this, the sass-spec must pass against 3.4.
32
+
33
+ Major issues:
34
+ * Variable Scoping
35
+ * Color Handling
36
+ * Precision
37
+
38
+ # 3.2
39
+ This version will focus on edge case fixes. There are a LOT of edge cases in the _todo_ tests and this is the release where we hunt those down like dogs (not that we want to hurt dogs, it's just a figure of speech in English).
40
+
41
+ # 3.3
42
+ Dress rehearsal. When we are 99% sure that we've fixed the main issues keeping us from saying we are compliant in s3.4 behaviour.
43
+
44
+ # 3.4
45
+ Compass Compatibility. We need to be able to work with Compass and all the other libraries out there. At this point, we are calling LibSass "mature"
46
+
47
+ # Beyond 3.4
48
+ Obviously, there is matching Sass 3.5 behaviour. But, beyond that, we'll want to focus on performance, stability, and error handling. These can always be improved upon and are the life's work of an open source project. We'll have to work closely with Sass in the future.
@@ -0,0 +1,17 @@
1
+ First of all, welcome! Thanks for even reading this page. If you're here, you're probably wondering what you can do to help make the LibSass project even more awesome. And, even having that feeling means you are awesome!
2
+
3
+ ## I'm a programmer
4
+
5
+ Awesome! We need your help. The best thing to do is go find issues that are tagged with both "bug" and "test written". We do spec driven development here and these issues have a test that's written already in the sass-spec project. Go find the test by going to sass-spec/spec/LibSass-todo-issues/issue_XXX/ where XXX is the issue number. Write the code, and compile, and then issue a pull request referencing the issue. We'll quickly verify it and get it merged in!
6
+
7
+ To get your dev environment setup, check out our article on [Setup-Dev-Environment](setup-environment.md).
8
+
9
+ ## I'm not a backend programmer
10
+
11
+ COOL! We also need your help. Doing [Issue-Triage](triage.md) is a big deal and something we need constant help with. That means helping to verify issues, write tests for them, and make sure they are getting fixed. It's being part of the smiling face of the project.
12
+
13
+ Also, we need help with the Sass-Spec project itself. Just people to organize, refactor, and understand the tests in there.
14
+
15
+ ## I don't know what a computer is?
16
+
17
+ Hmm.... well, it's the thing you are looking at right now. Ummm... check out training courses! Then, come back and join us!
@@ -0,0 +1,120 @@
1
+ # Developer Documentation
2
+
3
+ Custom functions are internally represented by `struct Sass_C_Function_Descriptor`.
4
+
5
+ ## Sass_C_Function_Descriptor
6
+
7
+ ```C
8
+ struct Sass_C_Function_Descriptor {
9
+ const char* signature;
10
+ Sass_C_Function function;
11
+ void* cookie;
12
+ };
13
+ ```
14
+
15
+ - `signature`: The function declaration, like `foo($bar, $baz:1)`
16
+ - `function`: Reference to the C function callback
17
+ - `cookie`: any pointer you want to attach
18
+
19
+ ### signature
20
+
21
+ The signature defines how the function can be invoked. It also declares which arguments are required and which are optional. Required arguments will be enforced by LibSass and a Sass error is thrown in the event a call as missing an argument. Optional arguments only need to be present when you want to overwrite the default value.
22
+
23
+ foo($bar, $baz: 2)
24
+
25
+ In this example, `$bar` is required and will error if not passed. `$baz` is optional and the default value of it is 2. A call like `foo(10)` is therefore equal to `foo(10, 2)`, while `foo()` will produce an error.
26
+
27
+ ### function
28
+
29
+ The callback function needs to be of the following form:
30
+
31
+ ```C
32
+ union Sass_Value* call_sass_function(
33
+ const union Sass_Value* s_args,
34
+ void* cookie
35
+ ) {
36
+ return sass_clone_value(s_args);
37
+ }
38
+ ```
39
+
40
+ ### cookie
41
+
42
+ The cookie can hold any pointer you want. In the `perl-libsass` implementation it holds the structure with the reference of the actual registered callback into the perl interpreter. Before that call `perl-libsass` will convert all `Sass_Values` to corresponding perl data types (so they can be used natively inside the perl interpretor). The callback can also return a `Sass_Value`. In `perl-libsass` the actual function returns a perl value, which has to be converted before `libsass` can work with it again!
43
+
44
+ ## Sass_Values
45
+
46
+ ```C
47
+ // allocate memory (copies passed strings)
48
+ union Sass_Value* make_sass_boolean (int val);
49
+ union Sass_Value* make_sass_number (double val, const char* unit);
50
+ union Sass_Value* make_sass_color (double r, double g, double b, double a);
51
+ union Sass_Value* make_sass_string (const char* val);
52
+ union Sass_Value* make_sass_list (size_t len, enum Sass_Separator sep);
53
+ union Sass_Value* make_sass_map (size_t len);
54
+ union Sass_Value* make_sass_null ();
55
+ union Sass_Value* make_sass_error (const char* msg);
56
+
57
+ // Make a deep cloned copy of the given sass value
58
+ union Sass_Value* sass_clone_value (const union Sass_Value* val);
59
+
60
+ // deallocate memory (incl. all copied memory)
61
+ void sass_delete_value (const union Sass_Value* val);
62
+ ```
63
+
64
+ ## Example main.c
65
+
66
+ ```C
67
+ #include <stdio.h>
68
+ #include <stdint.h>
69
+ #include "sass_context.h"
70
+
71
+ union Sass_Value* call_fn_foo(const union Sass_Value* s_args, void* cookie)
72
+ {
73
+ // we actually abuse the void* to store an "int"
74
+ return sass_make_number((size_t)cookie, "px");
75
+ }
76
+
77
+ int main( int argc, const char* argv[] )
78
+ {
79
+
80
+ // get the input file from first argument or use default
81
+ const char* input = argc > 1 ? argv[1] : "styles.scss";
82
+
83
+ // create the file context and get all related structs
84
+ struct Sass_File_Context* file_ctx = sass_make_file_context(input);
85
+ struct Sass_Context* ctx = sass_file_context_get_context(file_ctx);
86
+ struct Sass_Options* ctx_opt = sass_context_get_options(ctx);
87
+
88
+ // allocate a custom function caller
89
+ Sass_C_Function_Callback fn_foo =
90
+ sass_make_function("foo()", call_fn_foo, (void*)42);
91
+
92
+ // create list of all custom functions
93
+ Sass_C_Function_List fn_list = sass_make_function_list(1);
94
+ sass_function_set_list_entry(fn_list, 0, fn_foo);
95
+ sass_option_set_c_functions(ctx_opt, fn_list);
96
+
97
+ // context is set up, call the compile step now
98
+ int status = sass_compile_file_context(file_ctx);
99
+
100
+ // print the result or the error to the stdout
101
+ if (status == 0) puts(sass_context_get_output_string(ctx));
102
+ else puts(sass_context_get_error_message(ctx));
103
+
104
+ // release allocated memory
105
+ sass_delete_file_context(file_ctx);
106
+
107
+ // exit status
108
+ return status;
109
+
110
+ }
111
+ ```
112
+
113
+ ## Compile main.c
114
+
115
+ ```bash
116
+ gcc -c main.c -o main.o
117
+ gcc -o sample main.o -lsass
118
+ echo "foo { margin: foo(); }" > foo.scss
119
+ ./sample foo.scss => "foo { margin: 42px }"
120
+ ```
@@ -0,0 +1,49 @@
1
+ There are several implementations of `libsass` for a variety of languages. Here are just a few of them. Note, some implementations may or may not be up to date. We have not verified whether they work.
2
+
3
+ ### C
4
+ * [sassc](https://github.com/hcatlin/sassc)
5
+
6
+ ### Go
7
+ * [go-libsass](https://github.com/wellington/go-libsass)
8
+ * [go_sass](https://github.com/suapapa/go_sass)
9
+ * [go-sass](https://github.com/SamWhited/go-sass)
10
+
11
+ ### Lua
12
+ * [lua-sass](https://github.com/craigbarnes/lua-sass)
13
+
14
+ ### .NET
15
+ * [libsass-net](https://github.com/darrenkopp/libsass-net)
16
+ * [NSass](https://github.com/TBAPI-0KA/NSass)
17
+ * [Sass.Net](https://github.com/andyalm/Sass.Net)
18
+
19
+ ### node.js
20
+ * [node-sass](https://github.com/andrew/node-sass)
21
+
22
+ ### Java
23
+ * [libsass-maven-plugin](https://github.com/warmuuh/libsass-maven-plugin)
24
+ * [jsass](https://github.com/bit3/jsass)
25
+
26
+ ### JavaScript
27
+ * [sass.js](https://github.com/medialize/sass.js)
28
+
29
+ ### Perl
30
+ * [CSS::Sass](https://github.com/caldwell/CSS-Sass)
31
+ * [Text::Sass::XS](https://github.com/ysasaki/Text-Sass-XS)
32
+
33
+ ### PHP
34
+ * [sassphp](https://github.com/sensational/sassphp)
35
+
36
+ ### Python
37
+ * [libsass-python](https://github.com/dahlia/libsass-python)
38
+ * [SassPython](https://github.com/marianoguerra/SassPython)
39
+ * [pylibsass](https://github.com/rsenk330/pylibsass)
40
+ * [python-scss](https://github.com/pistolero/python-scss)
41
+
42
+ ### Ruby
43
+ * [sassruby](https://github.com/hcatlin/sassruby)
44
+
45
+ ### Scala
46
+ * [Sass-Scala](https://github.com/kkung/Sass-Scala)
47
+
48
+ ### Tcl
49
+ * [tclsass](https://github.com/flightaware/tclsass)
@@ -0,0 +1,47 @@
1
+ Plugins are shared object files (.so on *nix and .dll on win) that can be loaded by LibSass on runtime. Currently we only provide a way to load internal/custom functions from plugins. In the future we probably will also add a way to provide custom importers via plugins (needs more refactoring to [support multiple importers with some kind of priority system](https://github.com/sass/libsass/issues/962)).
2
+
3
+ ## plugin.cpp
4
+
5
+ ```C++
6
+ #include <cstring>
7
+ #include <iostream>
8
+ #include <stdint.h>
9
+ #include "sass_values.h"
10
+
11
+ union Sass_Value* ADDCALL call_fn_foo(const union Sass_Value* s_args, void* cookie)
12
+ {
13
+ // we actually abuse the void* to store an "int"
14
+ return sass_make_number((intptr_t)cookie, "px");
15
+ }
16
+
17
+ extern "C" const char* ADDCALL libsass_get_version() {
18
+ return libsass_version();
19
+ }
20
+
21
+ extern "C" Sass_C_Function_List ADDCALL libsass_load_functions()
22
+ {
23
+ // allocate a custom function caller
24
+ Sass_C_Function_Callback fn_foo =
25
+ sass_make_function("foo()", call_fn_foo, (void*)42);
26
+ // create list of all custom functions
27
+ Sass_C_Function_List fn_list = sass_make_function_list(1);
28
+ // put the only function in this plugin to the list
29
+ sass_function_set_list_entry(fn_list, 0, fn_foo);
30
+ // return the list
31
+ return fn_list;
32
+ }
33
+ ```
34
+
35
+ To compile the plugin you need to have LibSass already built as a shared library (to link against it). The commands below expect the shared library in the `lib` sub-directory (`-Llib`). The plugin and the main LibSass process should "consume" the same shared LibSass library on runtime. It will propably also work if they use different LibSass versions. In this case we check if the major versions are compatible (i.e. 3.1.3 and 3.1.1 would be considered compatible).
36
+
37
+ ## Compile with gcc on linux
38
+
39
+ ```bash
40
+ g++ -O2 -shared plugin.cpp -o plugin.so -fPIC -Llib -lsass
41
+ ```
42
+
43
+ ## Compile with mingw on windows
44
+
45
+ ```bash
46
+ g++ -O2 -shared plugin.cpp -o plugin.dll -Llib -lsass
47
+ ```
@@ -0,0 +1,68 @@
1
+ ## Requirements
2
+ In order to install and setup your local development environment, there are some prerequisites:
3
+
4
+ * git
5
+ * gcc/clang/llvm (Linux: build tools, Mac OS X: XCode w/ Command Line Tools)
6
+ * ruby w/ bundler
7
+
8
+ OS X:
9
+ First you'll need to install XCode which you can now get from the AppStore installed on your mac. After you download that and run it, then run this on the command line:
10
+
11
+ ````
12
+ xcode-select --install
13
+ ````
14
+
15
+ ## Cloning the Projects
16
+
17
+ First, clone the project and then add a line to your `~/.bash_profile` that will let other programs know where the LibSass dev files are.
18
+
19
+ ````
20
+ git clone git@github.com:sass/libsass.git
21
+ cd libsass
22
+ echo "export SASS_LIBSASS_PATH=$(pwd)" >> ~/.bash_profile
23
+
24
+ ````
25
+
26
+ Then, if you run the "bootstrap" script, it should clone all the other required projects.
27
+
28
+ ````
29
+ ./script/bootstrap
30
+ ````
31
+
32
+ You should now have a `sass-spec` and `sassc` folder within the libsass folder. Both of these are clones of their respective git projects. If you want to do a pull request, remember to work in those folders. For instance, if you want to add a test (see other documentation for how to do that), make sure to commit it to your *fork* of the sass-spec github project. Also, whenever you are running tests, make sure to `pull` from the origin! We want to make sure we are testing against the newest libsass, sassc, and sass-spec!
33
+
34
+ Now, try and see if you can build the project. We do that with the `make` command.
35
+
36
+ ````
37
+ make
38
+ ````
39
+
40
+ At this point, if you get an error, something is most likely wrong with your compiler installation. Yikes. It's hard to cover how to fix this in an article. Feel free to open an issue and we'll try and help! But, remember, before you do that, googling the error message is your friend! Many problems are solved quickly that way.
41
+
42
+ ## Running The Spec Against LibSass
43
+
44
+ Then, to run the spec against LibSass, just run:
45
+
46
+ ````
47
+ ./script/spec
48
+ ````
49
+
50
+ If you get an error about `SASS_LIBSASS_PATH`, you may still need to set a variable pointing to the libsass folder, like this:
51
+
52
+ ````
53
+ export SASS_LIBSASS_PATH=/Users/you/path/libsass
54
+ ````
55
+
56
+ ...where the latter part is to the `libsass` directory you've cloned. You can get this path by typing `pwd` in the Terminal
57
+
58
+ ## Running the Spec Against Ruby Sass
59
+
60
+ Go into the sass-spec folder that should have been cloned earlier with the "bootstrap" command. Run the following.
61
+
62
+ ````
63
+ bundle install
64
+ ./sass-spec.rb
65
+ ````
66
+
67
+ Voila! Now you are testing against Sass too!
68
+
@@ -0,0 +1,51 @@
1
+ This document is mainly intended for developers!
2
+
3
+ # Documenting some of the source map internals
4
+
5
+ Since source maps are somewhat a black box to all LibSass maintainers, [I](@mgreter) will try to document my findings with source maps in LibSass, as I come across them. This document will also brievely explain how LibSass parses the source and how it outputs the result.
6
+
7
+ The main storage for SourceMap mappings is the `mappings` vector:
8
+
9
+ ```
10
+ # in source_map.hpp
11
+ vector<Mapping> mappings
12
+ # in mappings.hpp
13
+ struct Mapping ...
14
+ Position original_position;
15
+ Position generated_position;
16
+ ```
17
+
18
+ ## Every parsed token has its source associated
19
+
20
+ LibSass uses a lexical parser. Whenever LibSass finds a token of interest, it creates a specific `AST_Node`, which will hold a reference to the input source with line/column information. `AST_Node` is the base class for all parsed items. They are declared in `ast.hpp` and are used in `parser.hpp`. Here a simple example:
21
+
22
+ ```
23
+ if (lex< custom_property_name >()) {
24
+ Sass::String* prop = new (ctx.mem) String_Constant(path, source_position, lexed);
25
+ return new (ctx.mem) Declaration(path, prop->position(), prop, ...);
26
+ }
27
+ ```
28
+
29
+ ## How is the `source_position` calculated
30
+
31
+ This is automatically done with `lex` in `parser.hpp`. Whenever something is lexed, the `source_position` is updated. But be aware that `source_position` points to the begining of the parsed text. If you need a mapping for the position where the parsing ended, you need to add another call to `lex` (to match nothing)!
32
+
33
+ ```
34
+ lex< exactly < empty_str > >();
35
+ end = new (ctx.mem) String_Constant(path, source_position, lexed);
36
+ ```
37
+
38
+ ## How are mappings for the output created
39
+
40
+ So far we have collected all needed data for all tokens in the input stream. We can now use this information to create mappings when we put things into the output stream. Mappings are created via the `add_mappings` method:
41
+
42
+ ```
43
+ # in source_map.hpp
44
+ void add_mapping(AST_Node* node);
45
+ ```
46
+
47
+ This method is called in two places:
48
+ - `Inspect::append_to_buffer`
49
+ - `Output_[Nested|Compressed]::append_to_buffer`
50
+
51
+ Mappings can only be created for things that have been parsed into a `AST_Node`. Otherwise we do not have the information to create the mappings, which is the reason why LibSass currently only maps the most important tokens in source maps.
@@ -0,0 +1,26 @@
1
+ ## This is proposed interface in https://github.com/sass/libsass/pull/1288
2
+
3
+ Additional debugging macros with low overhead are available, `TRACE()` and `TRACEINST()`.
4
+
5
+ Both macros simulate a string stream, so they can be used like this:
6
+
7
+ TRACE() << "Reached.";
8
+
9
+ produces:
10
+
11
+ [LibSass] parse_value parser.cpp:1384 Reached.
12
+
13
+ `TRACE()`
14
+ logs function name, source filename, source file name to the standard error and the attached
15
+ stream to the standard error.
16
+
17
+ `TRACEINST(obj)`
18
+ logs object instance address, function name, source filename, source file name to the standard error and the attached stream to the standard error, for example:
19
+
20
+ TRACEINST(this) << "String_Constant created " << this;
21
+
22
+ produces:
23
+
24
+ [LibSass] 0x8031ba980:String_Constant ./ast.hpp:1371 String_Constant created (0,"auto")
25
+
26
+ The macros generate output only of `LibSass_TRACE` is set in the environment.
@@ -0,0 +1,17 @@
1
+ This is an article about how to help with LibSass issues. Issue triage is a fancy word for explaining how we deal with incoming issues and make sure that the right problems get worked on. The lifecycle of an issue goes like this:
2
+
3
+ 1. Issue is reported by a user.
4
+ 2. If the issue seems like a bug, then the "bug" tag is added.
5
+ 3. If the reporting user didn't also create a spec test over at sass/sass-spec, the "needs test" tag is added.
6
+ 4. Verify that Ruby Sass *does not* have the same bug. LibSass strives to be an exact replica of how Ruby Sass works. If it's an issue that neither project has solved, please close the ticket with the "not in sass" label.
7
+ 5. The smallest possible breaking test is created in sass-spec. Cut away any extra information or non-breaking code until the core issue is made clear.
8
+ 6. Again, verify that the expected output matches the latest Ruby Sass release. Do this by using your own tool OR by running ./sass-spec.rb in the spec folder and making sure that your test passes!
9
+ 7. Create the test cases in sass-spec with the name spec/LibSass-todo-issues/issue_XXX/input.scss and expected_output.css where the XXX is the issue number here.
10
+ 8. Commit that test to sass-spec, making sure to reference the issue in the comment message like "Test to demonstrate sass/LibSass#XXX".
11
+ 9. Once the spec test exists, remove the "needs test" tag and replace it with "test written".
12
+ 10. A C++ developer will then work on the issue and issue a pull request to fix the issue.
13
+ 11. A core member verifies that the fix does actually fix the spec tests.
14
+ 12. The fix is merged into the project.
15
+ 13. The spec is moved from the LibSass-todo-issues folder into LibSass-closed-issues
16
+ 14. The issue is closed
17
+ 15. Have a soda pop or enjoyable beverage of your choice