feat: Add Official Microsoft & Gemini Skills (845+ Total)
🚀 Impact Significantly expands the capabilities of **Antigravity Awesome Skills** by integrating official skill collections from **Microsoft** and **Google Gemini**. This update increases the total skill count to **845+**, making the library even more comprehensive for AI coding assistants. ✨ Key Changes 1. New Official Skills - **Microsoft Skills**: Added a massive collection of official skills from [microsoft/skills](https://github.com/microsoft/skills). - Includes Azure, .NET, Python, TypeScript, and Semantic Kernel skills. - Preserves the original directory structure under `skills/official/microsoft/`. - Includes plugin skills from the `.github/plugins` directory. - **Gemini Skills**: Added official Gemini API development skills under `skills/gemini-api-dev/`. 2. New Scripts & Tooling - **`scripts/sync_microsoft_skills.py`**: A robust synchronization script that: - Clones the official Microsoft repository. - Preserves the original directory heirarchy. - Handles symlinks and plugin locations. - Generates attribution metadata. - **`scripts/tests/inspect_microsoft_repo.py`**: Debug tool to inspect the remote repository structure. - **`scripts/tests/test_comprehensive_coverage.py`**: Verification script to ensure 100% of skills are captured during sync. 3. Core Improvements - **`scripts/generate_index.py`**: Enhanced frontmatter parsing to safely handle unquoted values containing `@` symbols and commas (fixing issues with some Microsoft skill descriptions). - **`package.json`**: Added `sync:microsoft` and `sync:all-official` scripts for easy maintenance. 4. Documentation - Updated `README.md` to reflect the new skill counts (845+) and added Microsoft/Gemini to the provider list. - Updated `CATALOG.md` and `skills_index.json` with the new skills. 🧪 Verification - Ran `scripts/tests/test_comprehensive_coverage.py` to verify all Microsoft skills are detected. - Validated `generate_index.py` fixes by successfully indexing the new skills.
This commit is contained in:
388
skills/official/microsoft/java/data/blob/SKILL.md
Normal file
388
skills/official/microsoft/java/data/blob/SKILL.md
Normal file
@@ -0,0 +1,388 @@
|
||||
---
|
||||
name: azure-storage-blob-java
|
||||
description: Build blob storage applications with Azure Storage Blob SDK for Java. Use when uploading, downloading, or managing files in Azure Blob Storage, working with containers, or implementing streaming data operations.
|
||||
package: com.azure:azure-storage-blob
|
||||
---
|
||||
|
||||
# Azure Storage Blob SDK for Java
|
||||
|
||||
Build blob storage applications using the Azure Storage Blob SDK for Java.
|
||||
|
||||
## Installation
|
||||
|
||||
```xml
|
||||
<dependency>
|
||||
<groupId>com.azure</groupId>
|
||||
<artifactId>azure-storage-blob</artifactId>
|
||||
<version>12.33.0</version>
|
||||
</dependency>
|
||||
```
|
||||
|
||||
## Client Creation
|
||||
|
||||
### BlobServiceClient
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.BlobServiceClient;
|
||||
import com.azure.storage.blob.BlobServiceClientBuilder;
|
||||
|
||||
// With SAS token
|
||||
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
|
||||
.endpoint("<storage-account-url>")
|
||||
.sasToken("<sas-token>")
|
||||
.buildClient();
|
||||
|
||||
// With connection string
|
||||
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
|
||||
.connectionString("<connection-string>")
|
||||
.buildClient();
|
||||
```
|
||||
|
||||
### With DefaultAzureCredential
|
||||
|
||||
```java
|
||||
import com.azure.identity.DefaultAzureCredentialBuilder;
|
||||
|
||||
BlobServiceClient serviceClient = new BlobServiceClientBuilder()
|
||||
.endpoint("<storage-account-url>")
|
||||
.credential(new DefaultAzureCredentialBuilder().build())
|
||||
.buildClient();
|
||||
```
|
||||
|
||||
### BlobContainerClient
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.BlobContainerClient;
|
||||
|
||||
// From service client
|
||||
BlobContainerClient containerClient = serviceClient.getBlobContainerClient("mycontainer");
|
||||
|
||||
// Direct construction
|
||||
BlobContainerClient containerClient = new BlobContainerClientBuilder()
|
||||
.connectionString("<connection-string>")
|
||||
.containerName("mycontainer")
|
||||
.buildClient();
|
||||
```
|
||||
|
||||
### BlobClient
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.BlobClient;
|
||||
|
||||
// From container client
|
||||
BlobClient blobClient = containerClient.getBlobClient("myblob.txt");
|
||||
|
||||
// With directory structure
|
||||
BlobClient blobClient = containerClient.getBlobClient("folder/subfolder/myblob.txt");
|
||||
|
||||
// Direct construction
|
||||
BlobClient blobClient = new BlobClientBuilder()
|
||||
.connectionString("<connection-string>")
|
||||
.containerName("mycontainer")
|
||||
.blobName("myblob.txt")
|
||||
.buildClient();
|
||||
```
|
||||
|
||||
## Core Patterns
|
||||
|
||||
### Create Container
|
||||
|
||||
```java
|
||||
// Create container
|
||||
serviceClient.createBlobContainer("mycontainer");
|
||||
|
||||
// Create if not exists
|
||||
BlobContainerClient container = serviceClient.createBlobContainerIfNotExists("mycontainer");
|
||||
|
||||
// From container client
|
||||
containerClient.create();
|
||||
containerClient.createIfNotExists();
|
||||
```
|
||||
|
||||
### Upload Data
|
||||
|
||||
```java
|
||||
import com.azure.core.util.BinaryData;
|
||||
|
||||
// Upload string
|
||||
String data = "Hello, Azure Blob Storage!";
|
||||
blobClient.upload(BinaryData.fromString(data));
|
||||
|
||||
// Upload with overwrite
|
||||
blobClient.upload(BinaryData.fromString(data), true);
|
||||
```
|
||||
|
||||
### Upload from File
|
||||
|
||||
```java
|
||||
blobClient.uploadFromFile("local-file.txt");
|
||||
|
||||
// With overwrite
|
||||
blobClient.uploadFromFile("local-file.txt", true);
|
||||
```
|
||||
|
||||
### Upload from Stream
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.specialized.BlockBlobClient;
|
||||
|
||||
BlockBlobClient blockBlobClient = blobClient.getBlockBlobClient();
|
||||
|
||||
try (ByteArrayInputStream dataStream = new ByteArrayInputStream(data.getBytes())) {
|
||||
blockBlobClient.upload(dataStream, data.length());
|
||||
}
|
||||
```
|
||||
|
||||
### Upload with Options
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.models.BlobHttpHeaders;
|
||||
import com.azure.storage.blob.options.BlobParallelUploadOptions;
|
||||
|
||||
BlobHttpHeaders headers = new BlobHttpHeaders()
|
||||
.setContentType("text/plain")
|
||||
.setCacheControl("max-age=3600");
|
||||
|
||||
Map<String, String> metadata = Map.of("author", "john", "version", "1.0");
|
||||
|
||||
try (InputStream stream = new FileInputStream("large-file.bin")) {
|
||||
BlobParallelUploadOptions options = new BlobParallelUploadOptions(stream)
|
||||
.setHeaders(headers)
|
||||
.setMetadata(metadata);
|
||||
|
||||
blobClient.uploadWithResponse(options, null, Context.NONE);
|
||||
}
|
||||
```
|
||||
|
||||
### Upload if Not Exists
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.models.BlobRequestConditions;
|
||||
|
||||
BlobParallelUploadOptions options = new BlobParallelUploadOptions(inputStream, length)
|
||||
.setRequestConditions(new BlobRequestConditions().setIfNoneMatch("*"));
|
||||
|
||||
blobClient.uploadWithResponse(options, null, Context.NONE);
|
||||
```
|
||||
|
||||
### Download Data
|
||||
|
||||
```java
|
||||
// Download to BinaryData
|
||||
BinaryData content = blobClient.downloadContent();
|
||||
String text = content.toString();
|
||||
|
||||
// Download to file
|
||||
blobClient.downloadToFile("downloaded-file.txt");
|
||||
```
|
||||
|
||||
### Download to Stream
|
||||
|
||||
```java
|
||||
try (ByteArrayOutputStream outputStream = new ByteArrayOutputStream()) {
|
||||
blobClient.downloadStream(outputStream);
|
||||
byte[] data = outputStream.toByteArray();
|
||||
}
|
||||
```
|
||||
|
||||
### Download with InputStream
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.specialized.BlobInputStream;
|
||||
|
||||
try (BlobInputStream blobIS = blobClient.openInputStream()) {
|
||||
byte[] buffer = new byte[1024];
|
||||
int bytesRead;
|
||||
while ((bytesRead = blobIS.read(buffer)) != -1) {
|
||||
// Process buffer
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Upload via OutputStream
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.specialized.BlobOutputStream;
|
||||
|
||||
try (BlobOutputStream blobOS = blobClient.getBlockBlobClient().getBlobOutputStream()) {
|
||||
blobOS.write("Data to upload".getBytes());
|
||||
}
|
||||
```
|
||||
|
||||
### List Blobs
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.models.BlobItem;
|
||||
|
||||
// List all blobs
|
||||
for (BlobItem blobItem : containerClient.listBlobs()) {
|
||||
System.out.println("Blob: " + blobItem.getName());
|
||||
}
|
||||
|
||||
// List with prefix (virtual directory)
|
||||
import com.azure.storage.blob.models.ListBlobsOptions;
|
||||
|
||||
ListBlobsOptions options = new ListBlobsOptions().setPrefix("folder/");
|
||||
for (BlobItem blobItem : containerClient.listBlobs(options, null)) {
|
||||
System.out.println("Blob: " + blobItem.getName());
|
||||
}
|
||||
```
|
||||
|
||||
### List Blobs by Hierarchy
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.models.BlobListDetails;
|
||||
|
||||
String delimiter = "/";
|
||||
ListBlobsOptions options = new ListBlobsOptions()
|
||||
.setPrefix("data/")
|
||||
.setDetails(new BlobListDetails().setRetrieveMetadata(true));
|
||||
|
||||
for (BlobItem item : containerClient.listBlobsByHierarchy(delimiter, options, null)) {
|
||||
if (item.isPrefix()) {
|
||||
System.out.println("Directory: " + item.getName());
|
||||
} else {
|
||||
System.out.println("Blob: " + item.getName());
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Delete Blob
|
||||
|
||||
```java
|
||||
blobClient.delete();
|
||||
|
||||
// Delete if exists
|
||||
blobClient.deleteIfExists();
|
||||
|
||||
// Delete with snapshots
|
||||
import com.azure.storage.blob.models.DeleteSnapshotsOptionType;
|
||||
blobClient.deleteWithResponse(DeleteSnapshotsOptionType.INCLUDE, null, null, Context.NONE);
|
||||
```
|
||||
|
||||
### Copy Blob
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.models.BlobCopyInfo;
|
||||
import com.azure.core.util.polling.SyncPoller;
|
||||
|
||||
// Async copy (for large blobs or cross-account)
|
||||
SyncPoller<BlobCopyInfo, Void> poller = blobClient.beginCopy("<source-blob-url>", Duration.ofSeconds(1));
|
||||
poller.waitForCompletion();
|
||||
|
||||
// Sync copy from URL (for same account)
|
||||
blobClient.copyFromUrl("<source-blob-url>");
|
||||
```
|
||||
|
||||
### Generate SAS Token
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.sas.*;
|
||||
import java.time.OffsetDateTime;
|
||||
|
||||
// Blob-level SAS
|
||||
BlobSasPermission permissions = new BlobSasPermission().setReadPermission(true);
|
||||
OffsetDateTime expiry = OffsetDateTime.now().plusDays(1);
|
||||
|
||||
BlobServiceSasSignatureValues sasValues = new BlobServiceSasSignatureValues(expiry, permissions);
|
||||
String sasToken = blobClient.generateSas(sasValues);
|
||||
|
||||
// Container-level SAS
|
||||
BlobContainerSasPermission containerPermissions = new BlobContainerSasPermission()
|
||||
.setReadPermission(true)
|
||||
.setListPermission(true);
|
||||
|
||||
BlobServiceSasSignatureValues containerSasValues = new BlobServiceSasSignatureValues(expiry, containerPermissions);
|
||||
String containerSas = containerClient.generateSas(containerSasValues);
|
||||
```
|
||||
|
||||
### Blob Properties and Metadata
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.models.BlobProperties;
|
||||
|
||||
// Get properties
|
||||
BlobProperties properties = blobClient.getProperties();
|
||||
System.out.println("Size: " + properties.getBlobSize());
|
||||
System.out.println("Content-Type: " + properties.getContentType());
|
||||
System.out.println("Last Modified: " + properties.getLastModified());
|
||||
|
||||
// Set metadata
|
||||
Map<String, String> metadata = Map.of("key1", "value1", "key2", "value2");
|
||||
blobClient.setMetadata(metadata);
|
||||
|
||||
// Set HTTP headers
|
||||
BlobHttpHeaders headers = new BlobHttpHeaders()
|
||||
.setContentType("application/json")
|
||||
.setCacheControl("max-age=86400");
|
||||
blobClient.setHttpHeaders(headers);
|
||||
```
|
||||
|
||||
### Lease Blob
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.specialized.BlobLeaseClient;
|
||||
import com.azure.storage.blob.specialized.BlobLeaseClientBuilder;
|
||||
|
||||
BlobLeaseClient leaseClient = new BlobLeaseClientBuilder()
|
||||
.blobClient(blobClient)
|
||||
.buildClient();
|
||||
|
||||
// Acquire lease (-1 for infinite)
|
||||
String leaseId = leaseClient.acquireLease(60);
|
||||
|
||||
// Renew lease
|
||||
leaseClient.renewLease();
|
||||
|
||||
// Release lease
|
||||
leaseClient.releaseLease();
|
||||
```
|
||||
|
||||
## Error Handling
|
||||
|
||||
```java
|
||||
import com.azure.storage.blob.models.BlobStorageException;
|
||||
|
||||
try {
|
||||
blobClient.download(outputStream);
|
||||
} catch (BlobStorageException e) {
|
||||
System.out.println("Status: " + e.getStatusCode());
|
||||
System.out.println("Error code: " + e.getErrorCode());
|
||||
// 404 = Blob not found
|
||||
// 409 = Conflict (lease, etc.)
|
||||
}
|
||||
```
|
||||
|
||||
## Proxy Configuration
|
||||
|
||||
```java
|
||||
import com.azure.core.http.ProxyOptions;
|
||||
import com.azure.core.http.netty.NettyAsyncHttpClientBuilder;
|
||||
import java.net.InetSocketAddress;
|
||||
|
||||
ProxyOptions proxyOptions = new ProxyOptions(
|
||||
ProxyOptions.Type.HTTP,
|
||||
new InetSocketAddress("localhost", 8888));
|
||||
|
||||
BlobServiceClient client = new BlobServiceClientBuilder()
|
||||
.endpoint("<endpoint>")
|
||||
.sasToken("<sas-token>")
|
||||
.httpClient(new NettyAsyncHttpClientBuilder().proxy(proxyOptions).build())
|
||||
.buildClient();
|
||||
```
|
||||
|
||||
## Environment Variables
|
||||
|
||||
```bash
|
||||
AZURE_STORAGE_CONNECTION_STRING=DefaultEndpointsProtocol=https;AccountName=...
|
||||
AZURE_STORAGE_ACCOUNT_URL=https://<account>.blob.core.windows.net
|
||||
```
|
||||
|
||||
## Trigger Phrases
|
||||
|
||||
- "Azure Blob Storage Java"
|
||||
- "upload download blob"
|
||||
- "blob container SDK"
|
||||
- "storage streaming"
|
||||
- "SAS token generation"
|
||||
- "blob metadata properties"
|
||||
Reference in New Issue
Block a user