From 800260ef5c2bb8bef033cb99a1dd17287d2c81d5 Mon Sep 17 00:00:00 2001 From: harshitha-cstk Date: Fri, 17 Apr 2026 12:37:35 +0530 Subject: [PATCH 1/4] docs(DX-6048): add AGENTS.md, skills, and Cursor rules entry --- .cursor/rules/README.md | 5 +++ AGENTS.md | 43 ++++++++++++++++++++++++ skills/android/SKILL.md | 25 ++++++++++++++ skills/code-review/SKILL.md | 27 +++++++++++++++ skills/contentstack-android-cda/SKILL.md | 25 ++++++++++++++ skills/dev-workflow/SKILL.md | 26 ++++++++++++++ skills/framework/SKILL.md | 25 ++++++++++++++ skills/testing/SKILL.md | 29 ++++++++++++++++ 8 files changed, 205 insertions(+) create mode 100644 .cursor/rules/README.md create mode 100644 AGENTS.md create mode 100644 skills/android/SKILL.md create mode 100644 skills/code-review/SKILL.md create mode 100644 skills/contentstack-android-cda/SKILL.md create mode 100644 skills/dev-workflow/SKILL.md create mode 100644 skills/framework/SKILL.md create mode 100644 skills/testing/SKILL.md diff --git a/.cursor/rules/README.md b/.cursor/rules/README.md new file mode 100644 index 0000000..f5c1f87 --- /dev/null +++ b/.cursor/rules/README.md @@ -0,0 +1,5 @@ +# Cursor (optional) + +**Cursor** users: start at **[AGENTS.md](../../AGENTS.md)**. All conventions live in **`skills/*/SKILL.md`**. + +This folder only points contributors to **`AGENTS.md`** so editor-specific config does not duplicate the canonical docs. diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..0c98bd9 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,43 @@ +# Contentstack Android Delivery SDK – Agent guide + +**Universal entry point** for contributors and AI agents. Detailed conventions live in **`skills/*/SKILL.md`**. + +## What this repo is + +| Field | Detail | +|--------|--------| +| **Name:** | [contentstack-android](https://github.com/contentstack/contentstack-android) (`com.contentstack.sdk:android`) | +| **Purpose:** | Android library for the Contentstack Content Delivery API (Kotlin/Java consumers via AAR). | +| **Out of scope:** | Not the Java-only or iOS/Swift SDKs—those live in sibling repositories. | + +## Tech stack (at a glance) + +| Area | Details | +|------|---------| +| Language | Kotlin/Java; **compileSdk 34**; Java **17** compile options in `contentstack/build.gradle` | +| Build | Gradle (root `build.gradle`, `settings.gradle`, module **`contentstack/`**) | +| Tests | JUnit, Mockito, Robolectric, AndroidX Test—unit tests under `contentstack/src/test/` | +| Lint / coverage | JaCoCo integrated with debug unit tests (`testCoverageEnabled` on debug) | +| CI | `.github/workflows/check-branch.yml`, `publish-release.yml`, `sca-scan.yml`, `policy-scan.yml`, `codeql-analysis.yml` | + +## Commands (quick reference) + +| Command type | Command | +|--------------|---------| +| Unit tests (typical) | `./gradlew :contentstack:testDebugUnitTest` (from repo root) | +| Clean | `./gradlew clean` | + +## Where the documentation lives: skills + +| Skill | Path | What it covers | +|-------|------|----------------| +| **Development workflow** | [`skills/dev-workflow/SKILL.md`](skills/dev-workflow/SKILL.md) | Gradle, variants, CI, publishing | +| **Android CDA SDK** | [`skills/contentstack-android-cda/SKILL.md`](skills/contentstack-android-cda/SKILL.md) | Library API and module boundaries | +| **Android project layout** | [`skills/android/SKILL.md`](skills/android/SKILL.md) | `contentstack/` module, manifest, BuildConfig | +| **Testing** | [`skills/testing/SKILL.md`](skills/testing/SKILL.md) | Unit vs instrumented tests, Robolectric, JaCoCo | +| **Build & platform** | [`skills/framework/SKILL.md`](skills/framework/SKILL.md) | AGP, signing placeholders, `local.properties` | +| **Code review** | [`skills/code-review/SKILL.md`](skills/code-review/SKILL.md) | PR checklist | + +## Using Cursor (optional) + +If you use **Cursor**, [`.cursor/rules/README.md`](.cursor/rules/README.md) only points to **`AGENTS.md`**—same docs as everyone else. diff --git a/skills/android/SKILL.md b/skills/android/SKILL.md new file mode 100644 index 0000000..ccb954b --- /dev/null +++ b/skills/android/SKILL.md @@ -0,0 +1,25 @@ +--- +name: android +description: Use for Android module layout, Gradle config, and Kotlin/Java conventions in contentstack-android. +--- + +# Android project layout – contentstack-android + +## When to use + +- Editing `contentstack/build.gradle`, manifests, or source under `contentstack/src/` +- Adjusting `minSdk`, multidex, or packaging excludes + +## Instructions + +### Source trees + +- Follow standard Android library layout: **`main`**, **`test`**, **`androidTest`** under `contentstack/src/`. + +### Configuration + +- **`local.properties`** supplies machine-specific paths and optional keys—do not commit secrets; use the same keys the Gradle file expects (`host`, `APIKey`, etc. in `buildTypes`). + +### Java/Kotlin + +- Compile options target **Java 17** in the module—match language features accordingly. diff --git a/skills/code-review/SKILL.md b/skills/code-review/SKILL.md new file mode 100644 index 0000000..fb43584 --- /dev/null +++ b/skills/code-review/SKILL.md @@ -0,0 +1,27 @@ +--- +name: code-review +description: Use when reviewing PRs for contentstack-android—API stability, Gradle, tests, and mobile security. +--- + +# Code review – contentstack-android + +## When to use + +- Reviewing feature or fix PRs for the Android SDK +- Auditing dependency or manifest changes + +## Instructions + +### Checklist + +- **API**: Public SDK surface changes justified and documented. +- **Gradle**: Version bumps coherent; no accidental signing or secret commits. +- **Tests**: Unit tests for new logic; consider Robolectric limitations. +- **Manifest/resources**: No unnecessary permissions; ProGuard rules updated if needed. +- **Cross-SDK**: Behavior consistent with Java/Swift where applicable. + +### Severity hints + +- **Blocker**: Broken `:contentstack:testDebugUnitTest`, leaked credentials, or broken publish metadata. +- **Major**: Missing coverage for risky network or caching changes. +- **Minor**: Formatting, comments, internal refactors. diff --git a/skills/contentstack-android-cda/SKILL.md b/skills/contentstack-android-cda/SKILL.md new file mode 100644 index 0000000..1583fb2 --- /dev/null +++ b/skills/contentstack-android-cda/SKILL.md @@ -0,0 +1,25 @@ +--- +name: contentstack-android-cda +description: Use for the public Android Content Delivery SDK surface and package com.contentstack.sdk. +--- + +# Android CDA SDK – contentstack-android + +## When to use + +- Changing SDK entry points consumed by Android apps +- Working with stack configuration, entries, or HTTP client usage in this module + +## Instructions + +### Module + +- Primary code lives in **`contentstack/`** with namespace **`com.contentstack.sdk`** (`android { namespace ... }`). + +### API design + +- Keep public Java/Kotlin APIs stable for app developers—use semver for breaking changes in published AARs. + +### Integration + +- Behavior should stay aligned with other CDA SDKs where features overlap (queries, preview, etc.)—check parity with Java/Swift docs when adding features. diff --git a/skills/dev-workflow/SKILL.md b/skills/dev-workflow/SKILL.md new file mode 100644 index 0000000..ab06744 --- /dev/null +++ b/skills/dev-workflow/SKILL.md @@ -0,0 +1,26 @@ +--- +name: dev-workflow +description: Use for Gradle tasks, CI, release publishing, and branch flow in contentstack-android. +--- + +# Development workflow – contentstack-android + +## When to use + +- Running local builds/tests before a PR +- Aligning with GitHub Actions (branch checks, SCA, publish) + +## Instructions + +### Project shape + +- Root project **`contentstack-android`** includes module **`:contentstack`** (`settings.gradle`). + +### Commands + +- From repo root: `./gradlew :contentstack:testDebugUnitTest` for JVM unit tests on the library. +- Use `./gradlew clean` when switching branches or after AGP/cache issues. + +### CI + +- Workflows under `.github/workflows/` enforce policies and may publish artifacts—coordinate version bumps with `contentstack/build.gradle` `PUBLISH_*` fields. diff --git a/skills/framework/SKILL.md b/skills/framework/SKILL.md new file mode 100644 index 0000000..e176b47 --- /dev/null +++ b/skills/framework/SKILL.md @@ -0,0 +1,25 @@ +--- +name: framework +description: Use for AGP, Gradle plugins, JaCoCo, signing, and native Android build concerns in contentstack-android. +--- + +# Build & platform – contentstack-android + +## When to use + +- Upgrading Android Gradle Plugin, compile SDK, or dependencies +- Fixing signing, packaging excludes, or multidex issues + +## Instructions + +### Gradle + +- Root **`build.gradle`** pins AGP and Nexus publish plugin versions; module plugin **`com.android.library`** applies in `contentstack/build.gradle`. + +### Publishing + +- Maven coordinates use `PUBLISH_GROUP_ID`, `PUBLISH_ARTIFACT_ID`, `PUBLISH_VERSION`—bump with releases. + +### Keystore + +- Debug/release signing references **`key.keystore`** in the module—suitable for sample/debug only; production signing is consumer responsibility. diff --git a/skills/testing/SKILL.md b/skills/testing/SKILL.md new file mode 100644 index 0000000..759d280 --- /dev/null +++ b/skills/testing/SKILL.md @@ -0,0 +1,29 @@ +--- +name: testing +description: Use for JVM unit tests, Robolectric, AndroidX Test, and JaCoCo in contentstack-android. +--- + +# Testing – contentstack-android + +## When to use + +- Adding tests under `contentstack/src/test/` +- Debugging JaCoCo or unit-test-only failures + +## Instructions + +### Unit tests + +- Prefer **`testDebugUnitTest`** for fast feedback; Robolectric enables Android APIs on JVM where configured. + +### Instrumentation + +- **`androidTest`** exists for on-device tests—run on emulator/CI when changing UI-adjacent or integration paths. + +### Coverage + +- Debug builds enable **`testCoverageEnabled`**—JaCoCo outputs feed into reporting tasks defined in the module `build.gradle`. + +### Hygiene + +- Use **`MockWebserver`** and fixtures for HTTP; avoid embedding real stack credentials in the repo. From dd9d88d6a5f56dfc56ab59aab90b1f6568cd475c Mon Sep 17 00:00:00 2001 From: harshitha-cstk Date: Wed, 29 Apr 2026 08:13:06 +0530 Subject: [PATCH 2/4] chore: align release workflows with new development-to-main process --- .cursor/rules/dev-workflow.md | 2 +- .github/workflows/back-merge-pr.yml | 54 +++++++++++++++ .github/workflows/check-branch.yml | 20 ------ .github/workflows/check-version-bump.yml | 86 ++++++++++++++++++++++++ 4 files changed, 141 insertions(+), 21 deletions(-) create mode 100644 .github/workflows/back-merge-pr.yml delete mode 100644 .github/workflows/check-branch.yml create mode 100644 .github/workflows/check-version-bump.yml diff --git a/.cursor/rules/dev-workflow.md b/.cursor/rules/dev-workflow.md index 14a02d6..0d71b36 100644 --- a/.cursor/rules/dev-workflow.md +++ b/.cursor/rules/dev-workflow.md @@ -5,7 +5,7 @@ Use this as the standard workflow when contributing to the Android CDA SDK. ## Branches - Use feature branches for changes (e.g. `feat/...`, `fix/...`). -- Base work off the appropriate long-lived branch (e.g. `staging`, `development`) per team norms. +- Base work off the appropriate long-lived branch (e.g. `development`) per team norms. ## Running tests diff --git a/.github/workflows/back-merge-pr.yml b/.github/workflows/back-merge-pr.yml new file mode 100644 index 0000000..02b378c --- /dev/null +++ b/.github/workflows/back-merge-pr.yml @@ -0,0 +1,54 @@ +name: Back-merge master to development + +on: + push: + branches: + - master + workflow_dispatch: + +permissions: + contents: read + pull-requests: write + +jobs: + open-back-merge-pr: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Open back-merge PR if needed + env: + GH_TOKEN: ${{ github.token }} + run: | + set -euo pipefail + BASE_BRANCH="development" + SOURCE_BRANCH="master" + + git fetch origin "$BASE_BRANCH" "$SOURCE_BRANCH" + + if ! git show-ref --verify --quiet "refs/remotes/origin/$BASE_BRANCH"; then + echo "Base branch '$BASE_BRANCH' does not exist on origin; skipping." + exit 0 + fi + + SOURCE_SHA=$(git rev-parse "origin/$SOURCE_BRANCH") + BASE_SHA=$(git rev-parse "origin/$BASE_BRANCH") + + if [ "$SOURCE_SHA" = "$BASE_SHA" ]; then + echo "$SOURCE_BRANCH and $BASE_BRANCH are at the same commit; nothing to back-merge." + exit 0 + fi + + EXISTING=$(gh pr list --repo "${{ github.repository }}" --base "$BASE_BRANCH" --head "$SOURCE_BRANCH" --state open --json number --jq 'length') + + if [ "$EXISTING" -gt 0 ]; then + echo "An open PR from $SOURCE_BRANCH to $BASE_BRANCH already exists; skipping." + exit 0 + fi + + gh pr create --repo "${{ github.repository }}" --base "$BASE_BRANCH" --head "$SOURCE_BRANCH" --title "chore: back-merge $SOURCE_BRANCH into $BASE_BRANCH" --body "Automated back-merge after changes landed on \\`$SOURCE_BRANCH\\`. Review and merge to keep \\`$BASE_BRANCH\\` in sync." + + echo "Created back-merge PR $SOURCE_BRANCH -> $BASE_BRANCH." diff --git a/.github/workflows/check-branch.yml b/.github/workflows/check-branch.yml deleted file mode 100644 index 8a3a32a..0000000 --- a/.github/workflows/check-branch.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: 'Check Branch' - -on: - pull_request: - -jobs: - check_branch: - runs-on: ubuntu-latest - steps: - - name: Comment PR - if: github.base_ref == 'master' && github.head_ref != 'staging' - uses: thollander/actions-comment-pull-request@v2 - with: - message: | - We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the staging branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch. - - name: Check branch - if: github.base_ref == 'master' && github.head_ref != 'staging' - run: | - echo "ERROR: We regret to inform you that you are currently not able to merge your changes into the master branch due to restrictions applied by our SRE team. To proceed with merging your changes, we kindly request that you create a pull request from the staging branch. Our team will then review the changes and work with you to ensure a successful merge into the master branch." - exit 1 \ No newline at end of file diff --git a/.github/workflows/check-version-bump.yml b/.github/workflows/check-version-bump.yml new file mode 100644 index 0000000..8e71000 --- /dev/null +++ b/.github/workflows/check-version-bump.yml @@ -0,0 +1,86 @@ +name: Check Version Bump + +on: + pull_request: + +jobs: + version-bump: + name: Version & Changelog bump + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Detect changed files and version bump + id: detect + run: | + if git rev-parse HEAD^2 >/dev/null 2>&1; then + FILES=$(git diff --name-only HEAD^1 HEAD^2) + else + FILES=$(git diff --name-only HEAD~1 HEAD) + fi + VERSION_FILES_CHANGED=false + echo "$FILES" | grep -qx 'package.json' && VERSION_FILES_CHANGED=true + echo "$FILES" | grep -qx 'CHANGELOG.md' && VERSION_FILES_CHANGED=true + echo "version_files_changed=$VERSION_FILES_CHANGED" >> $GITHUB_OUTPUT + # Only lib/, webpack/, dist/, package.json count as release-affecting; .github/ and test/ do not + CODE_CHANGED=false + echo "$FILES" | grep -qE '^lib/|^webpack/|^dist/' && CODE_CHANGED=true + echo "$FILES" | grep -qx 'package.json' && CODE_CHANGED=true + echo "code_changed=$CODE_CHANGED" >> $GITHUB_OUTPUT + + - name: Skip when only test/docs/.github changed + if: steps.detect.outputs.code_changed != 'true' + run: | + echo "No release-affecting files changed (e.g. only test/docs/.github). Skipping version-bump check." + exit 0 + + - name: Fail when version bump was missed + if: steps.detect.outputs.code_changed == 'true' && steps.detect.outputs.version_files_changed != 'true' + run: | + echo "::error::This PR has code changes but no version bump. Please bump the version in package.json and add an entry in CHANGELOG.md." + exit 1 + + - name: Setup Node + if: steps.detect.outputs.code_changed == 'true' && steps.detect.outputs.version_files_changed == 'true' + uses: actions/setup-node@v4 + with: + node-version: '22.x' + + - name: Check version bump + if: steps.detect.outputs.code_changed == 'true' && steps.detect.outputs.version_files_changed == 'true' + run: | + set -e + PKG_VERSION=$(node -p "require('./package.json').version.replace(/^v/, '')") + if [ -z "$PKG_VERSION" ]; then + echo "::error::Could not read version from package.json" + exit 1 + fi + git fetch --tags --force 2>/dev/null || true + LATEST_TAG=$(git describe --tags --abbrev=0 2>/dev/null || true) + if [ -z "$LATEST_TAG" ]; then + echo "No existing tags found. Skipping version-bump check (first release)." + exit 0 + fi + LATEST_VERSION="${LATEST_TAG#v}" + LATEST_VERSION="${LATEST_VERSION%%-*}" + if [ "$(printf '%s\n' "$LATEST_VERSION" "$PKG_VERSION" | sort -V | tail -1)" != "$PKG_VERSION" ]; then + echo "::error::Version bump required: package.json version ($PKG_VERSION) is not greater than latest tag ($LATEST_TAG). Please bump the version in package.json." + exit 1 + fi + if [ "$PKG_VERSION" = "$LATEST_VERSION" ]; then + echo "::error::Version bump required: package.json version ($PKG_VERSION) equals latest tag ($LATEST_TAG). Please bump the version in package.json." + exit 1 + fi + CHANGELOG_VERSION=$(sed -nE 's/^## \[v?([0-9]+\.[0-9]+\.[0-9]+).*/\1/p' CHANGELOG.md | head -1) + if [ -z "$CHANGELOG_VERSION" ]; then + echo "::error::Could not find a version entry in CHANGELOG.md (expected line like '## [v1.0.0](...)')." + exit 1 + fi + if [ "$CHANGELOG_VERSION" != "$PKG_VERSION" ]; then + echo "::error::CHANGELOG version mismatch: CHANGELOG.md top version ($CHANGELOG_VERSION) does not match package.json version ($PKG_VERSION). Please add or update the CHANGELOG entry for $PKG_VERSION." + exit 1 + fi + echo "Version bump check passed: package.json and CHANGELOG.md are at $PKG_VERSION (latest tag: $LATEST_TAG)." From 0c7c5ed80f6f34d53a6280c030cf73877bbe20be Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Thu, 28 May 2026 12:29:14 +0530 Subject: [PATCH 3/4] fix: update Stack class to set URL from config and enhance TestStack with region-specific URL tests --- .../main/java/com/contentstack/sdk/Stack.java | 1 + .../java/com/contentstack/sdk/TestStack.java | 34 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/contentstack/src/main/java/com/contentstack/sdk/Stack.java b/contentstack/src/main/java/com/contentstack/sdk/Stack.java index eda16a2..43aa73f 100755 --- a/contentstack/src/main/java/com/contentstack/sdk/Stack.java +++ b/contentstack/src/main/java/com/contentstack/sdk/Stack.java @@ -98,6 +98,7 @@ protected void setConfig(Config config) { } } String endpoint = config.PROTOCOL + config.URL; + URL = config.URL; this.config.setEndpoint(endpoint); client(endpoint); diff --git a/contentstack/src/test/java/com/contentstack/sdk/TestStack.java b/contentstack/src/test/java/com/contentstack/sdk/TestStack.java index a427c85..f6ec85b 100644 --- a/contentstack/src/test/java/com/contentstack/sdk/TestStack.java +++ b/contentstack/src/test/java/com/contentstack/sdk/TestStack.java @@ -13,7 +13,9 @@ import org.robolectric.annotation.Config; import java.util.Date; +import java.util.HashMap; import java.util.LinkedHashMap; +import java.util.Map; import static org.junit.Assert.*; @@ -360,7 +362,7 @@ public void testStackWithCustomConfig() throws Exception { @Test public void testStackWithDifferentRegions() throws Exception { com.contentstack.sdk.Config.ContentstackRegion[] regions = com.contentstack.sdk.Config.ContentstackRegion.values(); - + for (com.contentstack.sdk.Config.ContentstackRegion region : regions) { com.contentstack.sdk.Config config = new com.contentstack.sdk.Config(); config.setRegion(region); @@ -369,6 +371,36 @@ public void testStackWithDifferentRegions() throws Exception { } } + @Test + public void testAzureNaRegionSetsCorrectURL() throws Exception { + com.contentstack.sdk.Config config = new com.contentstack.sdk.Config(); + config.setRegion(com.contentstack.sdk.Config.ContentstackRegion.AZURE_NA); + Stack regionalStack = Contentstack.stack(mockContext, "api_key", "token", "env", config); + assertEquals("azure-na-cdn.contentstack.com", regionalStack.URL); + } + + @Test + public void testNonUsRegionsSetsCorrectStackURL() throws Exception { + Map expectedHosts = new HashMap<>(); + expectedHosts.put(com.contentstack.sdk.Config.ContentstackRegion.EU, "eu-cdn.contentstack.io"); + expectedHosts.put(com.contentstack.sdk.Config.ContentstackRegion.AU, "au-cdn.contentstack.com"); + expectedHosts.put(com.contentstack.sdk.Config.ContentstackRegion.AZURE_NA, "azure-na-cdn.contentstack.com"); + expectedHosts.put(com.contentstack.sdk.Config.ContentstackRegion.AZURE_EU, "azure-eu-cdn.contentstack.com"); + expectedHosts.put(com.contentstack.sdk.Config.ContentstackRegion.GCP_NA, "gcp-na-cdn.contentstack.com"); + expectedHosts.put(com.contentstack.sdk.Config.ContentstackRegion.GCP_EU, "gcp-eu-cdn.contentstack.com"); + + for (Map.Entry entry : expectedHosts.entrySet()) { + com.contentstack.sdk.Config config = new com.contentstack.sdk.Config(); + config.setRegion(entry.getKey()); + Stack regionalStack = Contentstack.stack(mockContext, "api_key", "token", "env", config); + assertEquals( + "Stack.URL mismatch for region " + entry.getKey(), + entry.getValue(), + regionalStack.URL + ); + } + } + @Test public void testContentTypeEntryCreation() { ContentType contentType = stack.contentType("products"); From 781225743371ae204d8a9408a8064f8167e890ed Mon Sep 17 00:00:00 2001 From: reeshika-h Date: Thu, 28 May 2026 13:24:01 +0530 Subject: [PATCH 4/4] version bump --- CHANGELOG.md | 6 ++++++ contentstack/build.gradle | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3d3c46e..e2a7f70 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # CHANGELOG +## Version 4.2.2 + +### Date: 01-Jun-2026 + +- Fix: resolved data fetch failure for non-US regions (AZURE_NA, EU, AU, AZURE_EU, GCP_NA, GCP_EU) when connected via VPN by ensuring Stack.URL is correctly synced with the region-specific CDN host after config initialisation. + ## Version 4.2.1 ### Date: 20-Apr-2026 diff --git a/contentstack/build.gradle b/contentstack/build.gradle index 3687fbc..798afd6 100755 --- a/contentstack/build.gradle +++ b/contentstack/build.gradle @@ -7,7 +7,7 @@ plugins { ext { PUBLISH_GROUP_ID = 'com.contentstack.sdk' PUBLISH_ARTIFACT_ID = 'android' - PUBLISH_VERSION = '4.2.1' + PUBLISH_VERSION = '4.2.2' } android {