feat: Ipad app production readiness, Colony orchestration, Social posting (#44)
All checks were successful
Production Readiness / backend-contracts (push) Successful in 1m47s
Production Readiness / webos-typecheck (push) Successful in 1m50s
Production Readiness / ipad-parse (push) Successful in 1m34s

#38 Ipad app production readiness, Colony orchestration, Social posting

Co-authored-by: Sayan Datta <sayan@Sayans-MacBook-Air.local>
Reviewed-on: #44
This commit was merged in pull request #44.
This commit is contained in:
2026-05-03 18:30:38 +05:30
parent 59d398abc3
commit eeb684b46c
86 changed files with 20349 additions and 1655 deletions

View File

@@ -0,0 +1,8 @@
app_identifier("com.desineuron.velocity.ipad")
apple_id(ENV.fetch("FASTLANE_APPLE_ID", ""))
team_id(ENV.fetch("FASTLANE_TEAM_ID", "L29922NHD9"))
itc_team_id(ENV["FASTLANE_ITC_TEAM_ID"]) if ENV["FASTLANE_ITC_TEAM_ID"]
for_platform :ios do
app_identifier("com.desineuron.velocity.ipad")
end

View File

@@ -0,0 +1,84 @@
# App Store Connect metadata for Project Velocity iPad.
# Fastlane's TestFlight upload action consumes the metadata module below, while
# deliver can still use the App Store Connect and export-compliance settings.
module VelocityAppStoreConnectMetadata
module_function
def testflight_groups
ENV.fetch("FASTLANE_TESTFLIGHT_GROUPS", "Velocity Investor Demo")
.split(",")
.map(&:strip)
.reject(&:empty?)
end
def beta_app_review_info
{
contact_first_name: ENV.fetch("FASTLANE_BETA_CONTACT_FIRST_NAME", "Sayan"),
contact_last_name: ENV.fetch("FASTLANE_BETA_CONTACT_LAST_NAME", "Desi Neuron"),
contact_phone: ENV.fetch("FASTLANE_BETA_CONTACT_PHONE", "+919999999999"),
contact_email: ENV.fetch("FASTLANE_BETA_CONTACT_EMAIL", "ops@desineuron.in"),
demo_account_name: ENV.fetch("FASTLANE_BETA_DEMO_ACCOUNT", "demo@desineuron.in"),
demo_account_password: ENV.fetch("FASTLANE_BETA_DEMO_PASSWORD", ""),
notes: ENV.fetch(
"FASTLANE_BETA_REVIEW_NOTES",
"Please use the supplied demo account to validate Dashboard, Calendar, CRM Imports, Client 360, Oracle, Inventory, Sentinel, Communications, and Dream Weaver health states. The app is intended for managed iPad deployments for enterprise real estate sales teams."
)
}
end
def localized_build_info
{
"default" => {
whats_new: ENV.fetch(
"FASTLANE_CHANGELOG",
"Production candidate for investor demo validation with CRM, Oracle, Sentinel, Inventory, Communications, Calendar, and Dream Weaver workflows."
)
}
}
end
def localized_app_info
{
"default" => {
feedback_email: ENV.fetch("FASTLANE_BETA_FEEDBACK_EMAIL", "ops@desineuron.in"),
marketing_url: ENV.fetch("FASTLANE_MARKETING_URL", "https://velocity.desineuron.in"),
privacy_policy_url: ENV.fetch("FASTLANE_PRIVACY_URL", "https://velocity.desineuron.in/privacy"),
description: ENV.fetch(
"FASTLANE_BETA_DESCRIPTION",
"Velocity iPad is the native CRM, Oracle, Sentinel, Inventory, and Dream Weaver command center for enterprise real estate operators."
)
}
}
end
def submission_information
{
export_compliance_uses_encryption: false,
export_compliance_contains_third_party_cryptography: false,
export_compliance_contains_proprietary_cryptography: false,
export_compliance_available_on_french_store: true,
export_compliance_ccat_file: false,
add_id_info_uses_idfa: false
}
end
end
def velocity_fastlane_config(method_name, *args)
send(method_name, *args) if respond_to?(method_name)
end
velocity_fastlane_config(:app_identifier, "com.desineuron.velocity.ipad")
velocity_fastlane_config(:username, ENV.fetch("FASTLANE_APPLE_ID", ""))
velocity_fastlane_config(:team_id, ENV.fetch("FASTLANE_TEAM_ID", "L29922NHD9"))
velocity_fastlane_config(:itc_team_id, ENV["FASTLANE_ITC_TEAM_ID"]) if ENV["FASTLANE_ITC_TEAM_ID"]
velocity_fastlane_config(:app_platform, "ios")
velocity_fastlane_config(:skip_screenshots, true)
velocity_fastlane_config(:skip_binary_upload, true)
velocity_fastlane_config(:skip_app_version_update, true)
velocity_fastlane_config(:force, true)
velocity_fastlane_config(:run_precheck_before_submit, false)
velocity_fastlane_config(:submit_for_review, false)
velocity_fastlane_config(:automatic_release, false)
velocity_fastlane_config(:submission_information, VelocityAppStoreConnectMetadata.submission_information)

View File

@@ -0,0 +1,113 @@
default_platform(:ios)
deliverfile_path = File.expand_path("Deliverfile", __dir__)
load(deliverfile_path) if File.exist?(deliverfile_path)
platform :ios do
private_lane :release_context do
{
project: "velocity.xcodeproj",
scheme: ENV.fetch("VELOCITY_IOS_SCHEME", "velocity"),
app_identifier: "com.desineuron.velocity.ipad",
configuration: ENV.fetch("VELOCITY_IOS_CONFIGURATION", "Release"),
output_directory: ENV.fetch("VELOCITY_IOS_OUTPUT_DIR", "build/fastlane"),
derived_data_path: ENV.fetch("VELOCITY_IOS_DERIVED_DATA", "build/DerivedData"),
device: ENV.fetch("VELOCITY_IOS_TEST_DEVICE", "iPad Pro (12.9-inch) (6th generation)")
}
end
private_lane :testflight_metadata do
metadata = defined?(VelocityAppStoreConnectMetadata) ? VelocityAppStoreConnectMetadata : nil
UI.user_error!("fastlane/Deliverfile must define VelocityAppStoreConnectMetadata.") unless metadata
{
groups: metadata.testflight_groups,
beta_app_review_info: metadata.beta_app_review_info,
localized_build_info: metadata.localized_build_info,
localized_app_info: metadata.localized_app_info
}
end
desc "Fetch or create Apple Distribution certificate through fastlane cert"
lane :certificates do
cert(
development: false,
force: ENV["FASTLANE_FORCE_CERT"] == "1",
output_path: "fastlane/certs"
)
end
desc "Fetch or create App Store provisioning profile through fastlane sigh"
lane :profiles do
ctx = release_context
sigh(
app_identifier: ctx[:app_identifier],
adhoc: false,
skip_install: false,
force: ENV["FASTLANE_FORCE_PROFILE"] == "1",
filename: "Velocity_iPad_AppStore.mobileprovision",
output_path: "fastlane/profiles"
)
end
desc "Run unit and UI tests for the iPad app"
lane :tests do
ctx = release_context
scan(
project: ctx[:project],
scheme: ctx[:scheme],
devices: [ctx[:device]],
clean: true,
derived_data_path: ctx[:derived_data_path],
result_bundle: true,
output_directory: "#{ctx[:output_directory]}/test-results",
output_types: "html,junit",
include_simulator_logs: true,
fail_build: true
)
end
desc "Build the iPad app and upload it to TestFlight"
lane :beta do
ctx = release_context
metadata = testflight_metadata
certificates
profiles
tests
build_app(
project: ctx[:project],
scheme: ctx[:scheme],
configuration: ctx[:configuration],
clean: true,
export_method: "app-store",
output_directory: ctx[:output_directory],
output_name: "Velocity-iPad.ipa",
derived_data_path: ctx[:derived_data_path],
include_symbols: true,
include_bitcode: false,
xcargs: [
"DEVELOPMENT_TEAM=#{ENV.fetch("FASTLANE_TEAM_ID", "L29922NHD9")}",
"PRODUCT_BUNDLE_IDENTIFIER=#{ctx[:app_identifier]}"
].join(" ")
)
pilot(
ipa: "#{ctx[:output_directory]}/Velocity-iPad.ipa",
app_identifier: ctx[:app_identifier],
skip_waiting_for_build_processing: ENV.fetch("FASTLANE_SKIP_WAITING", "false") == "true",
distribute_external: ENV.fetch("FASTLANE_DISTRIBUTE_EXTERNAL", "1") == "1",
notify_external_testers: ENV["FASTLANE_NOTIFY_EXTERNAL_TESTERS"] == "1",
groups: metadata[:groups],
beta_app_review_info: metadata[:beta_app_review_info],
localized_app_info: metadata[:localized_app_info],
localized_build_info: metadata[:localized_build_info],
beta_app_feedback_email: metadata[:localized_app_info]["default"][:feedback_email],
beta_app_description: metadata[:localized_app_info]["default"][:description],
demo_account_required: true,
uses_non_exempt_encryption: false,
changelog: metadata[:localized_build_info]["default"][:whats_new]
)
end
end