Skip to content

Commit a877889

Browse files
authored
merge 1.0.0-alpha.4
<3
2 parents 2e3c6a6 + dd869c3 commit a877889

25 files changed

Lines changed: 1299 additions & 349 deletions

.gitignore

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,2 @@
11
changelog.md
2-
puff.yml
3-
docker-compose.yml
4-
.env
2+
todo.md

.luarc.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@
2828
"atomic",
2929
"git",
3030
"mysqloo",
31-
"todo"
31+
"todo",
32+
"new",
33+
"current",
34+
"async",
35+
"super"
3236
]
3337
}

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111
</div>
1212

1313
[Download]: https://github.com/TeamMeadows/atomic-framework/releases/latest
14-
[Getting Started]: https://github.com/TeamMeadows/atomic-framework/wiki#getting-started
15-
[Documentation]: https://github.com/TeamMeadows/atomic-framework/wiki
14+
[Getting Started]: https://deepwiki.com/TeamMeadows/atomic-framework/1.2-quick-start-guide
15+
[Documentation]: https://deepwiki.com/TeamMeadows/atomic-framework/
1616

1717
Atomic is a flexible, OOP-driven framework for building Garry’s Mod addons and gamemodes with a clean, modular architecture.
1818
Each **package** is a self-contained unit - just like an addon - with built-in dependency management and powerful libraries for writing structured, maintainable Lua code.
@@ -29,7 +29,7 @@ package:listen(function(self)
2929
self.logger:info("package successfully enabled")
3030
end, "onEnable")
3131
```
32-
###### Real example of addon based on Atomic
32+
###### Example of addon based on Atomic
3333

3434
---
3535

examples/lua/atomic/packages/ping/core/server.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
---@class ExamplePackagePing: Atomic.Package
22
local package = current()
33

4-
package:onNetworkMessage(function(message)
4+
package:onNetworkMessage(function(self, message)
55
local sender = message:getSender()
66

77
sender:ChatPrint("Pong!")
Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
1-
---@type Atomic.Package.Metadata
1+
---@type PackageMeta
22
return {
3-
id = "team.meadows.example_ping",
4-
title = "Example: Ping",
3+
id = "org.example.ping",
4+
title = "Ping",
55
version = "1.0.0",
6+
kind = "system",
67
files = {
7-
client = { "core/client.lua" },
8-
shared = { "core/shared.lua" },
9-
server = { "core/server.lua" }
8+
dir = "core",
9+
client = { "client" },
10+
shared = { "shared" },
11+
server = { "server" }
1012
},
1113
dependencies = {
1214
shared = {
13-
atomic = "~0.7.1"
15+
atomic = "^1.0.0-alpha.1"
1416
}
1517
}
1618
}

lua/atomic/libraries/class.lua

Lines changed: 51 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,25 @@ atomic.class = atomic.class or {
99
_metadata = {
1010
id = "atomic",
1111
version = atomic.meta.version,
12-
documentation = "https://github.com/TeamMeadows/atomic-framework/wiki",
13-
icon = "https://github.com/TeamMeadows/atomic-framework/raw/production/assets/logo.png"
1412
}
1513
}
1614
}
1715

1816
---@class Atomic.Class
19-
---@field init fun(self: Atomic.Class, ...: any)?
17+
---@field private __index table
18+
---@field private init fun(self: Atomic.Class, ...: any)?
2019
---@field private _classname string?
2120
local classMt = {}
2221
classMt.__index = classMt
2322

23+
---@alias Class Atomic.Class
24+
25+
---@private
2426
function classMt:__tostring()
25-
return "class " .. self:__classname()
27+
return "Class " .. self:__classname()
2628
end
2729

30+
---@private
2831
---@return string
2932
function classMt:__classname()
3033
return tostring(self._classname)
@@ -39,7 +42,7 @@ function atomic.class.create(name, parent)
3942
local class = setmetatable({ _classname = name }, { __index = parent or classMt })
4043
class.__index = class
4144
class.__tostring = function(self)
42-
return "instance of " .. tostring(self._classname)
45+
return "Instance of " .. tostring(self._classname)
4346
end
4447

4548
return class
@@ -70,7 +73,8 @@ function atomic.class.get(name, packageOrId, packageVersion)
7073
or type(packageVersion) == "string" and packageVersion
7174
or pkgName == "atomic" and atomic.meta.version
7275

73-
return ((atomic.class._storage[pkgName] or {})[pkgVersion] or {})[name]
76+
---@diagnostic disable-next-line
77+
return ((atomic.class._storage[pkgName] or {})[istable(pkgVersion) and pkgVersion:getString() or pkgVersion] or {})[name]
7478
end
7579

7680
--- Creates a new class instance
@@ -123,12 +127,19 @@ function atomic.class.accessors(class, ...)
123127
end
124128
end
125129

130+
---@param version Atomic.SemanticVersion | string
131+
---@return string
132+
local versionToString = function(version)
133+
---@diagnostic disable-next-line
134+
return isstring(version) and version or version:getString()
135+
end
136+
126137
--- Registers the class in the storage, allowing it to be get via ``atomic.class.get``
127138
---@param class Atomic.Class
128139
---@param package Atomic.Package
129140
function atomic.class.register(class, package)
130141
local storage = atomic.class._storage
131-
local id, version = package._metadata.id, package._metadata.version
142+
local id, version = package._metadata.id, versionToString(package._metadata.version)
132143

133144
if (type(storage[id]) ~= "table") then
134145
storage[id] = {}
@@ -143,11 +154,43 @@ function atomic.class.register(class, package)
143154
atomic.class._storage = storage
144155
end
145156

157+
---@param class Atomic.Class
158+
---@param package Atomic.Package
146159
function atomic.class.unregister(class, package)
147160
local storage = atomic.class._storage
148-
local id, version = package.id, package.version
161+
local id, version = package._metadata.id, versionToString(package._metadata.version)
149162

150163
storage[id][version][class._classname] = nil
151164

152165
atomic.class._storage = storage
166+
end
167+
168+
--- Returns the parent class of instance
169+
---@param class Atomic.Class
170+
---@return Atomic.Class?
171+
function atomic.class.getParent(class)
172+
local parent = getmetatable(getmetatable(class))
173+
return parent and parent.__index
174+
end
175+
176+
--- Calls the `init` method in the parent class
177+
---
178+
--- # Example
179+
--- ```lua
180+
--- local Player = package:getClass("Player")
181+
--- local User = package:class("User", Player) -- creating new class `User` that inherits class `Player`
182+
---
183+
--- function User:init()
184+
--- super(self) -- calling Player:init() method
185+
--- end
186+
--- ```
187+
---@param instance Atomic.Class
188+
---@vararg ...
189+
function atomic.class.super(instance, ...)
190+
local parent = atomic.class.getParent(instance)
191+
192+
assert(parent, "class has no parent")
193+
assert(isfunction(parent.init), "parent class has no init method")
194+
195+
parent.init(instance, ...)
153196
end

lua/atomic/libraries/command/class.lua

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,11 @@ function Command:getCooldown()
3131
return self._cooldown
3232
end
3333

34+
---@return string?
35+
function Command:getPermission()
36+
return self._permission
37+
end
38+
3439
---@return string
3540
function Command:getName()
3641
return self._name

lua/atomic/libraries/command/common.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
atomic.command = {
1+
atomic.command = atomic.command or {
22
logger = atomic.logger.new("command"),
33
---@type table<string, Atomic.Command>
44
_storage = {}

lua/atomic/libraries/git.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@ end
44

55
---@class Atomic.Git.Folder
66
---@field folder string
7+
---@field get_branch fun(self): string
8+
---@field get_commit_id fun(self): string
9+
---@field fetch fun(self): string? Error
710

811
if (not git) then
912
require("git")

lua/atomic/libraries/logger.lua

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ function atomic.logger.new(prefix)
2828
end
2929

3030
local function getcurrenttime()
31-
return os.date("%H:%M:%S")
31+
return os.date("%X")
3232
end
3333

3434
-- colors
@@ -48,7 +48,31 @@ local levels = {
4848
ERR = 5,
4949
}
5050

51-
local logvar = CreateConVar("atomic_log", "INFO", {FCVAR_ARCHIVE, FCVAR_PROTECTED}, "Minimum log level (TRACE/INFO/DEBUG/WARN/ERR)")
51+
local logLevelFile = "atomic/loglevel.dat"
52+
function atomic.logger.getCurrentLevel()
53+
return atomic._config.logLevel or file.Read(logLevelFile) or "info"
54+
end
55+
56+
--- `Internal` function, you `probably` shouldn't use it
57+
---@param levelName string
58+
---@return boolean
59+
function atomic.logger.isLevelExists(levelName)
60+
return levels[levelName:upper()] ~= nil
61+
end
62+
63+
--- `Internal` function, you shouldn't use it
64+
---@param level string
65+
function atomic.logger.updateLevel(level)
66+
if (not atomic.logger.isLevelExists(level)) then
67+
return false
68+
end
69+
70+
atomic._config.logLevel = level
71+
72+
file.Write(logLevelFile, level)
73+
end
74+
75+
atomic._config.logLevel = atomic.logger.getCurrentLevel()
5276

5377
---@param prefix string
5478
function Logger:init(prefix)
@@ -64,7 +88,7 @@ local MAX_LEVEL_LENGTH = 5
6488
---@param message string
6589
---@param ... any
6690
function Logger:log(color, level, message, ...)
67-
local currentLevel = logvar:GetString():upper()
91+
local currentLevel = atomic._config.logLevel:upper()
6892
local currentIdx = levels[currentLevel] or 1
6993
local msgIdx = levels[level] or 1
7094

@@ -95,4 +119,5 @@ end
95119

96120
function Logger:err(message, ...)
97121
self:log(err, "ERR", message, ...)
122+
_G["debug"].Trace()
98123
end

0 commit comments

Comments
 (0)