|
|
#!/bin/bash |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RED='\033[0;31m' |
|
|
GREEN='\033[0;32m' |
|
|
YELLOW='\033[1;33m' |
|
|
BLUE='\033[0;34m' |
|
|
CYAN='\033[0;36m' |
|
|
NC='\033[0m' |
|
|
|
|
|
|
|
|
HF_SPACE_URL="https://really-amin-datasourceforcryptocurrency.hf.space" |
|
|
RESULTS_FILE="diagnostic_results_$(date +%Y%m%d_%H%M%S).log" |
|
|
|
|
|
|
|
|
TOTAL_TESTS=0 |
|
|
PASSED_TESTS=0 |
|
|
FAILED_TESTS=0 |
|
|
|
|
|
|
|
|
print_status() { |
|
|
if [ $1 -eq 0 ]; then |
|
|
echo -e "${GREEN}✅ PASS${NC}: $2" |
|
|
((PASSED_TESTS++)) |
|
|
else |
|
|
echo -e "${RED}❌ FAIL${NC}: $2" |
|
|
((FAILED_TESTS++)) |
|
|
fi |
|
|
((TOTAL_TESTS++)) |
|
|
} |
|
|
|
|
|
|
|
|
print_header() { |
|
|
echo "" |
|
|
echo "════════════════════════════════════════════════════════" |
|
|
echo -e "${CYAN}$1${NC}" |
|
|
echo "════════════════════════════════════════════════════════" |
|
|
} |
|
|
|
|
|
|
|
|
test_endpoint() { |
|
|
local endpoint=$1 |
|
|
local description=$2 |
|
|
local expected_status=${3:-200} |
|
|
|
|
|
echo -e "\n${BLUE}Testing:${NC} $description" |
|
|
echo "Endpoint: $endpoint" |
|
|
|
|
|
response=$(curl -s -w "\n%{http_code}" --connect-timeout 10 "$endpoint" 2>&1) |
|
|
http_code=$(echo "$response" | tail -n1) |
|
|
body=$(echo "$response" | sed '$d') |
|
|
|
|
|
echo "HTTP Status: $http_code" |
|
|
|
|
|
if [ "$http_code" = "$expected_status" ]; then |
|
|
print_status 0 "$description" |
|
|
echo "Response preview:" |
|
|
echo "$body" | head -n 3 |
|
|
return 0 |
|
|
else |
|
|
print_status 1 "$description (Expected $expected_status, got $http_code)" |
|
|
echo "Error details:" |
|
|
echo "$body" | head -n 2 |
|
|
return 1 |
|
|
fi |
|
|
} |
|
|
|
|
|
|
|
|
exec > >(tee -a "$RESULTS_FILE") |
|
|
exec 2>&1 |
|
|
|
|
|
|
|
|
clear |
|
|
echo "╔════════════════════════════════════════════════════════╗" |
|
|
echo "║ ║" |
|
|
echo "║ HuggingFace Space Integration Diagnostic Tool ║" |
|
|
echo "║ Version 2.0 ║" |
|
|
echo "║ ║" |
|
|
echo "╚════════════════════════════════════════════════════════╝" |
|
|
echo "" |
|
|
echo "Starting diagnostic at $(date)" |
|
|
echo "Results will be saved to: $RESULTS_FILE" |
|
|
echo "" |
|
|
|
|
|
|
|
|
print_header "TEST 1: System Requirements" |
|
|
|
|
|
echo "Checking required tools..." |
|
|
|
|
|
node --version > /dev/null 2>&1 |
|
|
print_status $? "Node.js installed ($(node --version 2>/dev/null || echo 'N/A'))" |
|
|
|
|
|
npm --version > /dev/null 2>&1 |
|
|
print_status $? "npm installed ($(npm --version 2>/dev/null || echo 'N/A'))" |
|
|
|
|
|
curl --version > /dev/null 2>&1 |
|
|
print_status $? "curl installed" |
|
|
|
|
|
git --version > /dev/null 2>&1 |
|
|
print_status $? "git installed" |
|
|
|
|
|
command -v jq > /dev/null 2>&1 |
|
|
if [ $? -eq 0 ]; then |
|
|
print_status 0 "jq installed (JSON processor)" |
|
|
else |
|
|
print_status 1 "jq installed (optional but recommended)" |
|
|
fi |
|
|
|
|
|
|
|
|
print_header "TEST 2: Project Structure" |
|
|
|
|
|
[ -f "package.json" ] |
|
|
print_status $? "package.json exists" |
|
|
|
|
|
[ -f ".env.example" ] |
|
|
print_status $? ".env.example exists" |
|
|
|
|
|
[ -d "hf-data-engine" ] |
|
|
print_status $? "hf-data-engine directory exists" |
|
|
|
|
|
[ -f "hf-data-engine/main.py" ] |
|
|
print_status $? "HuggingFace engine implementation exists" |
|
|
|
|
|
[ -f "hf-data-engine/requirements.txt" ] |
|
|
print_status $? "Python requirements.txt exists" |
|
|
|
|
|
[ -f "HUGGINGFACE_DIAGNOSTIC_GUIDE.md" ] |
|
|
print_status $? "Diagnostic guide documentation exists" |
|
|
|
|
|
|
|
|
print_header "TEST 3: Environment Configuration" |
|
|
|
|
|
if [ -f ".env" ]; then |
|
|
print_status 0 ".env file exists" |
|
|
|
|
|
grep -q "PRIMARY_DATA_SOURCE" .env |
|
|
print_status $? "PRIMARY_DATA_SOURCE configured" |
|
|
|
|
|
grep -q "HF_SPACE_BASE_URL\|HF_SPACE_URL" .env |
|
|
print_status $? "HuggingFace Space URL configured" |
|
|
|
|
|
echo "" |
|
|
echo "Current configuration (sensitive values hidden):" |
|
|
grep "PRIMARY_DATA_SOURCE\|HF_SPACE\|FALLBACK" .env | sed 's/=.*/=***/' | sort || true |
|
|
else |
|
|
print_status 1 ".env file exists" |
|
|
echo "" |
|
|
echo "⚠️ .env file not found. Creating from .env.example..." |
|
|
if [ -f ".env.example" ]; then |
|
|
cp .env.example .env |
|
|
echo "✅ .env created. Edit it with your configuration." |
|
|
fi |
|
|
fi |
|
|
|
|
|
|
|
|
print_header "TEST 4: HuggingFace Space Connectivity" |
|
|
|
|
|
echo "Resolving DNS..." |
|
|
host really-amin-datasourceforcryptocurrency.hf.space > /dev/null 2>&1 |
|
|
print_status $? "DNS resolution for HF Space" |
|
|
|
|
|
echo "" |
|
|
echo "Testing basic connectivity..." |
|
|
ping -c 1 -W 5 hf.space > /dev/null 2>&1 |
|
|
print_status $? "Network connectivity to hf.space" |
|
|
|
|
|
|
|
|
print_header "TEST 5: HuggingFace Space Endpoints" |
|
|
|
|
|
echo "Testing primary endpoints..." |
|
|
|
|
|
test_endpoint "$HF_SPACE_URL/api/health" "Health check endpoint" |
|
|
test_endpoint "$HF_SPACE_URL/api/prices?symbols=BTC,ETH" "Prices endpoint" |
|
|
test_endpoint "$HF_SPACE_URL/api/ohlcv?symbol=BTCUSDT&interval=1h&limit=10" "OHLCV endpoint" |
|
|
test_endpoint "$HF_SPACE_URL/api/market/overview" "Market overview endpoint" |
|
|
test_endpoint "$HF_SPACE_URL/api/sentiment" "Sentiment endpoint" |
|
|
|
|
|
|
|
|
print_header "TEST 6: CORS Configuration" |
|
|
|
|
|
echo "Checking CORS headers..." |
|
|
cors_response=$(curl -s -I -H "Origin: http://localhost:5173" "$HF_SPACE_URL/api/prices?symbols=BTC" 2>&1) |
|
|
cors_headers=$(echo "$cors_response" | grep -i "access-control") |
|
|
|
|
|
if [ -z "$cors_headers" ]; then |
|
|
print_status 1 "CORS headers present" |
|
|
echo "" |
|
|
echo "⚠️ No CORS headers found. This may cause browser errors." |
|
|
echo " Solution: Use Vite proxy (see Configuration Guide)" |
|
|
else |
|
|
print_status 0 "CORS headers present" |
|
|
echo "CORS headers found:" |
|
|
echo "$cors_headers" | sed 's/^/ /' |
|
|
fi |
|
|
|
|
|
|
|
|
print_header "TEST 7: Response Format Validation" |
|
|
|
|
|
echo "Fetching sample data..." |
|
|
sample_response=$(curl -s "$HF_SPACE_URL/api/prices?symbols=BTC" 2>&1) |
|
|
|
|
|
if command -v jq > /dev/null 2>&1; then |
|
|
if echo "$sample_response" | jq . > /dev/null 2>&1; then |
|
|
print_status 0 "Valid JSON response" |
|
|
echo "" |
|
|
echo "Response structure:" |
|
|
if echo "$sample_response" | jq 'keys' 2>/dev/null | grep -q "."; then |
|
|
echo "$sample_response" | jq 'if type == "array" then .[0] else . end | keys' 2>/dev/null | sed 's/^/ /' |
|
|
else |
|
|
echo " (Unable to determine structure)" |
|
|
fi |
|
|
else |
|
|
print_status 1 "Valid JSON response" |
|
|
echo "Response is not valid JSON:" |
|
|
echo "$sample_response" | head -n 2 | sed 's/^/ /' |
|
|
fi |
|
|
else |
|
|
echo "⚠️ jq not installed, skipping JSON validation" |
|
|
echo " Install with: sudo apt-get install jq (Ubuntu) or brew install jq (Mac)" |
|
|
fi |
|
|
|
|
|
|
|
|
print_header "TEST 8: Node Dependencies" |
|
|
|
|
|
if [ -d "node_modules" ]; then |
|
|
print_status 0 "node_modules exists" |
|
|
|
|
|
[ -d "node_modules/typescript" ] |
|
|
print_status $? "TypeScript installed" |
|
|
|
|
|
[ -d "node_modules/vite" ] |
|
|
print_status $? "Vite installed" |
|
|
|
|
|
[ -d "node_modules/react" ] |
|
|
print_status $? "React installed" |
|
|
|
|
|
|
|
|
package_count=$(ls -1 node_modules 2>/dev/null | grep -v "^\." | wc -l) |
|
|
echo " Total packages installed: $package_count" |
|
|
else |
|
|
print_status 1 "node_modules exists" |
|
|
echo "" |
|
|
echo "⚠️ Run: npm install" |
|
|
fi |
|
|
|
|
|
|
|
|
print_header "TEST 9: Python Dependencies" |
|
|
|
|
|
if [ -f "hf-data-engine/requirements.txt" ]; then |
|
|
print_status 0 "requirements.txt exists" |
|
|
|
|
|
python3 -c "import fastapi" 2>/dev/null |
|
|
[ $? -eq 0 ] && fastapi_status="✅" || fastapi_status="❌" |
|
|
echo " FastAPI: $fastapi_status" |
|
|
|
|
|
python3 -c "import aiohttp" 2>/dev/null |
|
|
[ $? -eq 0 ] && aiohttp_status="✅" || aiohttp_status="❌" |
|
|
echo " aiohttp: $aiohttp_status" |
|
|
|
|
|
python3 -c "import pydantic" 2>/dev/null |
|
|
[ $? -eq 0 ] && pydantic_status="✅" || pydantic_status="❌" |
|
|
echo " pydantic: $pydantic_status" |
|
|
else |
|
|
print_status 1 "requirements.txt exists" |
|
|
fi |
|
|
|
|
|
|
|
|
print_header "DIAGNOSTIC SUMMARY" |
|
|
|
|
|
total_status=$((PASSED_TESTS + FAILED_TESTS)) |
|
|
if [ $total_status -gt 0 ]; then |
|
|
pass_rate=$((PASSED_TESTS * 100 / total_status)) |
|
|
echo "Results: ${GREEN}$PASSED_TESTS passed${NC}, ${RED}$FAILED_TESTS failed${NC} (${pass_rate}%)" |
|
|
fi |
|
|
echo "" |
|
|
echo "Results saved to: $RESULTS_FILE" |
|
|
echo "" |
|
|
|
|
|
if [ $FAILED_TESTS -eq 0 ]; then |
|
|
echo -e "${GREEN}✅ All tests passed!${NC}" |
|
|
echo "" |
|
|
echo "Next steps:" |
|
|
echo " 1. Run: npm run dev" |
|
|
echo " 2. Open: http://localhost:5173" |
|
|
echo " 3. Check browser console (F12) for any errors" |
|
|
else |
|
|
echo -e "${YELLOW}⚠️ Some tests failed${NC}" |
|
|
echo "" |
|
|
echo "Next steps:" |
|
|
echo " 1. Review the failed tests above" |
|
|
echo " 2. Check HUGGINGFACE_DIAGNOSTIC_GUIDE.md for solutions" |
|
|
echo " 3. Run this script again after fixes" |
|
|
fi |
|
|
|
|
|
echo "" |
|
|
echo "Full diagnostic completed at $(date)" |
|
|
echo "" |
|
|
|