Commit 611653211a467c567f7615d22f2f015550fdee93

Authored by Etienne Pallier
1 parent 98621b46
Exists in dev

nouveau my_package1.my_module1

doc/code_style/my_package1/__init__.py 0 → 100644
@@ -0,0 +1,5 @@ @@ -0,0 +1,5 @@
  1 +
  2 +'''
  3 +PACKAGE comment
  4 +
  5 +'''
doc/code_style/my_package1/my_module1.py 0 → 100755
@@ -0,0 +1,273 @@ @@ -0,0 +1,273 @@
  1 +#!/usr/bin/env python3
  2 +
  3 +from __future__ import annotations
  4 +
  5 +# TODO :
  6 +# - classmethod vs staticmethod
  7 +# - doctest
  8 +# - exception (custom)
  9 +# - dataclass
  10 +# - generic types
  11 +# TODO: return type de plusieurs params :
  12 +# def response(query: str) -> Response[str]:
  13 +# -> Any:
  14 +# -> Generic
  15 +# -> None:
  16 +# -> Sequence[T]:
  17 +# -> Dict[str, int]:
  18 +# -> [int,float]: ???
  19 +# -> List[T]:
  20 +# -> tuple[int, str]:
  21 +# ...
  22 +
  23 +
  24 +'''
  25 +=================================================================
  26 + MODULE Comment
  27 +=================================================================
  28 +'''
  29 +
  30 +
  31 +'''
  32 +=================================================================
  33 + PACKAGES IMPORT
  34 +=================================================================
  35 +'''
  36 +
  37 +# --- GENERAL PURPOSE IMPORT ---
  38 +
  39 +from typing import Dict, List, Tuple
  40 +import platform
  41 +from datetime import date
  42 +
  43 +'''
  44 +import pykwalify.core
  45 +import sys
  46 +import yaml, logging, os, pickle, time
  47 +from datetime import datetime
  48 +from pykwalify.errors import PyKwalifyException,SchemaError
  49 +from pathlib import Path
  50 +
  51 +# --- PROJECT SPECIFIC IMPORT ---
  52 +
  53 +from django.conf import settings as djangosettings
  54 +from common.models import AgentSurvey, AgentCmd, AgentLogs
  55 +from src.core.pyros_django.obsconfig.configpyros import ConfigPyros
  56 +from device_controller.abstract_component.device_controller import (
  57 + DCCNotFoundException, UnknownGenericCmdException, UnimplementedGenericCmdException, UnknownNativeCmdException
  58 +)
  59 +'''
  60 +
  61 +
  62 +'''
  63 +=================================================================
  64 + GENERAL MODULE CONSTANTS & FUNCTIONS DEFINITIONS
  65 +=================================================================
  66 +'''
  67 +
  68 +# - General constants
  69 +
  70 +DEBUG = False
  71 +
  72 +IS_WINDOWS = platform.system() == "Windows"
  73 +
  74 +
  75 +# - General Functions
  76 +
  77 +
  78 +def general_function_that_returns_a_float(arg_a: int, arg_b: str, arg_c: float=1.2, arg_d: bool=True) -> float:
  79 + '''
  80 + This function is used for ... blabla ...
  81 +
  82 + Args:
  83 + arg_a: the path of the file to wrap
  84 + arg_b: instance to wrap
  85 + arg_c: toto
  86 + arg_d: whether or not to delete the file when the File instance is destructed
  87 +
  88 + Returns:
  89 + A buffered writable file descriptor
  90 +
  91 + Raises:
  92 + AttributeError: The ``Raises`` section is a list of all exceptions
  93 + that are relevant to the interface.
  94 + ValueError: If `arg_a` is equal to `arg_b`.
  95 + '''
  96 +
  97 + # comment on a
  98 + a = 1
  99 +
  100 + # comment on b
  101 + b = 2
  102 +
  103 + return 3.5
  104 +
  105 +
  106 +def general_function_that_returns_a_tuple_of_3_elem(a: int, b: int=2, c: str='titi') -> Tuple[str, float, str]:
  107 + ''' Commentaire général sur la fonction
  108 +
  109 + Args:
  110 + a: the path of the file to wrap
  111 + b: instance to wrap
  112 + c: toto
  113 + '''
  114 +
  115 + return (a, b, c+' toto')
  116 +
  117 +
  118 +class MySuperClass1:
  119 + pass
  120 +
  121 +
  122 +class MySuperClass2:
  123 + pass
  124 +
  125 +
  126 +# '''
  127 +# =================================================================
  128 +# CLASS MyFirstClass
  129 +# =================================================================
  130 +# '''
  131 +class MySimpleClass(MySuperClass1, MySuperClass2):
  132 + ''' a Class with multi-inheritance
  133 +
  134 + blabla
  135 +
  136 + blabla
  137 + '''
  138 +
  139 + #
  140 + # The class attributes
  141 + #
  142 +
  143 + names: List[str] = ["Guido", "Jukka", "Ivan"]
  144 + ''' List is mutable'''
  145 +
  146 + version: Tuple[int, int, int] = (3, 7, 1)
  147 + ''' Tuple is UNmutable'''
  148 +
  149 + options: Dict[str, bool] = {"centered": False, "capitalize": True}
  150 + ''' Dict (is mutable) '''
  151 +
  152 + my_attr1: dict = {}
  153 + current_file = None
  154 + pickle_file = "obsconfig.p"
  155 +
  156 + #
  157 + # The class methods
  158 + #
  159 +
  160 + def __init__(self, a: int, b: float) -> None:
  161 + '''
  162 + La methode __init__ doit toujours retourner "None"
  163 +
  164 + Args:
  165 + a: blabla
  166 + '''
  167 +
  168 + c = 1
  169 + d = 2
  170 +
  171 + return False
  172 +
  173 + def __str__(self) -> str:
  174 + '''
  175 + La methode __str__ doit toujours retourner "str"
  176 + '''
  177 + return "toto"
  178 +
  179 + def my_method2(self, a: int, b: float) -> None:
  180 + a = 1
  181 + b = 2
  182 +
  183 +
  184 +# '''
  185 +# =================================================================
  186 +# CLASS Person
  187 +# =================================================================
  188 +# '''
  189 +
  190 +class Person:
  191 + """ Class to create a person, in several ways (several Factory methods)
  192 +
  193 + => Illustrate difference btw static and class methods
  194 +
  195 + Usage:
  196 +
  197 + 1) Classic Constructor :
  198 +
  199 + >>> person1 = Person('Alfredo', 21)
  200 +
  201 + 2) Class method (Factory) :
  202 +
  203 + >>> person2 = Person.fromBirthYear('Peter', 2000)
  204 + >>> person2.age
  205 + 22
  206 +
  207 + 3) Another class method (Factory) :
  208 +
  209 + >>> person3 = Person.twin('John', person2)
  210 + >>> person3.age == person2.age
  211 + True
  212 + >>> person3.name == person2.name
  213 + False
  214 +
  215 + 4) Static method (does not need access to the class attributes or methods) :
  216 +
  217 + >>> Person.isAdult(22)
  218 + True
  219 +
  220 + """
  221 +
  222 + def __init__(self, name: str, age: int) -> None:
  223 + self.name = name
  224 + self.age = age
  225 +
  226 + # a class method to create a Person object by birth year
  227 + @classmethod
  228 + def fromBirthYear(cls, name: str, year: int) -> Person:
  229 + return cls(name, date.today().year - year)
  230 +
  231 + # a class method to create a Person object from another
  232 + @classmethod
  233 + def twin(cls, name: str, p: Person) -> Person:
  234 + return cls(name, p.age)
  235 +
  236 + # a static method to check if a Person is adult or not
  237 + @staticmethod
  238 + def isAdult(age: int):
  239 + return age > 18
  240 +
  241 +
  242 +# '''
  243 +# =================================================================
  244 +# Main function (definition)
  245 +# =================================================================
  246 +# '''
  247 +
  248 +
  249 +def main() -> None:
  250 + '''
  251 + Comment on Main function definition
  252 + '''
  253 + a = 1
  254 + b = 2
  255 + c = a+b
  256 +
  257 + a = general_function_that_returns_a_tuple_of_3_elem(1, 2)
  258 + print(a)
  259 +
  260 + import doctest
  261 + doctest.testmod()
  262 +
  263 +
  264 +'''
  265 +=================================================================
  266 + Main function (execution)
  267 +=================================================================
  268 +'''
  269 +if __name__ == "__main__":
  270 + '''
  271 + Comment on Main function execution
  272 + '''
  273 + main()
doc/code_style/package1_name/__init__.py deleted
No preview for this file type
doc/code_style/package1_name/module1.py deleted
@@ -1,238 +0,0 @@ @@ -1,238 +0,0 @@
1 -#!/usr/bin/env python3  
2 -  
3 -  
4 -'''  
5 -=================================================================  
6 - PACKAGES IMPORT  
7 -=================================================================  
8 -'''  
9 -  
10 -# --- GENERAL PURPOSE IMPORT ---  
11 -  
12 -import pykwalify.core  
13 -import sys  
14 -import yaml, logging, os, pickle, time  
15 -from datetime import datetime  
16 -from pykwalify.errors import PyKwalifyException,SchemaError  
17 -from pathlib import Path  
18 -  
19 -# --- PROJECT SPECIFIC IMPORT ---  
20 -  
21 -from django.conf import settings as djangosettings  
22 -from common.models import AgentSurvey, AgentCmd, AgentLogs  
23 -from src.core.pyros_django.obsconfig.configpyros import ConfigPyros  
24 -from device_controller.abstract_component.device_controller import (  
25 - DCCNotFoundException, UnknownGenericCmdException, UnimplementedGenericCmdException, UnknownNativeCmdException  
26 -)  
27 -  
28 -  
29 -  
30 -'''  
31 -=================================================================  
32 - GENERAL MODULE CONSTANTS & FUNCTIONS DEFINITIONS  
33 -=================================================================  
34 -'''  
35 -  
36 -# - General constants  
37 -  
38 -DEBUG = False  
39 -  
40 -IS_WINDOWS = platform.system() == "Windows"  
41 -  
42 -  
43 -# - General Functions  
44 -  
45 -def general_function1(arg_a: int=1, arg_b: str='toto', arg_c: float, arg_d: bool) -> float:  
46 - '''  
47 - This function is used for ... blabla ...  
48 -  
49 - Args:  
50 - arg_a: the path of the file to wrap  
51 - arg_b: instance to wrap  
52 - arg_c: toto  
53 - arg_d: whether or not to delete the file when the File instance is destructed  
54 -  
55 - Returns:  
56 - A buffered writable file descriptor  
57 -  
58 - Raises:  
59 - AttributeError: The ``Raises`` section is a list of all exceptions  
60 - that are relevant to the interface.  
61 - ValueError: If `arg_a` is equal to `arg_b`.  
62 - '''  
63 -  
64 - # comment on a  
65 - a = 1  
66 -  
67 - # comment on b  
68 - b = 2  
69 -  
70 - return 3.5  
71 -  
72 -  
73 -def general_function2(a: int, b:int):  
74 - '''  
75 - Commentaires  
76 - '''  
77 - a = 1  
78 - b = 2  
79 -  
80 - return 3  
81 -  
82 -  
83 -  
84 -'''  
85 -=================================================================  
86 - CLASS MyFirstClass  
87 -=================================================================  
88 -'''  
89 -  
90 -class MyFirstClass:  
91 - '''  
92 - General Comment on the class  
93 - bla  
94 - bla  
95 - '''  
96 -  
97 - # The class attributes  
98 -  
99 - # comment on my_attr1  
100 - my_attr1 = {}  
101 - current_file = None  
102 - pickle_file = "obsconfig.p"  
103 - obs_config = None  
104 - devices = None  
105 - computers = None  
106 - agents = None  
107 - obs_config_file_content = None  
108 - errors = None  
109 -  
110 -  
111 - # The class methods  
112 -  
113 - def __init__(self, a: int, b: float) -> int:  
114 - '''  
115 - Commentaire sur my_method1"  
116 -  
117 - Args:  
118 - a: blabla  
119 -  
120 - Returns:  
121 - bool: [description]  
122 - '''  
123 -  
124 - c = 1  
125 - d = 2  
126 -  
127 - return False  
128 -  
129 -  
130 - def my_method2(self, a: int, b: float):  
131 - a = 1  
132 - b = 2  
133 -  
134 -  
135 -#TODO: *args et **all_kwargs  
136 -  
137 - def check_and_return_config(self, yaml_file: str, schema_file: str) -> dict:  
138 - '''  
139 - Check if yaml_file is valid for the schema_file and return an dictionary of the config file  
140 -  
141 - Args:  
142 - yaml_file: Path to the config_file to be validated  
143 - schema_file: Path to the schema file  
144 -  
145 - Returns:  
146 - dict: dictionary of the config file (with values)  
147 - '''  
148 - # disable pykwalify error to clean the output  
149 - #####logging.disable(logging.ERROR)  
150 - try:  
151 - can_yaml_file_be_read = False  
152 - while can_yaml_file_be_read != True:  
153 - if os.access(yaml_file, os.R_OK):  
154 - can_yaml_file_be_read = True  
155 - else:  
156 - print(f"{yaml_file} can't be accessed, waiting for availability")  
157 - time.sleep(0.5)  
158 -  
159 - c = pykwalify.core.Core(source_file=yaml_file, schema_files=[self.SCHEMA_PATH+schema_file])  
160 - return c.validate(raise_exception=True)  
161 - except SchemaError:  
162 - for error in c.errors:  
163 - print("Error :",str(error).split(". Path")[0])  
164 - print("Path to error :",error.path)  
165 - self.errors = c.errors  
166 - return None  
167 - except IOError:  
168 - print("Error when reading the observatory config file")  
169 -  
170 -  
171 - #TODO: @classmethod (avec cls)  
172 - @staticmethod  
173 - def check_config(yaml_file: str, schema_file: str) -> any:  
174 - """  
175 - Check if yaml_file is valid for the schema_file and return a boolean or list of errors according the schema  
176 -  
177 - Args:  
178 - yaml_file (str): Path to the config_file to be validated  
179 - schema_file (str): Path to the schema file  
180 -  
181 - Returns:  
182 - any: boolean (True) if the configuration is valid according the schema or a list of error otherwise  
183 - """  
184 - # disable pykwalify error to clean the output  
185 - ####logging.disable(logging.ERROR)  
186 - try:  
187 - can_yaml_file_be_read = False  
188 - while can_yaml_file_be_read != True:  
189 - if os.access(yaml_file, os.R_OK):  
190 - can_yaml_file_be_read = True  
191 - else:  
192 - print(f"{yaml_file} can't be accessed, waiting for availability")  
193 - time.sleep(0.5)  
194 -  
195 - c = pykwalify.core.Core(source_file=yaml_file, schema_files=[schema_file])  
196 - c.validate(raise_exception=True)  
197 - return True  
198 - except SchemaError:  
199 - for error in c.errors:  
200 - print("Error :",str(error).split(". Path")[0])  
201 - print("Path to error :",error.path)  
202 -  
203 - return c.errors  
204 - except IOError:  
205 - print("Error when reading the observatory config file")  
206 -  
207 -  
208 -  
209 -class MySecondClass:  
210 - ''' General Comment on the class '''  
211 - pass  
212 -  
213 -  
214 -#TODO: Exceptions custom  
215 -#TODO: générer doc exemple avec Sphinx  
216 -  
217 -  
218 -  
219 -'''  
220 -=================================================================  
221 - Main function  
222 -=================================================================  
223 -'''  
224 -def main():  
225 - a = 1  
226 - b = 2  
227 - c = 3  
228 -  
229 -  
230 -  
231 -'''  
232 -=================================================================  
233 - Exec of main function  
234 -=================================================================  
235 -'''  
236 -if __name__ == "__main__":  
237 -  
238 - main()