This commit is contained in:
stubbfel
2017-10-23 00:39:59 +02:00
commit d05a2fd5a8
40 changed files with 811 additions and 0 deletions

173
.gitignore vendored Normal file
View File

@@ -0,0 +1,173 @@
# Created by https://www.gitignore.io/api/python,pycharm
### PyCharm ###
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries
# Sensitive or high-churn files:
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.xml
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
# Gradle:
.idea/**/gradle.xml
.idea/**/libraries
# CMake
cmake-build-debug/
# Mongo Explorer plugin:
.idea/**/mongoSettings.xml
## File-based project format:
*.iws
## Plugin-specific files:
# IntelliJ
/out/
# mpeltonen/sbt-idea plugin
.idea_modules/
# JIRA plugin
atlassian-ide-plugin.xml
# Cursive Clojure plugin
.idea/replstate.xml
# Ruby plugin and RubyMine
/.rakeTasks
# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties
### PyCharm Patch ###
# Comment Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-215987721
# *.iml
# modules.xml
# .idea/misc.xml
# *.ipr
# Sonarlint plugin
.idea/sonarlint
### Python ###
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*.cover
.hypothesis/
# Translations
*.mo
*.pot
# Django stuff:
*.log
local_settings.py
# Flask stuff:
instance/
.webassets-cache
# Scrapy stuff:
.scrapy
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# Jupyter Notebook
.ipynb_checkpoints
# pyenv
.python-version
# celery beat schedule file
celerybeat-schedule
# SageMath parsed files
*.sage.py
# Environments
.env
.venv
env/
venv/
ENV/
env.bak/
venv.bak/
# Spyder project settings
.spyderproject
.spyproject
# Rope project settings
.ropeproject
# mkdocs documentation
/site
# mypy
.mypy_cache/
# End of https://www.gitignore.io/api/python,pycharm

4
.idea/misc.xml generated Normal file
View File

@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectRootManager" version="2" project-jdk-name="Python 2.7.13 (/usr/bin/python2.7)" project-jdk-type="Python SDK" />
</project>

8
.idea/modules.xml generated Normal file
View File

@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/typefs.iml" filepath="$PROJECT_DIR$/.idea/typefs.iml" />
</modules>
</component>
</project>

13
.idea/typefs.iml generated Normal file
View File

@@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="PYTHON_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
</component>
<component name="TestRunnerService">
<option name="PROJECT_TEST_RUNNER" value="Unittests" />
</component>
</module>

View File

@@ -0,0 +1 @@
../../basetypes/int

View File

@@ -0,0 +1 @@
../../myApp/myType

View File

View File

View File

View File

0
src/typefs/__init__.py Normal file
View File

View File

View File

View File

View File

@@ -0,0 +1,23 @@
c_object_type_template = """
#ifndef {TYPE_NAME_UPPER}_T_H
#define {TYPE_NAME_UPPER}_T_H
{includes}
#pragma pack(push, 1)
typedef struct {type_name_lower}_sTag
{
{members}
} {type_name_lower}_s, *ptr_{type_name_lower}_s;
#pragma pack(pop)
#endif // TYPE_NAME_UPPER_T_H
"""
c_value_type_template = """
tbd
"""

View File

View File

View File

View File

View File

View File

@@ -0,0 +1,3 @@
class ObjectGenerator:
def __init__(self):
pass

View File

@@ -0,0 +1,78 @@
from typefs.member import Member
from typefs.type import Type
from typefs.namespace import Namespace
def create_type(name, type_value_json):
"""
:param name: str
:param type_value_json: dict
:return: Type
"""
members = create_members(type_value_json.get("members", {}))
meta_info = type_value_json.get("meta")
return Type(name, members, meta_info)
def create_types(types_json):
"""
:param types_json: dict
:return: Type[]
"""
type_list = []
for type_name, type_json in types_json.iteritems():
type_list.append(create_type(type_name, type_json))
return type_list
def create_members(members_json):
"""
:param members_json: dict
:return: Member[]
"""
member_list = []
for member_name, member_json in members_json.iteritems():
member_list.append(create_member(member_name, member_json))
return member_list
def create_member(name, member_value_json):
"""
:param name: str
:param member_value_json: dict
:return: Member
"""
types = create_types(member_value_json["type"])
member_order = member_value_json.get("order", 0)
return Member(name, types[0], member_order)
def create_namespace(name, namespace_value_json):
"""
:param name: str
:param namespace_value_json: dict
:return: Namespace
"""
types = create_types(namespace_value_json)
return Namespace(name, types)
def create_namespaces(namespaces_json):
"""
:param namespaces_json: dict
:return: Namespace[]
"""
namespaces_list = []
for namespace_name, namespace_json in namespaces_json.iteritems():
namespaces_list.append(create_namespace(namespace_name, namespace_json))
return namespaces_list

52
src/typefs/member.py Normal file
View File

@@ -0,0 +1,52 @@
from name import Name
class Member(Name):
def __init__(self, name, member_type=None, member_order=0):
"""
:param name: typefs.name.Name
:param member_type: typefs.type.Type
"""
Name.__init__(self, name)
self.__member_type = member_type
self.__member_order = member_order
def is_type_of(self):
return self.__member_type
def __eq__(self, other):
return Name.__eq__(self, other) and self.__member_type == other.__member_type \
and self.__member_order == other.__member_order
def __lt__(self, other):
"""
:param other: typefs.member.Member
:return: bool
"""
return self.__member_order < other.__member_order
def __le__(self, other):
"""
:param other: typefs.member.Member
:return: bool
"""
return self.__member_order <= other.__member_order
def __gt__(self, other):
"""
:param other: typefs.member.Member
:return: bool
"""
return self.__member_order > other.__member_order
def __ge__(self, other):
"""
:param other: typefs.member.Member
:return: bool
"""
return self.__member_order >= other.__member_order

33
src/typefs/name.py Normal file
View File

@@ -0,0 +1,33 @@
import util.operator
class Name:
def __init__(self, value_string):
"""
:param value_string: object which support str()
"""
self.__value_string = str(value_string)
def __str__(self):
"""
:return: str
"""
return self.__value_string
def __eq__(self, other):
"""
:param other: typefs.name.Name
:return: bool
"""
return type(self) == type(other) and (self.__value_string == other.__value_string)
def __ne__(self, other):
"""
:param other: typefs.name.Name
:return: bool
"""
return not self == other

41
src/typefs/namespace.py Normal file
View File

@@ -0,0 +1,41 @@
import util.list
from name import Name
class Namespace(Name):
def __init__(self, name, type_list):
"""
:param name: typefs.name.Name
:param type_list: typefs.type.Type[]
"""
Name.__init__(self, name)
self.__type_list = type_list
def add_type(self, new_type):
"""
:param new_type: typefs.type.Type
:return: typefs.namespace.Namespace
"""
def new_namespace():
return Namespace(self, util.list.append(self.__type_list, new_type))
return util.list.contains_value(self.__type_list, new_type, lambda: self, new_namespace)
def remove_type(self, delete_type):
"""
:param delete_type: typefs.type.Type
:return: typefs.namespace.Namespace
"""
return Namespace(self, util.list.remove(self.__type_list, delete_type))
def __len__(self):
return len(self.__type_list)
def __eq__(self, other):
return Name.__eq__(self, other) and len(self) == len(other)
def __getitem__(self, item):
return self.__type_list[item]

50
src/typefs/type.py Normal file
View File

@@ -0,0 +1,50 @@
import util.operator
import util.list
from name import Name
class Type(Name):
def __init__(self, name, member_list=None, meta_info=None):
"""
:type meta_info: dict
:param name: typefs.name.Name
:param member_list: typefs.member.Member[]
"""
Name.__init__(self, name)
self.__member_list = None
self.__meta_info = None
self.__member_list = util.operator.assign(lambda: member_list is None, lambda: [], lambda: member_list)
self.__meta_info = util.operator.assign(lambda: meta_info is None, lambda: {}, lambda: meta_info)
def add_member(self, new_member):
"""
:param new_member: typefs.member.Member
:return: typefs.type.Type
"""
def new_type():
return Type(self, util.list.append(self.__member_list, new_member), dict(self.__member_list))
return util.list.contains_value(self.__member_list, new_member, lambda: self, new_type)
def remove_member(self, delete_member):
"""
:param delete_member: typefs.member.Member
:return: typefs.type.Type
"""
return Type(self, util.list.remove(self.__member_list, delete_member), dict(self.__meta_info))
def __eq__(self, other):
return Name.__eq__(self, other) and len(self) == len(other)
def __len__(self):
return len(self.__member_list)
def __iter__(self):
iter(self.__member_list)
def __getitem__(self, item):
return self.__member_list[item]

View File

96
src/typefs/util/list.py Normal file
View File

@@ -0,0 +1,96 @@
def contains_value_bool(object_list, compare_object):
"""
:param object_list: object[]
:param compare_object: object
:return:
"""
return contains_value(object_list, compare_object, lambda: True, lambda: False)
def contains_ref_bool(object_list, compare_object):
"""
:param object_list: object[]
:param compare_object: object
:return:
"""
return contains_ref(object_list, compare_object, lambda: True, lambda: False)
def contains_value(object_list, compare_object, create_is_in_result, create_is_not_in_result):
"""
:param object_list: object[]
:param compare_object: object
:param create_is_in_result: () -> object
:param create_is_not_in_result: () -> object
:return:
"""
return contains(object_list, compare_object, lambda x, y: x == y, create_is_in_result, create_is_not_in_result)
def contains_ref(object_list, compare_object, create_is_in_result, create_is_not_in_result):
"""
:param object_list: object[]
:param compare_object: object
:param create_is_in_result: () -> object
:param create_is_not_in_result: () -> object
:return:
"""
return contains(object_list, compare_object, lambda x, y: x is y, create_is_in_result, create_is_not_in_result)
def contains(object_list, compare_object, compare, create_is_in_result, create_is_not_in_result):
"""
:param object_list: object[]
:param compare_object: object
:param compare: (object, object) -> bool
:param create_is_in_result: () -> object
:param create_is_not_in_result: () -> object
:return : object
"""
for list_item in object_list:
if compare(list_item, compare_object):
return create_is_in_result()
return create_is_not_in_result()
def modify(object_list, modify_action):
"""
:param object_list: object[]
:param modify_action: (object[]) -> None
:return: object[]
"""
new_list = list(object_list)
try:
modify_action(new_list)
except ValueError:
pass
return new_list
def append(object_list, new_object):
"""
:param object_list: object[]
:param new_object: object
:return: object[]
"""
return modify(object_list, lambda lst: lst.append(new_object))
def remove(object_list, new_object):
"""
:param object_list: object[]
:param new_object: object
:return: object[]
"""
return modify(object_list, lambda lst: lst.remove(new_object))

View File

@@ -0,0 +1,5 @@
def assign(compare, condition_true_action, condition_false_action):
if compare():
return condition_true_action()
else:
return condition_false_action()

0
test/typefs/__init__.py Normal file
View File

View File

View File

View File

@@ -0,0 +1,70 @@
import unittest
from typefs.member import Member
from typefs.type import Type
import typefs.generator.object.json as json_generator
from typefs.namespace import Namespace
class TestObjectGenerator(unittest.TestCase):
def test_create_member(self):
json = {"member1": {"type": {"int": {"meta": {"type": "pointer"}}}, "order": 1}}
self.assertEqual([Member("member1", Type("int"), 1)], json_generator.create_members(json))
def test_create_type(self):
json = {
"type_1": {
"members": {
"member1": {
"type": {"int": {}},
"order": 1
},
"member2": {
"order": 2,
"type": {"namespace_1.type_1": {}},
}
},
"meta": {}
}
}
members = [Member("member1", Type("int"), 1), Member("member2", Type("namespace_1.type_1*"), 2)]
result_objects = json_generator.create_types(json)
self.assertEqual([Type("type_1", members)], result_objects)
self.assertEqual("type_1", str(result_objects[0]))
self.assertEqual("member1", str(result_objects[0][0]))
self.assertEqual("member2", str(result_objects[0][1]))
self.assertEqual("int", str(result_objects[0][0].is_type_of()))
self.assertEqual("namespace_1.type_1", str(result_objects[0][1].is_type_of()))
def test_create_namespace(self):
json = {
"namespace_1": {
"type_1": {
"members": {
"member1": {
"type": {"int": {}},
"order": 1
},
"member2": {
"type": {"namespace_1.type_1": {}},
"order": 1
}
},
"meta": {
"c": {
"dependencies": ["#include <foo.h>"],
"type": "complex_type"
}
}
}
}
}
members = [Member("member1", Type("int"), 1), Member("member2", Type("namespace_1.type_1"), 2)]
types = [Type("type_1", members)]
self.assertEqual([Namespace("namespace_1", types)], json_generator.create_namespaces(json))
if __name__ == '__main__':
unittest.main()

View File

@@ -0,0 +1,21 @@
import unittest
from typefs.member import Member
class TestMember(unittest.TestCase):
def test_order(self):
self.assertLess(Member("foo", None, 1), Member("foo", None, 2))
self.assertLessEqual(Member("foo", None, -2), Member("foo", None, -2))
self.assertEqual(Member("foo", None, 2), Member("foo", None, 2))
self.assertGreaterEqual(Member("foo", None, -1), Member("foo", None, -1))
self.assertGreater(Member("foo", None, 0), Member("foo", None, -1))
self.assertLess(Member("foo", None, 1), Member("bar", None, 2))
self.assertLessEqual(Member("foo", None, -2), Member("bar", None, -2))
self.assertNotEqual(Member("foo", None, 2), Member("bar", None, 2))
self.assertGreaterEqual(Member("foo", None, -1), Member("bar", None, -1))
self.assertGreater(Member("foo", None, 0), Member("bar", None, -1))
if __name__ == '__main__':
unittest.main()

22
test/typefs/test_name.py Normal file
View File

@@ -0,0 +1,22 @@
import unittest
from typefs.name import Name
class TestName(unittest.TestCase):
def test_to_string(self):
self.assertEqual(str(Name("foo")), "foo")
self.assertEqual(str(Name(Name("foo"))), "foo")
def test_equal(self):
name = Name("bar")
self.assertEqual(Name("foo"), Name("foo"))
self.assertEqual(Name(Name("foo")), Name("foo"))
self.assertNotEqual(Name("foo"), Name("bar"))
self.assertNotEqual(Name(Name("foo")), Name("bar"))
self.assertIsNot(name, Name("bar"))
self.assertIs(name, name)
if __name__ == '__main__':
unittest.main()

View File

@@ -0,0 +1,22 @@
import unittest
from typefs.type import Type
from typefs.namespace import Namespace
class TestNamespace(unittest.TestCase):
def test_add_member(self):
namespace = Namespace("space1", [])
test_type = Type("myType")
self.assertEqual(1, len(namespace.add_type(test_type)))
self.assertEqual(1, len(namespace.add_type(test_type).add_type(test_type)))
def test_remove_member(self):
test_type = Type("myType")
namespace = Namespace("space1", []).add_type(test_type)
self.assertEqual(1, len(namespace.remove_type(Type("myType2"))))
self.assertEqual(0, len(namespace.remove_type(test_type)))
if __name__ == '__main__':
unittest.main()

22
test/typefs/test_type.py Normal file
View File

@@ -0,0 +1,22 @@
import unittest
from typefs.type import Type
from typefs.member import Member
class TestType(unittest.TestCase):
def test_add_member(self):
member = Member("member1")
test_type = Type("myType")
self.assertEqual(1, len(test_type.add_member(member)))
self.assertEqual(1, len(test_type.add_member(member).add_member(member)))
def test_remove_member(self):
member = Member("member1")
test_type = Type("myType").add_member(member)
self.assertEqual(1, len(test_type.remove_member(Member("member2"))))
self.assertEqual(0, len(test_type.remove_member(member)))
if __name__ == '__main__':
unittest.main()

View File

View File

@@ -0,0 +1,61 @@
import unittest
import typefs.util.list as lst
class SomeObject:
def __init__(self, value=1):
self.value = value
def __eq__(self, other):
return self.value == other.value
def __ne__(self, other):
return not self == other
class TestList(unittest.TestCase):
def setUp(self):
self.__0 = SomeObject(0)
self.__1 = SomeObject(1)
self.__2 = SomeObject(2)
self.__3 = SomeObject(3)
self.__4 = SomeObject(4)
self.__5 = SomeObject(5)
self.__23 = SomeObject(23)
self.__array1 = [self.__1, self.__2, self.__3, self.__4, self.__5]
self.__array2 = [self.__23, SomeObject(23), SomeObject(23), SomeObject(23), SomeObject(23)]
def test_contains(self):
self.assertFalse(lst.contains(self.__array1, self.__0, lambda x, y: x == y, lambda: True, lambda: False))
self.assertTrue(lst.contains(self.__array1, self.__1, lambda x, y: x == y, lambda: True, lambda: False))
def test_contains_value(self):
self.assertFalse(lst.contains_value(self.__array1, self.__0, lambda: True, lambda: False))
self.assertTrue(lst.contains_value(self.__array1, self.__1, lambda: True, lambda: False))
def test_contains_value_bool(self):
self.assertFalse(lst.contains_value_bool(self.__array1, self.__0))
self.assertTrue(lst.contains_value_bool(self.__array1, self.__1))
def test_contains_ref(self):
self.assertFalse(lst.contains_ref(self.__array2, self.__0, lambda: True, lambda: False))
self.assertTrue(lst.contains_ref(self.__array2, self.__23, lambda: True, lambda: False))
def test_contains_ref_bool(self):
self.assertFalse(lst.contains_ref_bool(self.__array2, self.__0))
self.assertTrue(lst.contains_ref_bool(self.__array2, self.__23))
def test_modify(self):
self.assertEqual([3, 2, 1], lst.modify([1, 2, 3], lambda l: l.reverse()))
def test_append(self):
self.assertItemsEqual([1, 2, 3, 4], lst.append([1, 2, 3], 4))
def test_remove(self):
self.assertItemsEqual([1, 2, 3], lst.remove([1, 2, 3, 4], 4))
if __name__ == '__main__':
unittest.main()

View File

@@ -0,0 +1,12 @@
import unittest
import typefs.util.operator as op
class TestOperator(unittest.TestCase):
def test_assign(self):
self.assertFalse(op.assign(lambda: True is False, lambda: True, lambda: False))
self.assertTrue(op.assign(lambda: True is True, lambda: True, lambda: False))
if __name__ == '__main__':
unittest.main()