From bf5f5daa08f2b627be18819700af279d2837e0e0 Mon Sep 17 00:00:00 2001
From: Tue Herlau <tuhe@dtu.dk>
Date: Thu, 2 Sep 2021 15:34:31 +0200
Subject: [PATCH] Version committed to pypi

---
 LICENSE                                       |  19 ++++++
 README.md                                     |   6 +-
 __init__.py                                   |  35 -----------
 dist/codesnipper-0.0.1-py3-none-any.whl       | Bin 0 -> 8527 bytes
 dist/codesnipper-0.0.1.tar.gz                 | Bin 0 -> 8446 bytes
 pyproject.toml                                |   6 ++
 setup.py                                      |  56 +++++++++++-------
 src/codesnipper.egg-info/PKG-INFO             |  22 +++++++
 src/codesnipper.egg-info/SOURCES.txt          |  13 ++++
 src/codesnipper.egg-info/dependency_links.txt |   1 +
 src/codesnipper.egg-info/requires.txt         |   1 +
 src/codesnipper.egg-info/top_level.txt        |   1 +
 src/snip.egg-info/PKG-INFO                    |  22 +++++++
 src/snip.egg-info/SOURCES.txt                 |  13 ++++
 src/snip.egg-info/dependency_links.txt        |   1 +
 src/snip.egg-info/requires.txt                |   1 +
 src/snip.egg-info/top_level.txt               |   1 +
 src/snipper/__init__.py                       |   1 +
 .../__pycache__/snip_dir.cpython-38.pyc       | Bin 1920 -> 1978 bytes
 .../__pycache__/snipper.cpython-38.pyc        | Bin 12439 -> 12807 bytes
 src/snipper/snip_dir.py                       |   6 +-
 src/snipper/snipper.py                        |  32 ++++++++--
 src/snipper/version.py                        |   1 -
 23 files changed, 167 insertions(+), 71 deletions(-)
 create mode 100644 LICENSE
 delete mode 100644 __init__.py
 create mode 100644 dist/codesnipper-0.0.1-py3-none-any.whl
 create mode 100644 dist/codesnipper-0.0.1.tar.gz
 create mode 100644 pyproject.toml
 create mode 100644 src/codesnipper.egg-info/PKG-INFO
 create mode 100644 src/codesnipper.egg-info/SOURCES.txt
 create mode 100644 src/codesnipper.egg-info/dependency_links.txt
 create mode 100644 src/codesnipper.egg-info/requires.txt
 create mode 100644 src/codesnipper.egg-info/top_level.txt
 create mode 100644 src/snip.egg-info/PKG-INFO
 create mode 100644 src/snip.egg-info/SOURCES.txt
 create mode 100644 src/snip.egg-info/dependency_links.txt
 create mode 100644 src/snip.egg-info/requires.txt
 create mode 100644 src/snip.egg-info/top_level.txt
 create mode 100644 src/snipper/__init__.py
 delete mode 100644 src/snipper/version.py

diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..335ea9d
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2018 The Python Packaging Authority
+
+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.
\ No newline at end of file
diff --git a/README.md b/README.md
index cacf928..9faf7d6 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
-# snipper
-
-
-## Deployment info
+# Snip
+A lightweight framework for removing code from student solutions. Currently used at DTU. 
 
diff --git a/__init__.py b/__init__.py
deleted file mode 100644
index e6c4c87..0000000
--- a/__init__.py
+++ /dev/null
@@ -1,35 +0,0 @@
-import os
-
-# DONT't import stuff here since install script requires __version__
-
-def cache_write(object, file_name, verbose=True):
-    import compress_pickle
-    dn = os.path.dirname(file_name)
-    if not os.path.exists(dn):
-        os.mkdir(dn)
-    if verbose: print("Writing cache...", file_name)
-    with open(file_name, 'wb', ) as f:
-        compress_pickle.dump(object, f, compression="lzma")
-    if verbose: print("Done!")
-
-
-def cache_exists(file_name):
-    # file_name = cn_(file_name) if cache_prefix else file_name
-    return os.path.exists(file_name)
-
-
-def cache_read(file_name):
-    import compress_pickle # Import here because if you import in top the __version__ tag will fail.
-    # file_name = cn_(file_name) if cache_prefix else file_name
-    if os.path.exists(file_name):
-        try:
-            with open(file_name, 'rb') as f:
-                return compress_pickle.load(f, compression="lzma")
-        except Exception as e:
-            print("Tried to load a bad pickle file at", file_name)
-            print("If the file appears to be automatically generated, you can try to delete it, otherwise download a new version")
-            print(e)
-            # return pickle.load(f)
-    else:
-        return None
-
diff --git a/dist/codesnipper-0.0.1-py3-none-any.whl b/dist/codesnipper-0.0.1-py3-none-any.whl
new file mode 100644
index 0000000000000000000000000000000000000000..aaf5ead48e7a089977e5499028f603aea1e06382
GIT binary patch
literal 8527
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%0DC*vJFq&t+cThySx!^%)Sb-nO#{!$2b@LU
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
J6ZdaV{{sWvZj1l`

literal 0
HcmV?d00001

diff --git a/dist/codesnipper-0.0.1.tar.gz b/dist/codesnipper-0.0.1.tar.gz
new file mode 100644
index 0000000000000000000000000000000000000000..10f2113f9f53428f684c11322062001fb42571d2
GIT binary patch
literal 8446
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

literal 0
HcmV?d00001

diff --git a/pyproject.toml b/pyproject.toml
new file mode 100644
index 0000000..b5a3c46
--- /dev/null
+++ b/pyproject.toml
@@ -0,0 +1,6 @@
+[build-system]
+requires = [
+    "setuptools>=42",
+    "wheel"
+]
+build-backend = "setuptools.build_meta"
\ No newline at end of file
diff --git a/setup.py b/setup.py
index 5b02a2c..72a886d 100644
--- a/setup.py
+++ b/setup.py
@@ -1,38 +1,48 @@
-from setuptools import setup
+# Use this guide:
+# https://packaging.python.org/tutorials/packaging-projects/
+# from unitgrade2.version import __version__
 import setuptools
-from src.snipper.version import __version__
+# with open("src/unitgrade2/version.py", "r", encoding="utf-8") as fh:
+#     __version__ = fh.read().split(" = ")[1].strip()[1:-1]
+# long_description = fh.read()
 
 with open("README.md", "r", encoding="utf-8") as fh:
     long_description = fh.read()
 
-setup(
-    name="example-pkg-YOUR-USERNAME-HERE",
-    version=__version__,
+setuptools.setup(
+    name="codesnipper",
+    version="0.0.1",
     author="Tue Herlau",
     author_email="tuhe@dtu.dk",
-    description="A small example package",
+    description="A lightweight framework for censoring student solutions files and extracting code + output",
     long_description=long_description,
     long_description_content_type="text/markdown",
-    url="https://compute.dtu.dk/tuhe/snipper",
-    # project_urls={
-        #"Bug Tracker": "https://github.com/pypa/sampleproject/issues",
-    # },
+    license="MIT",
+    url='https://lab.compute.dtu.dk/tuhe/snipper',
+    project_urls={
+        "Bug Tracker": "https://lab.compute.dtu.dk/tuhe/snipper/issues",
+    },
     classifiers=[
         "Programming Language :: Python :: 3",
-     #   "License :: OSI Approved :: MIT License",
+        "License :: OSI Approved :: MIT License",
         "Operating System :: OS Independent",
     ],
-    package_dir={"src"},
+    package_dir={"": "src"},
     packages=setuptools.find_packages(where="src"),
-    python_requires=">=3.6",
-    install_requires=['numpy', 'jinja2', 'tabulate', 'sklearn', 'compress_pickle', "pyfiglet"],
-    # name='homework-snipper-tuhe',
-    # version=__version__,
-    # packages=['snipper'],
-    # url='https://lab.compute.dtu.dk/tuhe/unitgrade',
-    # license='Apache',
-    # author='Tue Herlau',
-    # author_email='tuhe@dtu.dk',
-    # description='A lightweight student evaluation framework build on unittest',
-    # include_package_data=True,
+    python_requires=">=3.8",
+    install_requires=['jinja2',],
 )
+
+# setup(
+#     name='unitgrade',
+#     version=__version__,
+#     packages=['unitgrade2'],
+#     url=,
+#     license='MIT',
+#     author='Tue Herlau',
+#     author_email='tuhe@dtu.dk',
+#     description="""
+# A student homework/exam evaluation framework build on pythons unittest framework. This package contains all files required to run unitgrade tests as a student. To develop tests, please use unitgrade_private.
+# """,
+#     include_package_data=False,
+# )
diff --git a/src/codesnipper.egg-info/PKG-INFO b/src/codesnipper.egg-info/PKG-INFO
new file mode 100644
index 0000000..487bc49
--- /dev/null
+++ b/src/codesnipper.egg-info/PKG-INFO
@@ -0,0 +1,22 @@
+Metadata-Version: 2.1
+Name: codesnipper
+Version: 0.0.1
+Summary: A lightweight framework for censoring student solutions files and extracting code + output
+Home-page: https://lab.compute.dtu.dk/tuhe/snipper
+Author: Tue Herlau
+Author-email: tuhe@dtu.dk
+License: UNKNOWN
+Project-URL: Bug Tracker, https://lab.compute.dtu.dk/tuhe/snipper/issues
+Platform: UNKNOWN
+Classifier: Programming Language :: Python :: 3
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Requires-Python: >=3.8
+Description-Content-Type: text/markdown
+License-File: LICENSE
+
+# Snip
+A lightweight framework for removing code from student solutions. Currently used at DTU. 
+
+
+
diff --git a/src/codesnipper.egg-info/SOURCES.txt b/src/codesnipper.egg-info/SOURCES.txt
new file mode 100644
index 0000000..8b9ec96
--- /dev/null
+++ b/src/codesnipper.egg-info/SOURCES.txt
@@ -0,0 +1,13 @@
+LICENSE
+MANIFEST.in
+README.md
+pyproject.toml
+setup.py
+src/codesnipper.egg-info/PKG-INFO
+src/codesnipper.egg-info/SOURCES.txt
+src/codesnipper.egg-info/dependency_links.txt
+src/codesnipper.egg-info/requires.txt
+src/codesnipper.egg-info/top_level.txt
+src/snipper/__init__.py
+src/snipper/snip_dir.py
+src/snipper/snipper.py
\ No newline at end of file
diff --git a/src/codesnipper.egg-info/dependency_links.txt b/src/codesnipper.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/codesnipper.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/src/codesnipper.egg-info/requires.txt b/src/codesnipper.egg-info/requires.txt
new file mode 100644
index 0000000..7f7afbf
--- /dev/null
+++ b/src/codesnipper.egg-info/requires.txt
@@ -0,0 +1 @@
+jinja2
diff --git a/src/codesnipper.egg-info/top_level.txt b/src/codesnipper.egg-info/top_level.txt
new file mode 100644
index 0000000..76fe621
--- /dev/null
+++ b/src/codesnipper.egg-info/top_level.txt
@@ -0,0 +1 @@
+snipper
diff --git a/src/snip.egg-info/PKG-INFO b/src/snip.egg-info/PKG-INFO
new file mode 100644
index 0000000..8ea5f2f
--- /dev/null
+++ b/src/snip.egg-info/PKG-INFO
@@ -0,0 +1,22 @@
+Metadata-Version: 2.1
+Name: snip
+Version: 0.0.1
+Summary: A lightweight framework for censoring student solutions files and extracting code
+Home-page: https://lab.compute.dtu.dk/tuhe/snipper
+Author: Tue Herlau
+Author-email: tuhe@dtu.dk
+License: UNKNOWN
+Project-URL: Bug Tracker, https://lab.compute.dtu.dk/tuhe/snipper/issues
+Platform: UNKNOWN
+Classifier: Programming Language :: Python :: 3
+Classifier: License :: OSI Approved :: MIT License
+Classifier: Operating System :: OS Independent
+Requires-Python: >=3.8
+Description-Content-Type: text/markdown
+License-File: LICENSE
+
+# Snip
+A lightweight framework for removing code from student solutions. Currently used at DTU. 
+
+
+
diff --git a/src/snip.egg-info/SOURCES.txt b/src/snip.egg-info/SOURCES.txt
new file mode 100644
index 0000000..bd0aac6
--- /dev/null
+++ b/src/snip.egg-info/SOURCES.txt
@@ -0,0 +1,13 @@
+LICENSE
+MANIFEST.in
+README.md
+pyproject.toml
+setup.py
+src/snip.egg-info/PKG-INFO
+src/snip.egg-info/SOURCES.txt
+src/snip.egg-info/dependency_links.txt
+src/snip.egg-info/requires.txt
+src/snip.egg-info/top_level.txt
+src/snipper/__init__.py
+src/snipper/snip_dir.py
+src/snipper/snipper.py
\ No newline at end of file
diff --git a/src/snip.egg-info/dependency_links.txt b/src/snip.egg-info/dependency_links.txt
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/src/snip.egg-info/dependency_links.txt
@@ -0,0 +1 @@
+
diff --git a/src/snip.egg-info/requires.txt b/src/snip.egg-info/requires.txt
new file mode 100644
index 0000000..7f7afbf
--- /dev/null
+++ b/src/snip.egg-info/requires.txt
@@ -0,0 +1 @@
+jinja2
diff --git a/src/snip.egg-info/top_level.txt b/src/snip.egg-info/top_level.txt
new file mode 100644
index 0000000..76fe621
--- /dev/null
+++ b/src/snip.egg-info/top_level.txt
@@ -0,0 +1 @@
+snipper
diff --git a/src/snipper/__init__.py b/src/snipper/__init__.py
new file mode 100644
index 0000000..b437600
--- /dev/null
+++ b/src/snipper/__init__.py
@@ -0,0 +1 @@
+__version__ == "0.0.1"
diff --git a/src/snipper/__pycache__/snip_dir.cpython-38.pyc b/src/snipper/__pycache__/snip_dir.cpython-38.pyc
index 90c94e065160551d01fbfaf907b3f93611e62869..50eb77d4a6c15593ccc6bfb963a021aa51a4b489 100644
GIT binary patch
delta 567
zcmYjO&ubGw6rMNP%x>2G(RHnB8)?%+)rwW=AxH!T5kwC~`~{}A8nfGUYuTo=167#?
zF(7zLn2RUbh~mMM*Zu?E`~y7q<UzzgAUHF4aA1b-eeZqWyqWjPKk&W#u4^N?zT8;u
zH2jhG4jzm?FP|Snff(9`(%>L5Xk6t;Mws4aB!&UJ240~X%q*?Z&v~c`8y40+s*oFF
z0K}`YF@p*s8JiQyVL<Fi>BK~3naezG450L5b1cmYvxf>Rwqmq1^%imSI$FP0)bzE1
zK97nwun>m4#*T4&01n#3%4hFT96<f%G<U}^guKa)b62`Xv7_TBL)dHn=kl+PKId*`
zYyN~%$|w5V8v<>LIXn+D;tIY{`Ne9YkLwSc+>+hgd4!9o@U+I@kyJ!Vkxw);tC%6C
zD-4x&g#l$Jb!M7JaTp=h4V~!U(OKEoL>%I)i;HV{miGGzU2oidk#)D|ZkE1GvtA=k
zY0_o8G)?lBI9vG!=ft1NhoJ3c$^K)SY$i0xx=G#^pNw137Qc;4mf3ll_d9G$oUXnX
z->W;|i_7Fx7|8klAkX$Yw3pK<8Bk9!axvIeg9i%?aKM(^5nsth(30d5UcI+u(NNXS
PiiUZH%qiFstLDmIBY&CT

delta 625
zcmYjPJ8u&~5Z>8)+P*u-cJPr9S<r+S34x$UnxsG|LKG3=RUjTQ?D+_f6JD<rgl1)g
z8;~d*ZG)5qooNvK1WFnjY6{c4q2v#+dvU=QtC??RzWMZNzExjWqg!EECi?xocDnN=
z+KWEG#@^?%1B5Z<Yr<hLgg1Z|-xO}{X%v76l3Pa+g0zt!W%PhbNBGP_huI5cpD+jQ
zeR60Ii~c8&Q?$px-xn-80&>(TU5%8`)m5sQ%Xx*lx_Xg_K!m8r^N4w4Ekb%Jkv{Vo
zc~*T#(7R0TU6Lh1H1%BZ*VIQiHK=1rG_X8`fOM%@)BDLPDaZ=*Wq`h(`hJ(nP)5bf
zJceT!LBA!AVW@XCSy1FxM$l{h$35%g+Zbl$0*}q)7-SWr5%5+@SjeISsy1j0$JK3m
zZtzR^*wjYUG1Nv_#t00sxk_YU*b6P!wU&6MWdUQ&7aP9*wAis|kP+pJ+VB%529hn!
zbjPd_6Qh++3rmZt=AB}2gS6+jUMbsJ^}NlUmpfUiwyhs<My=SNYLh5Sb|3JhoA4xi
zl=LU+w|x~RYS~#+sdMOiornDw9r0LM?sKTAp1a&==<ArcPj@>!?en@$_?-Ico)5d`
mY`_N_0w}9L?)}=j2HJG%X4~gY)3>DVcq{Hn6RxYb-i3dS?W17;

diff --git a/src/snipper/__pycache__/snipper.cpython-38.pyc b/src/snipper/__pycache__/snipper.cpython-38.pyc
index 76ee5eb7cb4c254035e4eadec59eb0389b6faf46..71b07e1eb0fc48f94614ddd3c0c39e38faeb6047 100644
GIT binary patch
delta 2132
zcmZ8iYj6`)6uxJ7vw1YBg|<oGP0|8gplPj)ya&pgaV(=$Wdd5;+)bN4l5&%1fei>0
zi!&C%>sSSmmnbkY$W&zp!5`{4j=%7qvws}@;UE7o%s8W>p0k01X0u<ud+xcf^PPJ#
z)jPpUp9utf3_n9wTkqeU$4cwq$72h|OoNy6igAdS@k$;XXYpA)#H;XkHlNRHcrEsn
z^98(~Hz2Fv3wa|CBdg@CJi?>Mf;`5Xcr&sPZ{u_LTx3<eozLSf$f~)rl^Ks-{cEZW
z;?r-<dL6)=j+9pe49evdtDrEwr{WGkLXHNPmvG#j@DP|X5-f*)`F(I#;{X{_j+J1L
zz;W^t8<KsYHhqL>T26&p+eeA+B+v-v6J!Z;1my&k2u47Z63@#!p-Ai{qAwGS5v(QH
zMX;M-4}nGCtUD;zRxN=8(^l0g1@_7tH9PcIs52oOYPZ9P++90gFYZEKs%_JYi_4#C
z>me`i)<(gS;kqE~k&Ek|Ydner6AHrp4{geYuZnN>D|xxDs{TuhS!y*aXqI*wxN-&x
zF3ZJX$aNINrRiVl>fqT4mIUtO-f@pra@u!>tz!qF;J5r7su?c{F=8uNj#>Iaz>yk`
zeAUv^3ilTR*cU*rQY&zRom3p(zzSw5mS1jaXoN@PKtr}JiQ92va}mTr;twnEd&2@5
zZmrx$!Od17^fQY+Usiy_%!1SG3=6Si%1&)-ag+g~8hs2!IFsr$+nWRrO^MAY;AAAB
z&J^~C+7#*A9ojrHI&6-Z>0CIOPbYGzOgh|`;k!f=y6twk!{`(?O5~=-4!78WHltKp
zjZe;V1dMB@5F^D!oaHEeY*#Wh){}J8TC3%6jf?gvK`2v$5Cos*10RUD(QCth6mp}5
zUPqyINH~g;f`Y<5jtnZ-#=Qj<gUz@r2ZM^GS_;=E74Du?cW4Ez;KE0@G_;~TmY!7c
zig>$hNDGit;VQirC(YiLpM@nq%*1J~_k-oGU<Ge_Sq>~HN+>?JbPGbPAJPiOTjy@e
zeS&e%Nfjm3x!3Yw%SWw#6t&>BG+yFjxSo44ZXE^oTJ9uWPQQFFQss@iH+DX~rgP(Z
z`DtV&Ov&4kj@Vw@hoiQwBoek_nxY#m7s1wsOmp-hy<%wYkXxcPx(0q_nM-D(4IL7V
zsP%E0B;oKbLlujtIdex1ckvd!PuAn|dbGazBvD5jowVueXeV(fHyC)Jv^)&rl>9Tg
z1#J05(<=QexgU{7o1(KelOv@Q13%P&I6wV$QyfZ;putvq^JC(yY?%{_;z5KB!q!A?
zELS|lgUmaJ&RueBP8*z?zA$GB;EY^7uTuXI&EjLZeco%jleAZ;KDma_x?d_SOPlP{
zM24F^iOlFOk?J4F89s5IhB(!SuD7@(UuZG(4~U+XlP&c%mx-=KuvK9u#Z_v4LU2WX
z(-Ohj_iM{axF(y8r^@z`d7R)Ffs}`gSmgwr)+y*17Qgd~ZL&nG-`9*z9P^Pf&{7U6
z1%_GUWa*@`LoKj^ilv01@@iMNpm5_=q%;?&h`SyrVr#rF-)}4FHMW|_|36lCNy1EL
zGXhV|%{OL5Qal>oo7o_4PJd^-qxi4jq_&pNC6|apa(Ll#jOc}htLElu!A@FG6*FAy
zC+mab_Q^o&mH^fM`_-a!Ch$MV{jEy^PT^lq4%H$nzin+<bB(6BL{LF6L2#IWw6HyW
zy;(EeJ7Nl|yrMvGfM6RzF$%Ih7D~~-g;7`B8mVTxMtgGuS=%e}>7Hb2*v#5~qM3ZI
zho=N~V1({<1hSdoJXNQj;Z!yk_uq??Gpcw*Cu^_Ml6&OUSg@A<T;h7h@rbJ;!^IcW
zc>_WI9IJ=8{3q57@5<&jv-uVp4d^mpg8|+5zu4?H+}&NyW7Nox+M0Cd=%eyh+w#XA
woYOh>jM~L4rKA^5+?*)fq~<NTw0$l-E?;bKt~7krJ{P`WpU3B8;5>K#1p%4u@&Et;

delta 1976
zcmZuxO>7%g5Z>9f*FUlILw@Wej^o&FnoUU3M3vgomK53w2|+^DAj-DFB!0H*#<kPu
zb?bz6Qks;u5>;tmrBsSq9Li4%g#(s)K;pom5(fk)IP4LS5JKX_34zMYT1_tadB2^R
zH*e;>Z{E%&wl>rFs^9OG@E1L@edd(|*Be9d-SwgJ>;0^iwXK5Q%-UJUs-(BD01M*#
zDb~rl@ZHL`vk>b+k2W^I!mJmicBZii>qDu74YDYUp%h?4EY7x}6lC&INqf5HhP7s}
zYSor^0n)YM)=q#q@j}}KEY&Wx{RO~;*|E1bg<Ilog7l_js~%EMik~_bdb1>++Vq**
zbhLePA|Du4^JFZDyMf^yXGr7(4uU}fgP=svO3;p=`FSJBXKw`iM$VB`CRiXiNU%uo
z7J*4nA+WbLC#HhCVWoCCI3dHb__phW`Zi56G1z?^^5UKDLAAaK@vwVTt>+ehboann
z;R!{96v>j)^Ol?{>+W<mmrC$bo}1!e=(XwVIGL0Yp8WhMIPp>NDLw>A%19NNK}9hY
zLo%fmn3LWE{-r6IN~ctDn2stic>^j=)5&1YiF0>qe}+QvqA6dNm^UD0U>8Op&1|U3
z8&W{3dYHOlTQQ=#0=UkB>sC!QFSCY<k9^l9<}-ck(rqOJ;>~a`_{I5fF_ghw*__=+
zf0DO~mlI9BL*jmK*uCh8_02{!ulTWdT-N-eG4gU$cceH!U3V9>kcw$J)7f$&?ZQ(Q
zpA{D(JC~smI%p_f@B&{$pCnFh{#2A)_)x)$2M`z@J_{9KZl*BDDpX`5i8&28g-14l
zsaIv@x~iOTRFsMXhtpKh3Z0VaOe=VCJ(CvXIps(q>tbJDi+Y@b|16I7iDd&!sPn@=
zHdPad&AgmJ)|hI#kR#V^B|w_nbfe}WEh7h{ipO*?uT#P_u3cEleUj-hU1|DK8Yb;*
zJd9a*4B>aG{@)N?bjKpoQ-`LWi7Ylna@l;U7!ga+LAWLEN5@;2$(<Ot<YW?WQi@ND
z;f_GxFmcy~b_skC$Kl2iMA;4f(D+z&2rU*KzKQc1@O6A~X3LYB!grFo`T1yS{R3GS
z3$dQ~W?e0nYBW1OM2W~MVQ6nt1n-&nDmDeW@Wv<9DuucxrsC0-1LR1Bq8)VszgxQy
z*P-DW8Z2d|ROVIj+qRLYE~mH!+;VWEY}D_?W=_6=&WFXW{!!SdW%}0u-WQLzx2qqb
znSUy}2Cjtdi}-+ad)3y`9NNm_n}Izsy)ju}sYJ3czreGZlZNKycWHs$A&7K-PxNS-
z`T>bm@sifl^%;r#5iEtL()<fjKPPw~R<u5NLwuy|hno0BJJNif%oho65Zn}p21nYL
z=<IgiMUtonKH$e{LqoS@AMMq0l#KLl{*L%zcrPBQVPvBJEG>Qx0qe0T^9y7>Phe+A
ziusYLZPXGqncF9~TiO4d{A=;+$Zo&g9S@UxCpUyPI<Q=$Soa9p2rd&`As{j=_v}nD
zm7h7C;?$1#62S_=F#`Gu`5l600tbTSN+gN~PhcZMO$*hxPDEPH`5EJ6QTJerOHi*X
z>ONjt&L;{bBf+v9XObw@XZ*!Nu4H5j`9v;TG<07wl`j@}eX`C$6+`L{He1TnyK)EW
z_BFL&j?*Qx`?RhW>H!sAV7i=tURN*)b{G3hO_J0t>GHWb-GTXvy0d7c%7&$&V#&pE
z@y}oo`%o@*QC!-Q3O~Z28cb?1{p3HXxuz%Wp>>Mpv6yPJcSh_P+dHyFmCf81RrXDz
kYs_uxZ6Y6uPsaLTr}%y>-Wqqed!61+Z^Y}8z#jkp2iWAnNB{r;

diff --git a/src/snipper/snip_dir.py b/src/snipper/snip_dir.py
index 4d2ff27..ca98568 100644
--- a/src/snipper/snip_dir.py
+++ b/src/snipper/snip_dir.py
@@ -12,7 +12,9 @@ def snip_dir(source_dir, dest_dir, exclude=None, clean_destination_dir=True):
         exclude = []
     if not os.path.exists(dest_dir):
         os.makedirs(dest_dir)
-    if os.path.samefile(source_dir, dest_dir):
+    source_dir = os.path.abspath(source_dir)
+    dest_dir = os.path.abspath(dest_dir)
+    if os.path.samefile( source_dir, dest_dir):
         raise Exception("Source and destination is the same")
     if clean_destination_dir:
         shutil.rmtree(dest_dir)
@@ -25,7 +27,7 @@ def snip_dir(source_dir, dest_dir, exclude=None, clean_destination_dir=True):
     # def fix_hw(info, hw, out, run_files=False, cut_files=False, students_irlc_tools=None, **kwargs):
     # CE = info['CE']
     # paths = get_paths()
-    print(f"Fixing {hw['base']} -> {out}")
+    print(f"[snipper] Synchronizing directories: {hw['base']} -> {out}")
     if os.path.exists(out):
         shutil.rmtree(out)
 
diff --git a/src/snipper/snipper.py b/src/snipper/snipper.py
index 1c0a3d3..386a360 100644
--- a/src/snipper/snipper.py
+++ b/src/snipper/snipper.py
@@ -286,17 +286,22 @@ def fix_f(lines, debug):
             comments = [id + c for c in comments]
             if len(comments) > 0:
                 lines2 += comments[0].split("\n")
-            lines2 += [id+"#!b"]
-            lines2 += (id+funrem.strip()).split("\n")
+            # lines2 += [id+"#!b"]
+            f = [id + l.strip() for l in funrem.splitlines()]
+            f[0] = f[0] + "#!b"
+
+            # lines2 += (id+funrem.strip()).split("\n")
             errm = l_head if len(l_head) > 0 else "Implement function body"
-            lines2 += [f'{id}#!b {errm}']
+            f[-1] = f[-1] + f' #!b {errm}'
+            lines2 += f
+            # lines2 += [f'{id}#!b {errm}']
 
         else:
             lines2.append(l)
             i += 1
     return lines2
 
-def fix_b2(lines):
+def fix_b2(lines, keep=False):
     stats = {'n': 0}
     def block_fun(lines, start_extra, end_extra, art, stats=None, **kwargs):
         id = indent(lines[0])
@@ -307,8 +312,12 @@ def fix_b2(lines):
         if len(ee) >= 2 and ee[0] == '"':
             ee = ee[1:-1]
         start_extra = start_extra.strip()
-        l2 = ([id+start_extra] if len(start_extra) > 0 else []) + [id + f"# TODO: {cc} lines missing.",
-                                         id+f'raise NotImplementedError("{ee}")']
+        if keep:
+            l2 = ['GARBAGE'] * cc
+        else:
+            l2 = ([id+start_extra] if len(start_extra) > 0 else []) + [id + f"# TODO: {cc} lines missing.", id+f'raise NotImplementedError("{ee}")']
+
+
         # if "\n".join(l2).find("l=l")>0:
         #     a = 2342342
         stats['n'] += cc
@@ -386,6 +395,17 @@ def full_strip(lines, tags=None):
         lines = strip_tag(lines, t)
     return lines
 
+
+def censor_code(lines, keep=True):
+    # lines = code.split("\n")
+    dbug = True
+    lines = fix_f(lines, dbug)
+    lines, nB, cut = fix_b2(lines, keep=True)
+    return lines
+
+    # print("safs")
+
+
 def censor_file(file, info, paths, run_files=True, run_out_dirs=None, cut_files=True, solution_list=None,
                 censor_files=True,
                 include_path_base=None,
diff --git a/src/snipper/version.py b/src/snipper/version.py
deleted file mode 100644
index f102a9c..0000000
--- a/src/snipper/version.py
+++ /dev/null
@@ -1 +0,0 @@
-__version__ = "0.0.1"
-- 
GitLab