diff --git a/_sources/ActiveCode/python.rst b/_sources/ActiveCode/python.rst index 563055a..9f5f3bd 100644 --- a/_sources/ActiveCode/python.rst +++ b/_sources/ActiveCode/python.rst @@ -223,9 +223,9 @@ Image Processing We have a special image library that we wrote for skulpt that lets you access images pixel by pixel. This is a great way to practice nested iteration and to learn about the many different filters provided by services like Instagram, and others. -.. datafile:: golden_gate.png - :image: - :fromfile: golden_gate.png +.. .. datafile:: golden_gate.png +.. :image: +.. :fromfile: golden_gate.png Click on the reveal to see the rst for the datafile directive. @@ -237,9 +237,9 @@ Click on the reveal to see the rst for the datafile directive. .. code-block:: rst - .. datafile:: golden_gate.png - :image: - :fromfile: golden_gate.png + .. .. datafile:: golden_gate.png + .. :image: + .. :fromfile: golden_gate.png You can use images in many ways. If you have an image in your page and it has an id tag you can use that. If you have a full URL to an image you can use that. But the best thing to do if you are writing a book is to use the ``.. datafile::`` directive, this ensures that the image is available from anywhere in the book. @@ -484,12 +484,9 @@ If the JOBE server has pandas installed we can even use pandas right in the text Here is the file it will read from. -.. datafile:: country_data.csv - :fromfile: world_countries.csv .. activecode:: pandas :language: python3 - :datafile: country_data.csv import pandas as pd @@ -505,7 +502,6 @@ Here is the file it will read from. .. activecode:: pandas :language: python3 - :datafile: country_data.csv import pandas as pd @@ -516,18 +512,18 @@ Here is the file it will read from. For this example, we move our ``PartyAnimal`` class into its own file. Then, we can 'import' the ``PartyAnimal`` class in a new file and extend it, as follows: -.. datafile:: src/builtin/party.py +.. .. datafile:: src/builtin/party.py - class PartyAnimal: +.. class PartyAnimal: - def __init__(self, nam): - self.name = nam - print(self.name,'constructed') +.. def __init__(self, nam): +.. self.name = nam +.. print(self.name,'constructed') - def party(self, x) : - self.x = x - self.x = self.x + 1 - print(self.name,'party count',self.x) +.. def party(self, x) : +.. self.x = x +.. self.x = self.x + 1 +.. print(self.name,'party count',self.x) .. activecode:: inherit_cricketfan diff --git a/_sources/CodeTailorTest/java_multi_level_per_puzzle.rst b/_sources/CodeTailorTest/java_multi_level_per_puzzle.rst new file mode 100644 index 0000000..4945767 --- /dev/null +++ b/_sources/CodeTailorTest/java_multi_level_per_puzzle.rst @@ -0,0 +1,174 @@ + +🪄 CodeTailor Examples - Try the "Get Help" button +=================================================== + +Provide a Block-and-Solution Personalized Adaptive Puzzle +------------------------------------------------------------ + +In this example, you receive a **block-and-solution personalized adaptive puzzle** based on your current written code. +You can interact with the puzzle and try to solve it. +You can regenerate the puzzle based on your updated code anytime by clicking the "Regenerate Help" button. + +:Movable Blocks: + Move the correct blocks from the left box to the right box and put them into the correct order. + +:Static Blocks: + - The Static blocks are the blocks that are already in position in the answer box. You can not move them. + - You can hover over the static blocks to see how many blocks are needed above and below them. + +:Paired Block Sets: + - Pairs with a correct block and an incorrect block that is not needed in a correct solution. + - Use students' own wrong code as distractor blocks. + - The incorrect blocks may contain syntactic or semantic errors. + - The correct code is randomly shown above or below the incorrect block. + + +.. activecode:: has22-example-multiper-java + :language: java + :autograde: unittest + :parsonspersonalize: partial + + Create a method ``has22(nums)`` that takes an array of integers, ``nums`` and returns ``true`` if there are at least two items in the list that are adjacent and both equal to 2, otherwise return false. + + .. table:: + :name: phrase_table_solcode + :align: left + :width: 50 + + +-------------------------------------+-------------------------------+ + | Example Input | Expected Output | + +=====================================+===============================+ + | ``has22({1, 2, 2})`` | ``true`` | + +-------------------------------------+-------------------------------+ + | ``has22({1, 2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + | ``has22({2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + + + + ~~~~ + import java.util.Scanner; + import java.util.Arrays; + + public class Has22 { + public static boolean has22(int nums) { + for (int i = 0; i < nums.length - 1; i++) { + + + + + + ==== + import static org.junit.Assert.*; + import org.junit.Test; + + class TestHelper { + public static void runAllTests() throws Exception { + if (!Has22.has22(new int[]{1, 2, 2, 3})) { + throw new Exception("Test 1 failed"); + } + if (Has22.has22(new int[]{2, 3, 2})) { + throw new Exception("Test 2 failed"); + } + if (Has22.has22(new int[]{1, 3, 4, 5})) { + throw new Exception("Test 3 failed"); + } + } + } + + + public class RunestoneTests { + @Test + public void testPhrase() throws Exception { + try { + TestHelper.runAllTests(); + System.out.println("✅ All tests passed!"); + System.out.println("Test 1: phrase(\"Sam\", \"Likes to code\") -> Sam likes to code"); + System.out.println("Test 2: phrase(123, \"code\") -> null"); + System.out.println("Test 3: phrase(\"JANE\", \"Loves JAVA\") -> Jane loves java"); + } catch (Exception e) { + System.out.println("❌ " + e.getMessage()); + fail(e.getMessage()); + } + } + } + + +.. reveal:: codetailor4_source + :showtitle: Show Source + :hidetitle: Hide Source + :modaltitle: Source for the example above + + .. code-block:: rst + + .. activecode:: has22-example-multiper-java + :language: java + :autograde: unittest + :parsonspersonalize: partial + + Create a method ``has22(nums)`` that takes an array of integers, ``nums`` and returns ``true`` if there are at least two items in the list that are adjacent and both equal to 2, otherwise return false. + + .. table:: + :name: phrase_table_solcode + :align: left + :width: 50 + + +-------------------------------------+-------------------------------+ + | Example Input | Expected Output | + +=====================================+===============================+ + | ``has22({1, 2, 2})`` | ``true`` | + +-------------------------------------+-------------------------------+ + | ``has22({1, 2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + | ``has22({2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + + + + ~~~~ + import java.util.Scanner; + import java.util.Arrays; + + public class Has22 { + public static boolean has22(int nums) { + for (int i = 0; i < nums.length - 1; i++) { + + + + + + ==== + import static org.junit.Assert.*; + import org.junit.Test; + + class TestHelper { + public static void runAllTests() throws Exception { + if (!Has22.has22(new int[]{1, 2, 2, 3})) { + throw new Exception("Test 1 failed"); + } + if (Has22.has22(new int[]{2, 3, 2})) { + throw new Exception("Test 2 failed"); + } + if (Has22.has22(new int[]{1, 3, 4, 5})) { + throw new Exception("Test 3 failed"); + } + } + } + + + public class RunestoneTests { + @Test + public void testPhrase() throws Exception { + try { + TestHelper.runAllTests(); + System.out.println("✅ All tests passed!"); + System.out.println("Test 1: phrase(\"Sam\", \"Likes to code\") -> Sam likes to code"); + System.out.println("Test 2: phrase(123, \"code\") -> null"); + System.out.println("Test 3: phrase(\"JANE\", \"Loves JAVA\") -> Jane loves java"); + } catch (Exception e) { + System.out.println("❌ " + e.getMessage()); + fail(e.getMessage()); + } + } + } \ No newline at end of file diff --git a/_sources/CodeTailorTest/java_solution_per_puzzle.rst b/_sources/CodeTailorTest/java_solution_per_puzzle.rst new file mode 100644 index 0000000..dfb1b01 --- /dev/null +++ b/_sources/CodeTailorTest/java_solution_per_puzzle.rst @@ -0,0 +1,165 @@ + +Provide a Solution-only Personalized Adaptive Puzzle in Java +-------------------------------------------------------------- + +In this example, you receive a **solution-only personalized adaptive puzzle** based on your current written code. +You can interact with the puzzle and try to solve it. +You can regenerate the puzzle based on your updated code anytime by clicking the "Regenerate Help" button. + + +:Paired Block Sets: + - Pairs a correct block with an incorrect block that is not needed in a correct solution. + - Try to use your own wrong code as distractor blocks. + + +.. activecode:: has22-example-solper-java + :language: java + :autograde: unittest + :parsonspersonalize: movable + + Create a method ``has22(nums)`` that takes an array of integers, ``nums`` and returns ``true`` if there are at least two items in the list that are adjacent and both equal to 2, otherwise return false. + + .. table:: + :name: phrase_table_solcode + :align: left + :width: 50 + + +-------------------------------------+-------------------------------+ + | Example Input | Expected Output | + +=====================================+===============================+ + | ``has22({1, 2, 2})`` | ``true`` | + +-------------------------------------+-------------------------------+ + | ``has22({1, 2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + | ``has22({2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + + + + ~~~~ + import java.util.Scanner; + import java.util.Arrays; + + public class Has22 { + public static boolean has22(int nums) { + for (int i = 0; i < nums.length - 1; i++) { + + + + + + + ==== + import static org.junit.Assert.*; + import org.junit.Test; + + class TestHelper { + public static void runAllTests() throws Exception { + if (!Has22.has22(new int[]{1, 2, 2, 3})) { + throw new Exception("Test 1 failed"); + } + if (Has22.has22(new int[]{2, 3, 2})) { + throw new Exception("Test 2 failed"); + } + if (Has22.has22(new int[]{1, 3, 4, 5})) { + throw new Exception("Test 3 failed"); + } + } + } + + + public class RunestoneTests { + @Test + public void testPhrase() throws Exception { + try { + TestHelper.runAllTests(); + System.out.println("✅ All tests passed!"); + System.out.println("Test 1: phrase(\"Sam\", \"Likes to code\") -> Sam likes to code"); + System.out.println("Test 2: phrase(123, \"code\") -> null"); + System.out.println("Test 3: phrase(\"JANE\", \"Loves JAVA\") -> Jane loves java"); + } catch (Exception e) { + System.out.println("❌ " + e.getMessage()); + fail(e.getMessage()); + } + } + } + + +.. reveal:: codetailor3_source + :showtitle: Show Source + :hidetitle: Hide Source + :modaltitle: Source for the example above + + .. code-block:: rst + + .. activecode:: has22-example-solper-java + :language: java + :autograde: unittest + :parsonspersonalize: movable + + Create a method ``has22(nums)`` that takes an array of integers, ``nums`` and returns ``true`` if there are at least two items in the list that are adjacent and both equal to 2, otherwise return false. + + .. table:: + :name: phrase_table_solcode + :align: left + :width: 50 + + +-------------------------------------+-------------------------------+ + | Example Input | Expected Output | + +=====================================+===============================+ + | ``has22({1, 2, 2})`` | ``true`` | + +-------------------------------------+-------------------------------+ + | ``has22({1, 2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + | ``has22({2, 1, 2})`` | ``false`` | + +-------------------------------------+-------------------------------+ + + + + ~~~~ + import java.util.Scanner; + import java.util.Arrays; + + public class Has22 { + public static boolean has22(int nums) { + for (int i = 0; i < nums.length - 1; i++) { + + + + + + + ==== + import static org.junit.Assert.*; + import org.junit.Test; + + class TestHelper { + public static void runAllTests() throws Exception { + if (!Has22.has22(new int[]{1, 2, 2, 3})) { + throw new Exception("Test 1 failed"); + } + if (Has22.has22(new int[]{2, 3, 2})) { + throw new Exception("Test 2 failed"); + } + if (Has22.has22(new int[]{1, 3, 4, 5})) { + throw new Exception("Test 3 failed"); + } + } + } + + + public class RunestoneTests { + @Test + public void testPhrase() throws Exception { + try { + TestHelper.runAllTests(); + System.out.println("✅ All tests passed!"); + System.out.println("Test 1: phrase(\"Sam\", \"Likes to code\") -> Sam likes to code"); + System.out.println("Test 2: phrase(123, \"code\") -> null"); + System.out.println("Test 3: phrase(\"JANE\", \"Loves JAVA\") -> Jane loves java"); + } catch (Exception e) { + System.out.println("❌ " + e.getMessage()); + fail(e.getMessage()); + } + } + } diff --git a/_sources/CodeTailorTest/multi_level_per_puzzle.rst b/_sources/CodeTailorTest/multi_level_per_puzzle.rst new file mode 100644 index 0000000..9a0c74a --- /dev/null +++ b/_sources/CodeTailorTest/multi_level_per_puzzle.rst @@ -0,0 +1,129 @@ + +Provide a Block-and-Solution Personalized Adaptive Puzzle +-------------------------------------------------------------- + +In this example, you receive a **block-and-solution personalized adaptive puzzle** based on your current written code. +You can interact with the puzzle and try to solve it. +You can regenerate the puzzle based on your updated code anytime by clicking the "Regenerate Help" button. + +:Movable Blocks: + Move the correct blocks from the left box to the right box and put them into the correct order. + +:Static Blocks: + - The Static blocks are the blocks that are already in position in the answer box. You can not move them. + - You can hover over the static blocks to see how many blocks are needed above and below them. + +:Paired Block Sets: + - Pairs a correct block with an incorrect block that is not needed in a correct solution. + - Try to use students' own wrong code as distractor blocks. + + +.. activecode:: str-mixed-example-multiper + :autograde: unittest + :nocodelens: + :parsonspersonalize: partial + + + Finish a function, ``phrase(person, thing)``: + - It has ``person`` and ``thing`` as input. + - First verify whether ``person`` and ``thing`` are strings. If not, return ``False``. + - If ``person`` and ``thing`` are two strings, return one string with the characters in ``person``, followed by an empty space, and then followed by ``thing`` + - Make sure the first letter in ``person`` is capitalized and all the characters in ``thing`` are lowercase. + + .. table:: + :name: phrase_table_multiper + :align: left + :width: 50 + + +-------------------------------------+---------------------------------------+ + | Example Input | Expected Output | + +=====================================+=======================================+ + |``phrase("Sam", "Likes to code")`` | ``"Sam likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase("ANN", "Likes to CODE")`` | ``"Ann likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase(1, "Python")`` | ``False`` | + +-------------------------------------+---------------------------------------+ + + ~~~~ + # Here is a student's buggy code + # click the "Get Help" button above to see what it provides. + + def phrase(person, thing): + if type(person) == str and type(thing) == str: + person = person.capitalize # bug 2 + thing = thing.lower() + return person + " " + thing + # more bugs ... + + + + ==== + from unittest.gui import TestCaseGui + + class myTests(TestCaseGui): + def testOne(self): + self.assertEqual(phrase("sam", "Likes to code"), "Sam likes to code", 'phrase("sam", " Likes to code")') + self.assertEqual(phrase("mary-anne", "likes to sing"), "Mary-anne likes to sing", 'phrase("mary-anne", " likes to sing")') + self.assertEqual(phrase("ANNA", "likes to dance"), "Anna likes to dance", 'phrase("ANNA", " likes to dance")') + self.assertEqual(phrase(1111, "likes programming"), False, 'phrase(1111, " likes programming")') + myTests().main() + + +.. reveal:: codetailor2_source + :showtitle: Show Source + :hidetitle: Hide Source + :modaltitle: Source for the example above + + .. code-block:: rst + + .. activecode:: str-mixed-example-multiper + :autograde: unittest + :nocodelens: + :parsonspersonalize: partial + + + Finish a function, ``phrase(person, thing)``: + - It has ``person`` and ``thing`` as input. + - First verify whether ``person`` and ``thing`` are strings. If not, return ``False``. + - If ``person`` and ``thing`` are two strings, return one string with the characters in ``person``, followed by an empty space, and then followed by ``thing`` + - Make sure the first letter in ``person`` is capitalized and all the characters in ``thing`` are lowercase. + + .. table:: + :name: phrase_table_multiper + :align: left + :width: 50 + + +-------------------------------------+---------------------------------------+ + | Example Input | Expected Output | + +=====================================+=======================================+ + |``phrase("Sam", "Likes to code")`` | ``"Sam likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase("ANN", "Likes to CODE")`` | ``"Ann likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase(1, "Python")`` | ``False`` | + +-------------------------------------+---------------------------------------+ + + ~~~~ + # Here is a student's buggy code + # click the "Get Help" button above to see what it provides. + + def phrase(person, thing): + if type(person) == str and type(thing) == str: + person = person.capitalize # bug 2 + thing = thing.lower() + return person + " " + thing + # more bugs ... + + + + ==== + from unittest.gui import TestCaseGui + + class myTests(TestCaseGui): + def testOne(self): + self.assertEqual(phrase("sam", "Likes to code"), "Sam likes to code", 'phrase("sam", " Likes to code")') + self.assertEqual(phrase("mary-anne", "likes to sing"), "Mary-anne likes to sing", 'phrase("mary-anne", " likes to sing")') + self.assertEqual(phrase("ANNA", "likes to dance"), "Anna likes to dance", 'phrase("ANNA", " likes to dance")') + self.assertEqual(phrase(1111, "likes programming"), False, 'phrase(1111, " likes programming")') + myTests().main() \ No newline at end of file diff --git a/_sources/CodeTailorTest/solution_per_puzzle.rst b/_sources/CodeTailorTest/solution_per_puzzle.rst new file mode 100644 index 0000000..5244d7e --- /dev/null +++ b/_sources/CodeTailorTest/solution_per_puzzle.rst @@ -0,0 +1,155 @@ +CodeTailor +---------- + +The primary goal is to complete the write-code problem, with the optional puzzle providing guidance and hints. +The puzzle presents essential code snippets and logic in a scrambled order. + +.. parsonsprob:: str-mixed-example-pp + :numbered: left + + Finish a function, ``phrase(person, thing)``: + - It has ``person`` and ``thing`` as input. + - First verify whether ``person`` and ``thing`` are strings. If not, return ``False``. + - If ``person`` and ``thing`` are two strings, return one string with the characters in ``person``, followed by an empty space, and then followed by ``thing`` + - Make sure the first letter in ``person`` is capitalized and all the characters in ``thing`` are lowercase. + ----- + def phrase(person, thing): # a correct solution + ===== + if type(person) == str and type(thing) == str: + ===== + person = person.capitalize() + thing = thing.lower() + return person + " " + thing + ===== + else: + ===== + return False + + +You can click the **"Get Help"** button below the problem description to access a mixed-up puzzle that will guide you through solving the write-code task. +You can click the **"Close Help"** button to close the help view and return to the main problem. +You can click the **"See Help Again"** button to reopen the help puzzle anytime. +You can click the **"Regenerate Help"** button to regenerate a new puzzle based on your current code in the write-code editor. + +Solution-only personalized adaptive puzzle +----------------------------------------------- +This provides a **solution-only personalized adaptive puzzle** based on students' current written code. +The students can interact with the puzzle and try to solve it. + +.. activecode:: str-mixed-example-solper + :autograde: unittest + :parsonspersonalize: movable + :parsonsexample: str-mixed-example-pp + + Finish a function, ``phrase(person, thing)``: + - It has ``person`` and ``thing`` as input. + - First verify whether ``person`` and ``thing`` are strings. If not, return ``False``. + - If ``person`` and ``thing`` are two strings, return one string with the characters in ``person``, followed by an empty space, and then followed by ``thing`` + - Make sure the first letter in ``person`` is capitalized and all the characters in ``thing`` are lowercase. + + .. table:: + :name: phrase_table_solper + :align: left + :width: 50 + + +-------------------------------------+---------------------------------------+ + | Example Input | Expected Output | + +=====================================+=======================================+ + |``phrase("Sam", "Likes to code")`` | ``"Sam likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase("ANN", "Likes to CODE")`` | ``"Ann likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase(1, "Python")`` | ``False`` | + +-------------------------------------+---------------------------------------+ + + ~~~~ + # Here is a student's buggy code + # click the "Get Help" button above to see what it provides. + + def phrase(person, thing): + if type(person) == str or type(thing) == str: # bug 1 + person = person.capitalize # bug 2 + thing = thing.lower() + return person + " " + thing + # more bugs ... + + + + + ==== + from unittest.gui import TestCaseGui + + class myTests(TestCaseGui): + def testOne(self): + self.assertEqual(phrase("sam", "Likes to code"), "Sam likes to code", 'phrase("sam", " Likes to code")') + self.assertEqual(phrase("mary-anne", "likes to sing"), "Mary-anne likes to sing", 'phrase("mary-anne", " likes to sing")') + self.assertEqual(phrase("ANNA", "likes to dance"), "Anna likes to dance", 'phrase("ANNA", " likes to dance")') + self.assertEqual(phrase(1111, "likes programming"), False, 'phrase(1111, " likes programming")') + + + myTests().main() + +After generating a correct solution within the puzzle, you will see a **Copy answer to clipboard** button. +You can copy the completed code to your clipboard and paste it into the write-code editor. + +Click on the "Show Source" button below to see what the reStructuredText (rst) looks like for the CodeTailor code above. + +.. reveal:: codetailor1_source + :showtitle: Show Source + :hidetitle: Hide Source + :modaltitle: Source for the example above + + .. code-block:: rst + + .. activecode:: str-mixed-example-solper + :autograde: unittest + :parsonspersonalize: movable + :parsonsexample: str-mixed-example-pp + + Finish a function, ``phrase(person, thing)``: + - It has ``person`` and ``thing`` as input. + - First verify whether ``person`` and ``thing`` are strings. If not, return ``False``. + - If ``person`` and ``thing`` are two strings, return one string with the characters in ``person``, followed by an empty space, and then followed by ``thing`` + - Make sure the first letter in ``person`` is capitalized and all the characters in ``thing`` are lowercase. + + .. table:: + :name: phrase_table_solper + :align: left + :width: 50 + + +-------------------------------------+---------------------------------------+ + | Example Input | Expected Output | + +=====================================+=======================================+ + |``phrase("Sam", "Likes to code")`` | ``"Sam likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase("ANN", "Likes to CODE")`` | ``"Ann likes to code"`` | + +-------------------------------------+---------------------------------------+ + |``phrase(1, "Python")`` | ``False`` | + +-------------------------------------+---------------------------------------+ + + ~~~~ + # Here is a student's buggy code + # click the "Get Help" button above to see what it provides. + + def phrase(person, thing): + if type(person) == str or type(thing) == str: # bug 1 + person = person.capitalize # bug 2 + thing = thing.lower() + return person + " " + thing + # more bugs ... + + + + + ==== + from unittest.gui import TestCaseGui + + class myTests(TestCaseGui): + def testOne(self): + self.assertEqual(phrase("sam", "Likes to code"), "Sam likes to code", 'phrase("sam", " Likes to code")') + self.assertEqual(phrase("mary-anne", "likes to sing"), "Mary-anne likes to sing", 'phrase("mary-anne", " likes to sing")') + self.assertEqual(phrase("ANNA", "likes to dance"), "Anna likes to dance", 'phrase("ANNA", " likes to dance")') + self.assertEqual(phrase(1111, "likes programming"), False, 'phrase(1111, " likes programming")') + + + myTests().main() diff --git a/_sources/CodeTailorTest/toctree.rst b/_sources/CodeTailorTest/toctree.rst new file mode 100644 index 0000000..3469b5e --- /dev/null +++ b/_sources/CodeTailorTest/toctree.rst @@ -0,0 +1,12 @@ +CodeTailor Test +:::::::::: + +.. toctree:: + :caption: CodeTailor Test + :maxdepth: 2 + + solution_per_puzzle.rst + multi_level_per_puzzle.rst + java_solution_per_puzzle.rst + java_multi_level_per_puzzle.rst + diff --git a/build/.gitignore b/build/.gitignore deleted file mode 100644 index 86d0cb2..0000000 --- a/build/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -# Ignore everything in this directory -* -# Except this file -!.gitignore \ No newline at end of file