lib/issuer/sites/base.rb
# frozen_string_literal: true module Issuer module Sites class Base # Site identification def site_name raise NotImplementedError, "Subclasses must implement site_name" end # Field display labels for dry-run output formatting # Maps site-specific parameter names to user-friendly display labels def field_mappings raise NotImplementedError, "Subclasses must implement field_mappings" end # Resource validation and preparation def validate_and_prepare_resources proj, issues raise NotImplementedError, "Subclasses must implement validate_and_prepare_resources" end # Issue creation def create_issue proj, issue_params raise NotImplementedError, "Subclasses must implement create_issue" end # Resource queries for validation def get_versions proj raise NotImplementedError, "Subclasses must implement get_versions" end def get_tags proj raise NotImplementedError, "Subclasses must implement get_tags" end # Resource creation for validation def create_version proj, version_name, options={} raise NotImplementedError, "Subclasses must implement create_version" end def create_tag proj, tag_name, options={} raise NotImplementedError, "Subclasses must implement create_tag" end # Resource cleanup methods for caching/undo functionality def close_issue proj, issue_number raise NotImplementedError, "Subclasses must implement close_issue" end def delete_milestone proj, milestone_number raise NotImplementedError, "Subclasses must implement delete_milestone" end def delete_label proj, label_name raise NotImplementedError, "Subclasses must implement delete_label" end # Convert IMYML issue to site-specific parameters def convert_issue_to_site_params issue, proj, dry_run: false raise NotImplementedError, "Subclasses must implement convert_issue_to_site_params" end # Issue posting def post_issues proj, issues, run_id = nil processed_count = 0 issues.each do |issue| begin # Convert IMYML issue to site-specific parameters # Pass run_id to enable post-validation milestone lookup site_params = convert_issue_to_site_params(issue, proj, dry_run: false, post_validation: true) result = create_issue(proj, site_params) # Extract the created issue object (for backwards compatibility) created_issue = result.is_a?(Hash) ? result[:object] : result puts "✅ Created issue ##{created_issue.number}: #{issue.summ}" puts " URL: #{created_issue.html_url}" if created_issue.respond_to?(:html_url) processed_count += 1 # Log the created issue if tracking is enabled if run_id && result.is_a?(Hash) && result[:tracking_data] require_relative '../cache' Issuer::Cache.log_issue_created(run_id, result[:tracking_data]) end # Rate limiting courtesy sleep(1) if processed_count % 10 == 0 rescue => e puts "❌ Failed to create issue '#{issue.summ}': #{e.message}" end end processed_count end protected # Site-specific configuration validation def validate_configuration raise NotImplementedError, "Subclasses must implement validate_configuration" end # Site-specific authentication def authenticate raise NotImplementedError, "Subclasses must implement authenticate" end end end end