Skip to content

Commit f6bb18b

Browse files
committed
restructured
1 parent 72b433c commit f6bb18b

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+16739
-8475
lines changed

.loki/README.md

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -190,8 +190,7 @@ Edit `init.lua` to:
190190

191191
## Requirements
192192

193-
- Lua or LuaJIT (installed via Homebrew)
194-
- libcurl (installed via Homebrew)
193+
- Lua or LuaJIT
194+
- libcurl
195+
- libuv
195196
- OpenAI API key (for AI functions)
196-
197-
The binary is dynamically linked against system libraries, keeping it small (~72KB).

CHANGELOG.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,31 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
1717

1818
## [Unreleased]
1919

20+
### Added
21+
22+
- **HTTP Support Restored**: Re-implemented async HTTP functionality that was removed during architecture refactor
23+
- **New Module Structure**:
24+
- Created `src/http.c` (470 lines) and `src/http.h` - dedicated HTTP module
25+
- Clean separation from core editor code
26+
- **Security Hardening**:
27+
- URL validation: Only `http://` and `https://` schemes allowed
28+
- URL length limit: Maximum 2048 characters
29+
- Control character filtering in URLs
30+
- Request body size limit: 5MB maximum
31+
- Response size limit: 10MB maximum
32+
- Rate limiting: 60 requests per minute
33+
- Concurrent request limit: 10 simultaneous requests
34+
- **Lua API**: `loki.async_http(url, method, body, headers, callback)`
35+
- Non-blocking HTTP GET/POST requests
36+
- Callback receives table with `status`, `body`, and `error` fields
37+
- **Integration**:
38+
- Added `loki_lua_bind_http()` function in lua.c
39+
- Re-enabled `bind_http` option in `loki_lua_bootstrap()`
40+
- HTTP tests re-enabled in CMakeLists.txt
41+
- **Testing**: Both `test_http_security` and `test_http_simple` passing (19/19 total tests)
42+
- **Files Added**: `src/http.c`, `src/http.h`
43+
- **Files Modified**: `src/lua.c`, `include/loki/lua.h`, `CMakeLists.txt`
44+
2045
## [0.5.0]
2146

2247
### Added

CMakeLists.txt

Lines changed: 124 additions & 146 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cmake_minimum_required(VERSION 3.18)
2-
project(loki C)
2+
project(loki VERSION 0.1.0 LANGUAGES C)
33

44
set(CMAKE_C_STANDARD 99)
55
set(CMAKE_C_STANDARD_REQUIRED ON)
@@ -10,10 +10,17 @@ if (NOT CMAKE_BUILD_TYPE)
1010
endif()
1111

1212
option(LOKI_BUILD_SHARED "Build libloki as a shared library" OFF)
13+
option(BUILD_TESTS "Build unit tests" ON)
1314

15+
# Find required packages
16+
find_package(PkgConfig REQUIRED)
1417
find_package(Lua REQUIRED)
1518
find_package(CURL REQUIRED)
1619
find_package(Threads REQUIRED)
20+
21+
# Find libuv for async support
22+
pkg_check_modules(LIBUV REQUIRED libuv)
23+
1724
# Line editing library detection (editline preferred over readline due to BSD license)
1825
set(LINEEDIT_FOUND FALSE)
1926
set(LINEEDIT_LIBRARY "")
@@ -88,195 +95,166 @@ if (LOKI_BUILD_SHARED)
8895
set(LOKI_LIBRARY_TYPE SHARED)
8996
endif()
9097

91-
add_library(libloki ${LOKI_LIBRARY_TYPE}
92-
src/loki_core.c
93-
src/loki_lua.c
94-
src/loki_editor.c
95-
src/loki_syntax.c
96-
src/loki_indent.c
97-
src/loki_languages.c
98-
src/loki_selection.c
99-
src/loki_search.c
100-
src/loki_modal.c
101-
src/loki_command.c
102-
src/loki_terminal.c
103-
src/loki_undo.c
104-
src/loki_buffers.c
98+
# Loki core library - new modular architecture
99+
set(LOKI_SOURCES
100+
src/core.c
101+
src/buffers.c
102+
src/terminal.c
103+
src/renderer.c
104+
src/event.c
105+
src/modal.c
106+
src/selection.c
107+
src/syntax.c
108+
src/languages.c
109+
src/search.c
110+
src/undo.c
111+
src/indent.c
112+
src/json.c
113+
src/serialize.c
114+
src/async_queue.c
115+
src/command.c
116+
src/command/basic.c
117+
src/command/file.c
118+
src/command/goto.c
119+
src/command/substitute.c
120+
src/editor.c
121+
src/lua.c
122+
src/lang_bridge.c
123+
src/session.c
124+
src/host.c
125+
src/cli.c
126+
src/jsonrpc.c
127+
src/repl_helpers.c
128+
src/repl.c
105129
src/loki_markdown.c
130+
src/http.c
106131
)
107132

133+
add_library(libloki ${LOKI_LIBRARY_TYPE} ${LOKI_SOURCES})
134+
108135
target_include_directories(libloki
109136
PUBLIC
110137
${CMAKE_CURRENT_SOURCE_DIR}/include
138+
${CMAKE_CURRENT_SOURCE_DIR}/src
111139
${LUA_INCLUDE_DIR}
112140
${CURL_INCLUDE_DIRS}
141+
${LIBUV_INCLUDE_DIRS}
113142
${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/cmark/src
114143
)
115144

116145
target_compile_options(libloki PRIVATE -Wall -Wextra -pedantic)
117146

147+
target_link_directories(libloki PUBLIC ${LIBUV_LIBRARY_DIRS})
148+
118149
target_link_libraries(libloki
119150
PUBLIC
120151
${LUA_LIBRARIES}
121152
CURL::libcurl
122153
Threads::Threads
123154
${CMAKE_DL_LIBS}
155+
${LIBUV_LIBRARIES}
124156
cmark
125157
)
126158

127159
if (NOT MSVC)
128160
target_link_libraries(libloki PUBLIC m)
129161
endif()
130162

131-
add_executable(loki_editor src/main_editor.c)
132-
target_compile_options(loki_editor PRIVATE -Wall -Wextra -pedantic)
133-
target_link_libraries(loki_editor PRIVATE libloki)
134-
set_target_properties(loki_editor PROPERTIES OUTPUT_NAME "loki-editor")
135-
136-
add_executable(loki_repl src/main_repl.c)
137-
target_include_directories(loki_repl PRIVATE
138-
${CMAKE_CURRENT_SOURCE_DIR}
139-
${CMAKE_CURRENT_SOURCE_DIR}/include
140-
)
141-
target_compile_options(loki_repl PRIVATE -Wall -Wextra -pedantic)
142-
target_link_libraries(loki_repl PRIVATE libloki)
143-
set_target_properties(loki_repl PROPERTIES OUTPUT_NAME "loki-repl")
163+
# Main executable
164+
add_executable(loki src/main.c)
165+
target_compile_options(loki PRIVATE -Wall -Wextra -pedantic)
166+
target_link_libraries(loki PRIVATE libloki)
144167

145168
if (LINEEDIT_FOUND)
146-
target_include_directories(loki_repl PRIVATE ${LINEEDIT_INCLUDE_DIR})
147-
target_link_libraries(loki_repl PRIVATE ${LINEEDIT_LIBRARY})
169+
target_include_directories(loki PRIVATE ${LINEEDIT_INCLUDE_DIR})
170+
target_link_libraries(loki PRIVATE ${LINEEDIT_LIBRARY})
148171
if (LINEEDIT_TYPE STREQUAL "editline")
149-
target_compile_definitions(loki_repl PRIVATE LOKI_HAVE_EDITLINE=1)
172+
target_compile_definitions(loki PRIVATE LOKI_HAVE_EDITLINE=1)
150173
else()
151-
target_compile_definitions(loki_repl PRIVATE LOKI_HAVE_READLINE=1)
174+
target_compile_definitions(loki PRIVATE LOKI_HAVE_READLINE=1)
152175
endif()
153-
message(STATUS "loki-repl will use ${LINEEDIT_TYPE} for line editing (history, completion)")
176+
message(STATUS "loki will use ${LINEEDIT_TYPE} for line editing (history, completion)")
154177
endif()
155178

156179
add_custom_target(show-config
157180
COMMAND ${CMAKE_COMMAND} -E echo "Lua include: ${LUA_INCLUDE_DIR}"
158181
COMMAND ${CMAKE_COMMAND} -E echo "Lua libraries: ${LUA_LIBRARIES}"
159182
COMMAND ${CMAKE_COMMAND} -E echo "libcurl include: ${CURL_INCLUDE_DIRS}"
160183
COMMAND ${CMAKE_COMMAND} -E echo "libcurl libraries: ${CURL_LIBRARIES}"
184+
COMMAND ${CMAKE_COMMAND} -E echo "libuv include: ${LIBUV_INCLUDE_DIRS}"
185+
COMMAND ${CMAKE_COMMAND} -E echo "libuv libraries: ${LIBUV_LIBRARIES}"
161186
COMMAND ${CMAKE_COMMAND} -E echo "Line editing: ${LINEEDIT_TYPE}"
162187
COMMAND ${CMAKE_COMMAND} -E echo "Line edit library: ${LINEEDIT_LIBRARY}"
163188
)
164189

165-
enable_testing()
166-
add_test(NAME loki_editor_version COMMAND $<TARGET_FILE:loki_editor> --version)
167-
add_test(NAME loki_repl_version COMMAND $<TARGET_FILE:loki_repl> --version)
168-
169-
# Test framework library
170-
add_library(test_framework STATIC tests/test_framework.c)
171-
target_include_directories(test_framework PUBLIC
172-
${CMAKE_CURRENT_SOURCE_DIR}/tests
173-
${CMAKE_CURRENT_SOURCE_DIR}/include
174-
)
175-
176-
# Unit tests for core functionality
177-
add_executable(test_core tests/test_core.c)
178-
target_include_directories(test_core PRIVATE
179-
${CMAKE_CURRENT_SOURCE_DIR}/include
180-
${CMAKE_CURRENT_SOURCE_DIR}/src
181-
${CMAKE_CURRENT_SOURCE_DIR}/tests
182-
)
183-
target_link_libraries(test_core PRIVATE libloki test_framework)
184-
add_test(NAME test_core COMMAND test_core)
185-
186-
# Integration tests for file I/O
187-
add_executable(test_file_io tests/test_file_io.c)
188-
target_include_directories(test_file_io PRIVATE
189-
${CMAKE_CURRENT_SOURCE_DIR}/include
190-
${CMAKE_CURRENT_SOURCE_DIR}/src
191-
${CMAKE_CURRENT_SOURCE_DIR}/tests
192-
)
193-
target_link_libraries(test_file_io PRIVATE libloki test_framework)
194-
add_test(NAME test_file_io COMMAND test_file_io)
195-
196-
# Integration tests for Lua API
197-
add_executable(test_lua_api tests/test_lua_api.c)
198-
target_include_directories(test_lua_api PRIVATE
199-
${CMAKE_CURRENT_SOURCE_DIR}/include
200-
${CMAKE_CURRENT_SOURCE_DIR}/src
201-
${CMAKE_CURRENT_SOURCE_DIR}/tests
202-
${LUA_INCLUDE_DIR}
203-
)
204-
target_link_libraries(test_lua_api PRIVATE libloki test_framework)
205-
add_test(NAME test_lua_api COMMAND test_lua_api)
206-
207-
# Unit tests for language registration helpers
208-
add_executable(test_lang_registration tests/test_lang_registration.c)
209-
target_include_directories(test_lang_registration PRIVATE
210-
${CMAKE_CURRENT_SOURCE_DIR}/include
211-
${CMAKE_CURRENT_SOURCE_DIR}/src
212-
${CMAKE_CURRENT_SOURCE_DIR}/tests
213-
${LUA_INCLUDE_DIR}
214-
)
215-
target_link_libraries(test_lang_registration PRIVATE libloki test_framework)
216-
add_test(NAME test_lang_registration COMMAND test_lang_registration)
217-
218-
# Unit tests for HTTP security features
219-
add_executable(test_http_security tests/test_http_security.c)
220-
target_include_directories(test_http_security PRIVATE
221-
${CMAKE_CURRENT_SOURCE_DIR}/include
222-
${CMAKE_CURRENT_SOURCE_DIR}/src
223-
${CMAKE_CURRENT_SOURCE_DIR}/tests
224-
${LUA_INCLUDE_DIR}
225-
)
226-
target_link_libraries(test_http_security PRIVATE libloki test_framework)
227-
add_test(NAME test_http_security COMMAND test_http_security)
190+
# Tests
191+
if(BUILD_TESTS)
192+
enable_testing()
228193

229-
# Unit tests for modal editing (vim-like modes)
230-
add_executable(test_modal tests/test_modal.c)
231-
target_include_directories(test_modal PRIVATE
232-
${CMAKE_CURRENT_SOURCE_DIR}/include
233-
${CMAKE_CURRENT_SOURCE_DIR}/src
234-
${CMAKE_CURRENT_SOURCE_DIR}/tests
235-
${LUA_INCLUDE_DIR}
236-
)
237-
target_link_libraries(test_modal PRIVATE libloki test_framework)
238-
add_test(NAME test_modal COMMAND test_modal)
194+
add_test(NAME loki_version COMMAND $<TARGET_FILE:loki> --version)
239195

240-
# Unit tests for syntax highlighting
241-
add_executable(test_syntax tests/test_syntax.c)
242-
target_include_directories(test_syntax PRIVATE
243-
${CMAKE_CURRENT_SOURCE_DIR}/include
244-
${CMAKE_CURRENT_SOURCE_DIR}/src
245-
${CMAKE_CURRENT_SOURCE_DIR}/tests
246-
${LUA_INCLUDE_DIR}
247-
)
248-
target_link_libraries(test_syntax PRIVATE libloki test_framework)
249-
add_test(NAME test_syntax COMMAND test_syntax)
196+
# Test framework library
197+
add_library(test_framework STATIC tests/test_framework.c)
198+
target_include_directories(test_framework PUBLIC
199+
${CMAKE_CURRENT_SOURCE_DIR}/tests
200+
${CMAKE_CURRENT_SOURCE_DIR}/include
201+
${CMAKE_CURRENT_SOURCE_DIR}/src
202+
)
203+
204+
# Core editor tests (new modular structure)
205+
set(LOKI_TESTS
206+
test_core
207+
test_buffers
208+
test_modal
209+
test_terminal
210+
test_syntax
211+
test_search
212+
test_selection
213+
test_undo
214+
test_indent
215+
test_command
216+
test_serialize
217+
test_lua_api
218+
test_lang_registration
219+
test_file_io
220+
test_row_operations
221+
test_async_queue
222+
)
223+
224+
foreach(test_name ${LOKI_TESTS})
225+
add_executable(${test_name} tests/loki/${test_name}.c)
226+
target_include_directories(${test_name} PRIVATE
227+
${CMAKE_CURRENT_SOURCE_DIR}/include
228+
${CMAKE_CURRENT_SOURCE_DIR}/src
229+
${CMAKE_CURRENT_SOURCE_DIR}/tests
230+
${LUA_INCLUDE_DIR}
231+
)
232+
target_link_libraries(${test_name} PRIVATE libloki test_framework)
233+
add_test(NAME ${test_name} COMMAND ${test_name})
234+
endforeach()
250235

251-
# Unit tests for search functionality
252-
add_executable(test_search tests/test_search.c)
253-
target_include_directories(test_search PRIVATE
254-
${CMAKE_CURRENT_SOURCE_DIR}/include
255-
${CMAKE_CURRENT_SOURCE_DIR}/src
256-
${CMAKE_CURRENT_SOURCE_DIR}/tests
257-
${LUA_INCLUDE_DIR}
258-
)
259-
target_link_libraries(test_search PRIVATE libloki test_framework)
260-
add_test(NAME test_search COMMAND test_search)
236+
# HTTP tests
237+
add_executable(test_http_security tests/test_http_security.c)
238+
target_include_directories(test_http_security PRIVATE
239+
${CMAKE_CURRENT_SOURCE_DIR}/include
240+
${CMAKE_CURRENT_SOURCE_DIR}/src
241+
${CMAKE_CURRENT_SOURCE_DIR}/tests
242+
${LUA_INCLUDE_DIR}
243+
)
244+
target_link_libraries(test_http_security PRIVATE libloki test_framework)
245+
add_test(NAME test_http_security COMMAND test_http_security)
261246

262-
# Unit tests for buffer management
263-
add_executable(test_buffers tests/test_buffers.c)
264-
target_include_directories(test_buffers PRIVATE
265-
${CMAKE_CURRENT_SOURCE_DIR}/include
266-
${CMAKE_CURRENT_SOURCE_DIR}/src
267-
${CMAKE_CURRENT_SOURCE_DIR}/tests
268-
${LUA_INCLUDE_DIR}
269-
)
270-
target_link_libraries(test_buffers PRIVATE libloki test_framework)
271-
add_test(NAME test_buffers COMMAND test_buffers)
247+
add_executable(test_http_simple tests/test_http_simple.c)
248+
target_include_directories(test_http_simple PRIVATE
249+
${CMAKE_CURRENT_SOURCE_DIR}/include
250+
${CMAKE_CURRENT_SOURCE_DIR}/src
251+
${CMAKE_CURRENT_SOURCE_DIR}/tests
252+
${LUA_INCLUDE_DIR}
253+
)
254+
target_link_libraries(test_http_simple PRIVATE libloki test_framework)
255+
add_test(NAME test_http_simple COMMAND test_http_simple)
256+
endif()
272257

273-
# Unit tests for auto-indentation
274-
add_executable(test_indent tests/test_indent.c)
275-
target_include_directories(test_indent PRIVATE
276-
${CMAKE_CURRENT_SOURCE_DIR}/include
277-
${CMAKE_CURRENT_SOURCE_DIR}/src
278-
${CMAKE_CURRENT_SOURCE_DIR}/tests
279-
${LUA_INCLUDE_DIR}
280-
)
281-
target_link_libraries(test_indent PRIVATE libloki test_framework)
282-
add_test(NAME test_indent COMMAND test_indent)
258+
# Install
259+
install(TARGETS loki RUNTIME DESTINATION bin)
260+
install(DIRECTORY .loki DESTINATION share/loki)

0 commit comments

Comments
 (0)