linuxdcpp-team team mailing list archive
-
linuxdcpp-team team
-
Mailing list archive
-
Message #08091
[Branch ~dcplusplus-team/dc-plugin-sdk/trunk] Rev 14: Adding Python base library
------------------------------------------------------------
revno: 14
committer: Fredrik Ullner <ullner@xxxxxxxxx>
branch nick: dc-plugin-sdk
timestamp: Tue 2014-05-06 22:38:46 +0200
message:
Adding Python base library
added:
Libraries/PyPlugin.DataTypes/
Libraries/PyPlugin.DataTypes/DCPluginBase.py
Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py
Libraries/PyPlugin.DataTypes/DataTypes.py
Libraries/PyPlugin.DataTypes/Enumerations.py
Libraries/PyPlugin.DataTypes/IDCPlugin.py
Libraries/PyPlugin.DataTypes/IDCPluginSink.py
Libraries/PyPlugin.DataTypes/__init__.py
--
lp:dc-plugin-sdk
https://code.launchpad.net/~dcplusplus-team/dc-plugin-sdk/trunk
Your team Dcplusplus-team is subscribed to branch lp:dc-plugin-sdk.
To unsubscribe from this branch go to https://code.launchpad.net/~dcplusplus-team/dc-plugin-sdk/trunk/+edit-subscription
=== added directory 'Libraries/PyPlugin.DataTypes'
=== added file 'Libraries/PyPlugin.DataTypes/DCPluginBase.py'
--- Libraries/PyPlugin.DataTypes/DCPluginBase.py 1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/DCPluginBase.py 2014-05-06 20:38:46 +0000
@@ -0,0 +1,145 @@
+
+from IDCPlugin import *
+from Enumerations import *
+
+import traceback
+
+class DCPluginBase(IDCPlugin):
+
+ def __init__(self):
+ self._info = PluginInformation();
+ self._sink = "";
+
+ """ Properties """
+ def GetInfo(self):
+ return self._info;
+ def SetInfo(self, info):
+ self._info = info;
+
+ def GetSink(self):
+ return self._sink;
+ def SetSink(self, sink):
+ self._sink = sink;
+
+ """ Methods """
+ def Initialize(self, install, runtime):
+ """ if install: """
+ """ This only executes when the plugin has been installed for the first time. """
+
+ """ if runtime: """
+ """ If the plugin doesn't support being enabled at runtime, cancel its loading here. """
+
+ return True;
+
+ def Uninitialize(self):
+ return True;
+
+ """ Hooks """
+
+ """ Chat """
+ def OnChatIncoming(self, hubData, data, refBreak):
+ return False;
+
+ def OnChatOutgoing(self, hubData, data, refBreak):
+ return False;
+
+ def OnChatIncomingPM(self, userData, data, refBreak):
+ return False;
+
+ """ Timer """
+ def OnTimerSecond(self, data, refBreak):
+ return False;
+
+ def OnTimerMinute(self, data, refBreak):
+ return False;
+
+ """ Hubs """
+ def OnHubOnline(self, hubData, refBreak):
+ return False;
+
+ def OnHubOffline(self, hubData, refBreak):
+ return False;
+
+ """ Users """
+ def OnUserOnline(self, userData, refBreak):
+ return False;
+
+ def OnUserOffline(self, userData, refBreak):
+ return False;
+
+ """ Network """
+ def OnNetworkHubDataIn(self, hubData, data, refBreak):
+ return False;
+
+ def OnNetworkHubDataOut(self, hubData, data, refBreak):
+ return False;
+
+ def OnNetworkClientDataIn(self, connectionData, data, refBreak):
+ return False;
+
+ def OnNetworkClientDataOut(self, connectionData, data, refBreak):
+ return False;
+
+ def OnNetworkUDPDataIn(self, udpData, data, refBreak):
+ return False;
+
+ def OnNetworkUDPDataOut(self, udpData, data, refBreak):
+ return False;
+
+ """ Queue """
+ def OnQueueAdded(self, queueData, refBreak):
+ return False;
+
+ def OnQueueMoved(self, queueData, refBreak):
+ return False;
+
+ def OnQueueRemoved(self, queueData, refBreak):
+ return False;
+
+ def OnQueueFinished(self, queueData, refBreak):
+ return False;
+
+ """ UI """
+ def OnUICreated(self, data, refBreak):
+ return False;
+
+ def OnUIChatTags(self, userData, tagData, refBreak):
+ return False;
+
+ def OnUIChatDisplay(self, userData, stringData, refBreak):
+ return False;
+
+ def OnUIChatCommand(self, hubData, data, refBreak):
+ return False;
+
+ def OnUIChatCommandPM(self, userData, data, refBreak):
+ return False;
+
+ """ Methods """
+
+ def LogException(self, exceptionMessage):
+ self.LogError("An unknown exception occured: " + exceptionMessage);
+
+ def LogException(self, exception):
+ self.LogException(exception, True);
+
+ def LogException(self, exception, logStacktrace):
+ if logStacktrace:
+ self.LogError("An exception occured with stacktrace: " + exception.format_exc());
+ else:
+ self.LogError("An exception occured: " + exception.format_exc());
+
+ def LogError(self, message):
+ self.LogMessage("[ERROR] " + message);
+
+ def LogWarning(self, message):
+ self.LogMessage("[WARNING] " + message);
+
+ def LogMessage(self, message):
+ self.GetSink().LogMessage( "[" + self.GetInfo().GetName() + "]" + message);
+
+ def TryIt(self, sink):
+ print( "In tryit");
+ sink.SendData("I like dogs");
+ print( "after tryit");
+
=== added file 'Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py'
--- Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py 1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/DCPluginSinkProxy.py 2014-05-06 20:38:46 +0000
@@ -0,0 +1,134 @@
+
+from IDCPluginSink import *
+
+import DCPluginSink
+
+class DCPluginProxySink(IDCPluginSink):
+
+ def __init__(self, sink):
+ self._sink = sink;
+
+ """ Core """
+ def GetApplicationName(self):
+ return DCPluginSink.GetApplicationName(self._sink);
+
+ def SetApplicationName(self, name):
+ DCPluginSink.SetApplicationName(self._sink, name);
+
+ """ Log """
+ def LogMessage(self, message):
+ DCPluginSink.LogMessage(self._sink, message);
+
+ """ Config """
+ def GetInstallPath(self):
+ return DCPluginSink.GetInstallPath(self._sink);
+
+ def GetPath(self, pathType):
+ return DCPluginSink.GetPath(self._sink, pathType);
+
+ def GetStringConfig(self, name):
+ return DCPluginSink.GetStringConfig(self._sink, name);
+ def SetStringConfig(self, name, value):
+ DCPluginSink.SetStringConfig(self._sink, name, value);
+
+ def GetBoolConfig(self, name):
+ return DCPluginSink.GetBoolConfig(self._sink, name);
+ def SetBoolConfig(self, name, value):
+ DCPluginSink.SetStringConfig(self._sink, name, value);
+
+ def GetInt32Config(self, name):
+ return DCPluginSink.GetInt32Config(self._sink, name);
+ def SetInt32Config(self, name, value):
+ DCPluginSink.SetStringConfig(self._sink, name, value);
+
+ def GetInt64Config(self, name):
+ return DCPluginSink.GetInt64Config(self._sink, name);
+ def SetInt64Config(self, name, value):
+ DCPluginSink.SetStringConfig(self._sink, name, value);
+
+ def GetLanguage(self):
+ return DCPluginSink.GetLanguage(self._sink);
+
+ """ Connection """
+ def SendUDPData(self, ipAddress, port, data, amount):
+ DCPluginSink.SendUDPData(self._sink, ipAddress, port, data, amount);
+
+ def SendProtocolCommand(self, connectionData, command):
+ DCPluginSink.SendProtocolCommand(self._sink, connectionData, command);
+
+ def TerminateConnection(self, connectionData, graceLess):
+ DCPluginSink.TerminateConnection(self._sink, connectionData, graceLess);
+
+ def GetConnectionUser(self, connectionData):
+ return DCPluginSink.GetConnectionUser(self._sink, connectionData);
+
+ """ Hub """
+ def AddHub(self, url, nick, password):
+ return DCPluginSink.AddHub(self._sink, url, nick, password);
+
+ def FindHub(self, url):
+ return DCPluginSink.FindHub(self._sink, url);
+
+ def RemoveHub(self, hubData):
+ DCPluginSink.RemoveHub(self._sink, hubData);
+
+ def EmulateProtocolCommand(self, hubData, command):
+ DCPluginSink.EmualteProtocolCommand(self._sink, hubData, command);
+
+ def SendProtocolCommand(self, hubData, command):
+ DCPluginSink.SendProtocolCommand(self._sink, hubData, command);
+
+ def SendMessage(self, hubData, message, thirdPerson):
+ DCPluginSink.SendMessage(self._sink, hubData, message, thirdPerson);
+
+ def LocalMessage(self, hubData, message, messageType):
+ DCPluginSink.LocalMessage(self._sink, hubData, message, messageType);
+
+ def SendPrivateMessage(self, userData, message, thirdPerson):
+ DCPluginSink.SendPrivateMessage(self._sink, userdata, message, thirdPerson);
+
+ def FindUser(self, cid, hubURL):
+ return DCPluginSink.FindUser(self._sink, cid, hubURL);
+
+ """ Queue """
+ def AddList(self, userData, silent):
+ return DCPluginSink.AddList(self._sink, userData, silent);
+
+ def AddDownload(self, hashData, size, target):
+ return DCPluginSink.AddDownload(self._sink, hashData, size, target);
+
+ def FindDownload(self, target):
+ return DCPluginSink.FindDownload(self._sink, target);
+
+ def RemoveDownload(self, queueData):
+ DCPluginSink.RemoveDownload(self._sink, queueData);
+
+ def SetPriority(self, queueData, priority):
+ DCPluginSink.SetPriority(self._sink, queueData, priority);
+
+ def Pause(self, queueData):
+ return DCPluginSink.Pause(self._sink, queueData);
+
+ """ Tagger """
+ def GetText(self, tagData):
+ return DCPluginSink.GetText(self._sink, tagData);
+
+ def AddTag(self, tagData, startPlace, endPlace, tagId, attributes):
+ DCPluginSink.AddTag(self._sink, tagData, startPlace, endPlace, tagId, attributes);
+
+ def ReplaceTagText(self, tagData, startPlace, endPlace, replacement):
+ DCPluginSink.ReplaceTagText(self._sink, tagData, startPlace, endPlace, replacement);
+
+ """ UI """
+ def AddCommand(self, name):
+ DCPluginSink.AddCommand(self._sink, name);
+
+ def RemoveCommand(self, name):
+ DCPluginSink.RemoveCommand(self._sink, name);
+
+ def PlaySoundInUI(self, path):
+ DCPluginSink.PlaySoundInUI(self._sink, path);
+
+ def Notify(self, title, message):
+ DCPluginSink.Notify(self._sink, title, message);
+
=== added file 'Libraries/PyPlugin.DataTypes/DataTypes.py'
--- Libraries/PyPlugin.DataTypes/DataTypes.py 1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/DataTypes.py 2014-05-06 20:38:46 +0000
@@ -0,0 +1,227 @@
+
+class PluginSetting:
+ def __init__(self):
+ self._name = "";
+ self._value = "";
+ self._defaultvalue = "";
+ self._datatype = "";
+ self._description = "";
+ self._validvalues = "";
+
+ def GetName(self):
+ return self._name;
+ def SetName(self, value):
+ self._name = value;
+
+ def GetValue(self):
+ return self._value;
+ def SetValue(self, value):
+ self._value = value;
+
+ def GetDefaultValue(self):
+ return self._defaultvalue;
+ def SetDefaultValue(self, value):
+ self._defaultvalue = value;
+
+ def GetDataType(self):
+ return self._datatype;
+ def SetDataType(self, value):
+ self._datatype = value;
+
+ def GetDescription(self):
+ return self._description;
+ def SetDescription(self, value):
+ self._description = value;
+
+ def GetValidValues(self):
+ return self._validvalues;
+ def SetValidValues(self, value):
+ self._validvalues = value;
+
+class CommandData:
+ def __init__(self, command, parameters, internalPointer):
+ self._command = command;
+ self._parameters = parameters;
+ self._internalPointer = internalPointer;
+
+ def GetCommand(self):
+ return self._command;
+ def GetParameters(self):
+ return self._parameters;
+ def GetInternalPointer(self):
+ return self._internalPointer;
+
+
+class ConnectionData:
+ def __init__(self, ip, port, protocolType, isOperator, isEncrypted, internalPointer):
+ self._ip = ip;
+ self._port = port;
+ self._protocolType = protocolType;
+ self._isOperator = isOperator;
+ self._isEncrypted = isEncrypted;
+ self._internalPointer = internalPointer;
+
+ def GetIP(self):
+ return self._ip;
+ def GetPort(self):
+ return self._port;
+ def GetProtocolType(self):
+ return self._protocolType;
+ def GetIsOperator(self):
+ return self._isOperator;
+ def GetIsEncrypted(self):
+ return self._isEncrypted;
+ def GetInternalPointer(self):
+ return self._internalPointer;
+
+class HubData:
+ def __init__(self, url, ip, port, protocolType):
+ self._url = url;
+ self._ip = ip;
+ self._port = port;
+ self._protocolType = protocolType;
+
+ def GetUrl(self):
+ return self._url;
+ def GetIP(self):
+ return self._ip;
+ def GetPort(self):
+ return self._port;
+
+ def SetUrl(self, url):
+ self._url = url;
+ def SetIP(self, ip):
+ self._ip = ip;
+ def SetPort(self, port):
+ self._port = port;
+
+class PluginInformation:
+ def __init__(self):
+ self._name = "";
+ self._description = "";
+ self._author = "";
+ self._web = "";
+ self._version = 0.0;
+ self._apiversion = 0.0;
+ self._uuid = "";
+ self._settings = list();
+
+ def GetName(self):
+ return self._name;
+ def SetName(self, name):
+ self._name = name;
+
+ def GetDescription(self):
+ return self._description;
+ def SetDescription(self, description):
+ self._description = description;
+
+ def GetAuthor(self):
+ return self._author;
+ def SetAuthor(self, value):
+ self._author = value;
+
+ def GetWeb(self):
+ return self._web;
+ def SetWeb(self, value):
+ self._web = value;
+
+ def GetVersion(self):
+ return self._version;
+ def SetVersion(self, value):
+ self._version = value;
+
+ def GetAPIVersion(self):
+ return self._apiversion;
+ def SetAPIVersion(self, value):
+ self._apiversion = value;
+
+ def GetUUID(self):
+ return self._uuid;
+ def SetUUID(self, value):
+ self._uuid = value;
+
+ def GetSettings(self):
+ return self._settings;
+ def SetSettings(self, value):
+ self._settings = value;
+
+class QueueData:
+ def __init__(self, target, location, hash, filesize, isfilelist, internalpointer):
+ self._target = target;
+ self._location = location;
+ self._hash = hash;
+ self._fileSize = filesize;
+ self._isFileList = isfilelist;
+ self._internalPointer = internalpointer;
+
+ def GetTarget(self):
+ return self._target;
+ def GetLocation(self):
+ return self._location;
+ def GetHash(self):
+ return self._hash;
+ def GetFileSize(self):
+ return self._hash;
+ def GetIsFileList(self):
+ return self._isFileList;
+ def GetInternalPointer(self):
+ return self._internalPointer;
+
+class StringData:
+ def __init__(self, input, output, internalpointer):
+ self._input = input;
+ self._output = output;
+ self._internalPointer = internalPointer;
+
+ def GetInput(self):
+ return self._input;
+ def GetOutput(self):
+ return self._output;
+ def GetInternalPointer(self):
+ return self._internalPointer;
+
+class TagData:
+ def __init__(self, internalpointer):
+ self._internalPointer = internalPointer;
+
+ def GetInternalPointer(self):
+ return self._internalPointer;
+
+class UDPData:
+ def __init__(self, remoteAddress, port, internalpointer):
+ self._remoteAddress = remoteAddress;
+ self._port = port;
+ self._internalPointer = internalPointer;
+
+ def GetRemoteAddress(self):
+ return self._remoteAddress;
+ def GetPort(self):
+ return self._port;
+ def GetInternalPointer(self):
+ return self._internalPointer;
+
+class UserData:
+ def __init__(self, nick, hubUrl, cid, sid, protocol, isOperator, internalpointer):
+ self._nick = nick;
+ self._hubUrl = hubUrl;
+ self._cid = cid;
+ self._sid = sid;
+ self._protocol = protocol;
+ self._isOperator = isOperator;
+ self._internalPointer = internalPointer;
+
+ def GetNick(self):
+ return self._nick;
+ def GetHubURL(self):
+ return self._hubUrl;
+ def GetCID(self):
+ return self._cid;
+ def GetSID(self):
+ return self._sid;
+ def GetProtocol(self):
+ return self._protocol;
+ def GetIsOperator(self):
+ return self._isOperator;
+ def GetInternalPointer(self):
+ return self._internalPointer;
=== added file 'Libraries/PyPlugin.DataTypes/Enumerations.py'
--- Libraries/PyPlugin.DataTypes/Enumerations.py 1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/Enumerations.py 2014-05-06 20:38:46 +0000
@@ -0,0 +1,44 @@
+
+def enum(**enums):
+ return type('Enum', (), enums)
+def enum2(*sequential, **named):
+ enums = dict(zip(sequential, range(len(sequential))), **named)
+ return type('Enum', (), enums)
+
+TagPathType = enum2(
+ 'GlobalConfig',
+ 'UserConfig',
+ 'UserLocal',
+ 'Resources',
+ 'Locale'
+ )
+
+ProtocolType = enum2(
+ 'ADC',
+ 'NMDC',
+ 'DHT'
+ )
+
+MessageType = enum2(
+ 'Client',
+ 'Status',
+ 'System'
+ )
+
+QueuePriority = enum(
+ Default = -1,
+ Lowest = 1,
+ Low = 2,
+ Normal = 3,
+ High = 4,
+ Highest = 5
+ )
+
+DataType = enum2(
+ 'Unknown',
+ 'String',
+ 'Byte',
+ 'Short',
+ 'Int',
+ 'Long'
+ )
=== added file 'Libraries/PyPlugin.DataTypes/IDCPlugin.py'
--- Libraries/PyPlugin.DataTypes/IDCPlugin.py 1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/IDCPlugin.py 2014-05-06 20:38:46 +0000
@@ -0,0 +1,56 @@
+
+from DataTypes import *
+from IDCPluginSink import *
+
+class IDCPlugin:
+ """ Properties """
+ def GetInfo(self): NotImplementedError
+ def SetInfo(self, data): NotImplementedError
+
+ def GetSink(self): NotImplementedError
+ def SetSink(self, data): NotImplementedError
+
+ """ Methods """
+ def Initialize(self, install, runtime): NotImplementedError
+
+ def Uninitialize(self): NotImplementedError
+
+ """ Hooks """
+
+ """ Chat """
+ def OnChatIncoming(self, hubData, data, refBreak): NotImplementedError
+ def OnChatOutgoing(self, hubData, data, refBreak): NotImplementedError
+ def OnChatIncomingPM(self, userData, data, refBreak): NotImplementedError
+
+ """ Timer """
+ def OnTimerSecond(self, data, refBreak): NotImplementedError
+ def OnTimerMinute(self, data, refBreak): NotImplementedError
+
+ """ Hubs """
+ def OnHubOnline(self, hubData, refBreak): NotImplementedError
+ def OnHubOffline(self, hubData, refBreak): NotImplementedError
+
+ """ Users """
+ def OnUserOnline(self, userData, refBreak): NotImplementedError
+ def OnUserOffline(self, userData, refBreak): NotImplementedError
+
+ """ Network """
+ def OnNetworkHubDataIn(self, hubData, data, refBreak): NotImplementedError
+ def OnNetworkHubDataOut(self, hubData, data, refBreak): NotImplementedError
+ def OnNetworkClientDataIn(self, connectionData, data, refBreak): NotImplementedError
+ def OnNetworkClientDataOut(self, connectionData, data, refBreak): NotImplementedError
+ def OnNetworkUDPDataIn(self, udpData, data, refBreak): NotImplementedError
+ def OnNetworkUDPDataOut(self, udpData, data, refBreak): NotImplementedError
+
+ """ Queue """
+ def OnQueueAdded(self, queueData, refBreak): NotImplementedError
+ def OnQueueMoved(self, queueData, refBreak): NotImplementedError
+ def OnQueueRemoved(self, queueData, refBreak): NotImplementedError
+ def OnQueueFinished(self, queueData, refBreak): NotImplementedError
+
+ """ UI """
+ def OnUICreated(self, data, refBreak): NotImplementedError
+ def OnUIChatTags(self, userData, tagData, refBreak): NotImplementedError
+ def OnUIChatDisplay(self, userData, stringData, refBreak): NotImplementedError
+ def OnUIChatCommand(self, hubData, data, refBreak): NotImplementedError
+ def OnUIChatCommandPM(self, userData, data, refBreak): NotImplementedError
=== added file 'Libraries/PyPlugin.DataTypes/IDCPluginSink.py'
--- Libraries/PyPlugin.DataTypes/IDCPluginSink.py 1970-01-01 00:00:00 +0000
+++ Libraries/PyPlugin.DataTypes/IDCPluginSink.py 2014-05-06 20:38:46 +0000
@@ -0,0 +1,70 @@
+
+from DataTypes import *
+
+class IDCPluginSink:
+
+ """ Core """
+ def GetApplicationName(self): NotImplementedError
+
+ def SetApplicationName(self, name): NotImplementedError
+
+ """ Log """
+ def LogMessage(self, message): NotImplementedError
+
+ """ Config """
+ def GetInstallPath(self): NotImplementedError
+
+ def GetPath(self, pathType): NotImplementedError
+
+ def GetStringConfig(self, name): NotImplementedError
+ def SetStringConfig(self, name, value): NotImplementedError
+
+ def GetBoolConfig(self, name): NotImplementedError
+ def SetBoolConfig(self, name, value): NotImplementedError
+
+ def GetInt32Config(self, name): NotImplementedError
+ def SetInt32Config(self, name, value): NotImplementedError
+
+ def GetInt64Config(self, name): NotImplementedError
+ def SetInt64Config(self, name, value): NotImplementedError
+
+ def GetLanguage(self): NotImplementedError
+
+ """ Connection """
+ def SendUDPData(self, ipAddress, port, data, amount): NotImplementedError
+ def SendProtocolCommand(self, connectionData, command): NotImplementedError
+ def TerminateConnection(self, connectionData, graceLess): NotImplementedError
+ def GetConnectionUser(self, connectionData): NotImplementedError
+
+ """ Hub """
+ def AddHub(self, url, nick, password): NotImplementedError
+ def FindHub(self, url): NotImplementedError
+ def RemoveHub(self, hubData): NotImplementedError
+ def EmulateProtocolCommand(self, hubData, command): NotImplementedError
+ def SendProtocolCommand(self, hubData, command): NotImplementedError
+ def SendMessage(self, hubData, message, thirdPerson): NotImplementedError
+ def LocalMessage(self, hubData, message, messageType): NotImplementedError
+ def SendPrivateMessage(self, userData, message, thirdPerson): NotImplementedError
+ def FindUser(self, cid, hubURL): NotImplementedError
+
+ """ Queue """
+ def AddList(self, userData, silent): NotImplementedError
+ def AddDownload(self, hashData, size, target): NotImplementedError
+ def FindDownload(self, target): NotImplementedError
+ def RemoveDownload(self, queueData): NotImplementedError
+ def SetPriority(self, queueData, priority): NotImplementedError
+ def Pause(self, queueData): NotImplementedError
+
+ """ Tagger """
+ def GetText(self, tagData): NotImplementedError
+ def AddTag(self, tagData, startPlace, endPlace, tagId, attributes): NotImplementedError
+ def ReplaceTagText(self, tagData, startPlace, endPlace, replacement): NotImplementedError
+
+ """ UI """
+ def AddCommand(self, name): NotImplementedError
+ def RemoveCommand(self, name): NotImplementedError
+ def PlaySoundInUI(self, path): NotImplementedError
+ def Notify(self, title, message): NotImplementedError
+
+ """ Other """
+ def SendData(self, data): NotImplementedError
=== added file 'Libraries/PyPlugin.DataTypes/__init__.py'