pantograph 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.yardopts +1 -0
- data/LICENSE +21 -0
- data/README.md +197 -0
- data/bin/bin-proxy +19 -0
- data/bin/pantograph +23 -0
- data/pantograph/README.md +11 -0
- data/pantograph/lib/assets/ActionDetails.md.erb +106 -0
- data/pantograph/lib/assets/Actions.md.erb +43 -0
- data/pantograph/lib/assets/DefaultPantfileTemplate +20 -0
- data/pantograph/lib/assets/completions/completion.bash +23 -0
- data/pantograph/lib/assets/completions/completion.fish +39 -0
- data/pantograph/lib/assets/completions/completion.sh +12 -0
- data/pantograph/lib/assets/completions/completion.zsh +23 -0
- data/pantograph/lib/assets/custom_action_template.rb +80 -0
- data/pantograph/lib/assets/report_template.xml.erb +15 -0
- data/pantograph/lib/pantograph/action.rb +194 -0
- data/pantograph/lib/pantograph/action_collector.rb +35 -0
- data/pantograph/lib/pantograph/actions/README.md +3 -0
- data/pantograph/lib/pantograph/actions/actions_helper.rb +166 -0
- data/pantograph/lib/pantograph/actions/add_extra_platforms.rb +45 -0
- data/pantograph/lib/pantograph/actions/artifactory.rb +157 -0
- data/pantograph/lib/pantograph/actions/bundle_install.rb +156 -0
- data/pantograph/lib/pantograph/actions/changelog_from_git_commits.rb +197 -0
- data/pantograph/lib/pantograph/actions/clipboard.rb +52 -0
- data/pantograph/lib/pantograph/actions/cloc.rb +89 -0
- data/pantograph/lib/pantograph/actions/create_pull_request.rb +190 -0
- data/pantograph/lib/pantograph/actions/danger.rb +131 -0
- data/pantograph/lib/pantograph/actions/debug.rb +32 -0
- data/pantograph/lib/pantograph/actions/default_platform.rb +47 -0
- data/pantograph/lib/pantograph/actions/download.rb +76 -0
- data/pantograph/lib/pantograph/actions/echo.rb +14 -0
- data/pantograph/lib/pantograph/actions/ensure_bundle_exec.rb +59 -0
- data/pantograph/lib/pantograph/actions/ensure_env_vars.rb +58 -0
- data/pantograph/lib/pantograph/actions/ensure_git_branch.rb +69 -0
- data/pantograph/lib/pantograph/actions/ensure_git_status_clean.rb +81 -0
- data/pantograph/lib/pantograph/actions/erb.rb +88 -0
- data/pantograph/lib/pantograph/actions/get_build_number_repository.rb +120 -0
- data/pantograph/lib/pantograph/actions/get_github_release.rb +163 -0
- data/pantograph/lib/pantograph/actions/git_add.rb +93 -0
- data/pantograph/lib/pantograph/actions/git_branch.rb +58 -0
- data/pantograph/lib/pantograph/actions/git_commit.rb +80 -0
- data/pantograph/lib/pantograph/actions/git_pull.rb +53 -0
- data/pantograph/lib/pantograph/actions/git_submodule_update.rb +52 -0
- data/pantograph/lib/pantograph/actions/git_tag_exists.rb +74 -0
- data/pantograph/lib/pantograph/actions/github_api.rb +262 -0
- data/pantograph/lib/pantograph/actions/gradle.rb +278 -0
- data/pantograph/lib/pantograph/actions/import.rb +49 -0
- data/pantograph/lib/pantograph/actions/import_from_git.rb +71 -0
- data/pantograph/lib/pantograph/actions/is_ci.rb +51 -0
- data/pantograph/lib/pantograph/actions/jira.rb +115 -0
- data/pantograph/lib/pantograph/actions/lane_context.rb +60 -0
- data/pantograph/lib/pantograph/actions/last_git_commit.rb +58 -0
- data/pantograph/lib/pantograph/actions/last_git_tag.rb +51 -0
- data/pantograph/lib/pantograph/actions/make_changelog_from_jenkins.rb +81 -0
- data/pantograph/lib/pantograph/actions/min_pantograph_version.rb +57 -0
- data/pantograph/lib/pantograph/actions/nexus_upload.rb +230 -0
- data/pantograph/lib/pantograph/actions/notification.rb +75 -0
- data/pantograph/lib/pantograph/actions/number_of_commits.rb +75 -0
- data/pantograph/lib/pantograph/actions/opt_out_usage.rb +40 -0
- data/pantograph/lib/pantograph/actions/pantograph_version.rb +15 -0
- data/pantograph/lib/pantograph/actions/println.rb +14 -0
- data/pantograph/lib/pantograph/actions/prompt.rb +119 -0
- data/pantograph/lib/pantograph/actions/push_git_tags.rb +76 -0
- data/pantograph/lib/pantograph/actions/push_to_git_remote.rb +127 -0
- data/pantograph/lib/pantograph/actions/puts.rb +68 -0
- data/pantograph/lib/pantograph/actions/reset_git_repo.rb +121 -0
- data/pantograph/lib/pantograph/actions/rocket.rb +83 -0
- data/pantograph/lib/pantograph/actions/rsync.rb +74 -0
- data/pantograph/lib/pantograph/actions/ruby_version.rb +56 -0
- data/pantograph/lib/pantograph/actions/say.rb +56 -0
- data/pantograph/lib/pantograph/actions/scp.rb +114 -0
- data/pantograph/lib/pantograph/actions/set_github_release.rb +274 -0
- data/pantograph/lib/pantograph/actions/sh.rb +71 -0
- data/pantograph/lib/pantograph/actions/skip_docs.rb +52 -0
- data/pantograph/lib/pantograph/actions/slack.rb +288 -0
- data/pantograph/lib/pantograph/actions/sonar.rb +156 -0
- data/pantograph/lib/pantograph/actions/ssh.rb +162 -0
- data/pantograph/lib/pantograph/actions/twitter.rb +89 -0
- data/pantograph/lib/pantograph/actions/update_pantograph.rb +177 -0
- data/pantograph/lib/pantograph/actions/zip.rb +120 -0
- data/pantograph/lib/pantograph/auto_complete.rb +82 -0
- data/pantograph/lib/pantograph/boolean.rb +5 -0
- data/pantograph/lib/pantograph/cli_tools_distributor.rb +183 -0
- data/pantograph/lib/pantograph/command_line_handler.rb +43 -0
- data/pantograph/lib/pantograph/commands_generator.rb +344 -0
- data/pantograph/lib/pantograph/configuration_helper.rb +26 -0
- data/pantograph/lib/pantograph/core_ext/bundler_monkey_patch.rb +14 -0
- data/pantograph/lib/pantograph/documentation/actions_list.rb +214 -0
- data/pantograph/lib/pantograph/documentation/docs_generator.rb +95 -0
- data/pantograph/lib/pantograph/documentation/markdown_docs_generator.rb +221 -0
- data/pantograph/lib/pantograph/environment_printer.rb +282 -0
- data/pantograph/lib/pantograph/erb_template_helper.rb +30 -0
- data/pantograph/lib/pantograph/features.rb +4 -0
- data/pantograph/lib/pantograph/helper/README.md +29 -0
- data/pantograph/lib/pantograph/helper/dotenv_helper.rb +50 -0
- data/pantograph/lib/pantograph/helper/gem_helper.rb +26 -0
- data/pantograph/lib/pantograph/helper/git_helper.rb +135 -0
- data/pantograph/lib/pantograph/helper/gradle_helper.rb +62 -0
- data/pantograph/lib/pantograph/helper/sh_helper.rb +134 -0
- data/pantograph/lib/pantograph/junit_generator.rb +27 -0
- data/pantograph/lib/pantograph/lane.rb +97 -0
- data/pantograph/lib/pantograph/lane_list.rb +77 -0
- data/pantograph/lib/pantograph/lane_manager.rb +140 -0
- data/pantograph/lib/pantograph/lane_manager_base.rb +92 -0
- data/pantograph/lib/pantograph/markdown_table_formatter.rb +62 -0
- data/pantograph/lib/pantograph/new_action.rb +47 -0
- data/pantograph/lib/pantograph/one_off.rb +45 -0
- data/pantograph/lib/pantograph/other_action.rb +29 -0
- data/pantograph/lib/pantograph/pant_file.rb +377 -0
- data/pantograph/lib/pantograph/pantograph_require.rb +75 -0
- data/pantograph/lib/pantograph/plugins/plugin_fetcher.rb +55 -0
- data/pantograph/lib/pantograph/plugins/plugin_generator.rb +86 -0
- data/pantograph/lib/pantograph/plugins/plugin_generator_ui.rb +19 -0
- data/pantograph/lib/pantograph/plugins/plugin_info.rb +49 -0
- data/pantograph/lib/pantograph/plugins/plugin_info_collector.rb +159 -0
- data/pantograph/lib/pantograph/plugins/plugin_manager.rb +387 -0
- data/pantograph/lib/pantograph/plugins/plugin_search.rb +46 -0
- data/pantograph/lib/pantograph/plugins/plugin_update_manager.rb +70 -0
- data/pantograph/lib/pantograph/plugins/plugins.rb +12 -0
- data/pantograph/lib/pantograph/plugins/template/%gem_name%.gemspec.erb +35 -0
- data/pantograph/lib/pantograph/plugins/template/.circleci/config.yml +43 -0
- data/pantograph/lib/pantograph/plugins/template/.gitignore +12 -0
- data/pantograph/lib/pantograph/plugins/template/.rspec +5 -0
- data/pantograph/lib/pantograph/plugins/template/.rubocop.yml +179 -0
- data/pantograph/lib/pantograph/plugins/template/.travis.yml +4 -0
- data/pantograph/lib/pantograph/plugins/template/Gemfile +6 -0
- data/pantograph/lib/pantograph/plugins/template/LICENSE.erb +21 -0
- data/pantograph/lib/pantograph/plugins/template/README.md.erb +52 -0
- data/pantograph/lib/pantograph/plugins/template/Rakefile +9 -0
- data/pantograph/lib/pantograph/plugins/template/lib/pantograph/plugin/%plugin_name%/actions/%plugin_name%_action.rb.erb +47 -0
- data/pantograph/lib/pantograph/plugins/template/lib/pantograph/plugin/%plugin_name%/helper/%plugin_name%_helper.rb.erb +16 -0
- data/pantograph/lib/pantograph/plugins/template/lib/pantograph/plugin/%plugin_name%/version.rb.erb +5 -0
- data/pantograph/lib/pantograph/plugins/template/lib/pantograph/plugin/%plugin_name%.rb.erb +16 -0
- data/pantograph/lib/pantograph/plugins/template/pantograph/Pantfile.erb +3 -0
- data/pantograph/lib/pantograph/plugins/template/pantograph/Pluginfile.erb +1 -0
- data/pantograph/lib/pantograph/plugins/template/spec/%plugin_name%_action_spec.rb.erb +9 -0
- data/pantograph/lib/pantograph/plugins/template/spec/spec_helper.rb.erb +15 -0
- data/pantograph/lib/pantograph/runner.rb +371 -0
- data/pantograph/lib/pantograph/server/action_command.rb +61 -0
- data/pantograph/lib/pantograph/server/action_command_return.rb +14 -0
- data/pantograph/lib/pantograph/server/command_executor.rb +7 -0
- data/pantograph/lib/pantograph/server/command_parser.rb +36 -0
- data/pantograph/lib/pantograph/server/control_command.rb +23 -0
- data/pantograph/lib/pantograph/server/json_return_value_processor.rb +72 -0
- data/pantograph/lib/pantograph/server/socket_server.rb +232 -0
- data/pantograph/lib/pantograph/server/socket_server_action_command_executor.rb +101 -0
- data/pantograph/lib/pantograph/setup/setup.rb +290 -0
- data/pantograph/lib/pantograph/setup/setup_android.rb +64 -0
- data/pantograph/lib/pantograph/setup/setup_ios.rb +412 -0
- data/pantograph/lib/pantograph/shells.rb +6 -0
- data/pantograph/lib/pantograph/supported_platforms.rb +28 -0
- data/pantograph/lib/pantograph/tools.rb +10 -0
- data/pantograph/lib/pantograph/version.rb +5 -0
- data/pantograph/lib/pantograph.rb +51 -0
- data/pantograph_core/README.md +79 -0
- data/pantograph_core/lib/assets/XMLTemplate.xml.erb +12 -0
- data/pantograph_core/lib/pantograph_core/analytics/action_completion_context.rb +34 -0
- data/pantograph_core/lib/pantograph_core/analytics/action_launch_context.rb +38 -0
- data/pantograph_core/lib/pantograph_core/analytics/analytics_event_builder.rb +23 -0
- data/pantograph_core/lib/pantograph_core/analytics/analytics_ingester_client.rb +54 -0
- data/pantograph_core/lib/pantograph_core/analytics/analytics_session.rb +71 -0
- data/pantograph_core/lib/pantograph_core/cert_checker.rb +116 -0
- data/pantograph_core/lib/pantograph_core/command_executor.rb +99 -0
- data/pantograph_core/lib/pantograph_core/configuration/commander_generator.rb +103 -0
- data/pantograph_core/lib/pantograph_core/configuration/config_item.rb +314 -0
- data/pantograph_core/lib/pantograph_core/configuration/configuration.rb +332 -0
- data/pantograph_core/lib/pantograph_core/configuration/configuration_file.rb +182 -0
- data/pantograph_core/lib/pantograph_core/core_ext/shellwords.rb +63 -0
- data/pantograph_core/lib/pantograph_core/core_ext/string.rb +17 -0
- data/pantograph_core/lib/pantograph_core/env.rb +9 -0
- data/pantograph_core/lib/pantograph_core/feature/feature.rb +51 -0
- data/pantograph_core/lib/pantograph_core/features.rb +4 -0
- data/pantograph_core/lib/pantograph_core/globals.rb +27 -0
- data/pantograph_core/lib/pantograph_core/helper.rb +409 -0
- data/pantograph_core/lib/pantograph_core/keychain_importer.rb +74 -0
- data/pantograph_core/lib/pantograph_core/languages.rb +14 -0
- data/pantograph_core/lib/pantograph_core/module.rb +29 -0
- data/pantograph_core/lib/pantograph_core/pantograph_folder.rb +39 -0
- data/pantograph_core/lib/pantograph_core/pantograph_pty.rb +57 -0
- data/pantograph_core/lib/pantograph_core/pkg_file_analyser.rb +44 -0
- data/pantograph_core/lib/pantograph_core/print_table.rb +131 -0
- data/pantograph_core/lib/pantograph_core/string_filters.rb +51 -0
- data/pantograph_core/lib/pantograph_core/swag.rb +85 -0
- data/pantograph_core/lib/pantograph_core/tag_version.rb +31 -0
- data/pantograph_core/lib/pantograph_core/test_parser.rb +107 -0
- data/pantograph_core/lib/pantograph_core/ui/disable_colors.rb +17 -0
- data/pantograph_core/lib/pantograph_core/ui/errors/pantograph_common_error.rb +19 -0
- data/pantograph_core/lib/pantograph_core/ui/errors/pantograph_crash.rb +11 -0
- data/pantograph_core/lib/pantograph_core/ui/errors/pantograph_error.rb +25 -0
- data/pantograph_core/lib/pantograph_core/ui/errors/pantograph_exception.rb +19 -0
- data/pantograph_core/lib/pantograph_core/ui/errors/pantograph_shell_error.rb +11 -0
- data/pantograph_core/lib/pantograph_core/ui/errors.rb +1 -0
- data/pantograph_core/lib/pantograph_core/ui/github_issue_inspector_reporter.rb +62 -0
- data/pantograph_core/lib/pantograph_core/ui/implementations/shell.rb +159 -0
- data/pantograph_core/lib/pantograph_core/ui/interface.rb +205 -0
- data/pantograph_core/lib/pantograph_core/ui/pantograph_runner.rb +276 -0
- data/pantograph_core/lib/pantograph_core/ui/ui.rb +26 -0
- data/pantograph_core/lib/pantograph_core/update_checker/changelog.rb +37 -0
- data/pantograph_core/lib/pantograph_core/update_checker/update_checker.rb +107 -0
- data/pantograph_core/lib/pantograph_core.rb +45 -0
- metadata +987 -0
@@ -0,0 +1,140 @@
|
|
1
|
+
require_relative 'lane_manager_base.rb'
|
2
|
+
|
3
|
+
module Pantograph
|
4
|
+
class LaneManager < LaneManagerBase
|
5
|
+
# @param platform The name of the platform to execute
|
6
|
+
# @param lane_name The name of the lane to execute
|
7
|
+
# @param parameters [Hash] The parameters passed from the command line to the lane
|
8
|
+
# @param env Dot Env Information
|
9
|
+
# @param A custom Pantfile path, this is used by pantograph.ci
|
10
|
+
# rubocop:disable Metrics/PerceivedComplexity
|
11
|
+
def self.cruise_lane(platform, lane, parameters = nil, env = nil, pantfile_path = nil)
|
12
|
+
UI.user_error!('lane must be a string') unless lane.kind_of?(String) || lane.nil?
|
13
|
+
UI.user_error!('platform must be a string') unless platform.kind_of?(String) || platform.nil?
|
14
|
+
UI.user_error!('parameters must be a hash') unless parameters.kind_of?(Hash) || parameters.nil?
|
15
|
+
|
16
|
+
ff = Pantograph::PantFile.new(pantfile_path || PantographCore::PantographFolder.pantfile_path)
|
17
|
+
|
18
|
+
is_platform = false
|
19
|
+
begin
|
20
|
+
is_platform = ff.is_platform_block?(lane)
|
21
|
+
rescue # rescue, because this raises an exception if it can't be found at all
|
22
|
+
end
|
23
|
+
|
24
|
+
unless is_platform
|
25
|
+
# maybe the user specified a default platform
|
26
|
+
# We'll only do this, if the lane specified isn't a platform, as we want to list all platforms then
|
27
|
+
|
28
|
+
# Make sure that's not a lane without a platform
|
29
|
+
unless ff.runner.available_lanes.include?(lane)
|
30
|
+
platform ||= Actions.lane_context[Actions::SharedValues::DEFAULT_PLATFORM]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
if !platform && lane
|
35
|
+
# Either, the user runs a specific lane in root or want to auto complete the available lanes for a platform
|
36
|
+
# e.g. `pantograph ios` should list all available iOS actions
|
37
|
+
if ff.is_platform_block?(lane)
|
38
|
+
platform = lane
|
39
|
+
lane = nil
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
platform, lane = choose_lane(ff, platform) unless lane
|
44
|
+
|
45
|
+
# xcodeproj has a bug in certain versions that causes it to change directories
|
46
|
+
# and not return to the original working directory
|
47
|
+
# https://github.com/CocoaPods/Xcodeproj/issues/426
|
48
|
+
# Setting this environment variable causes xcodeproj to work around the problem
|
49
|
+
ENV["FORK_XCODE_WRITING"] = "true" unless platform == 'android'
|
50
|
+
|
51
|
+
Pantograph::Helper::DotenvHelper.load_dot_env(env)
|
52
|
+
|
53
|
+
started = Time.now
|
54
|
+
e = nil
|
55
|
+
begin
|
56
|
+
ff.runner.execute(lane, platform, parameters)
|
57
|
+
rescue NameError => ex
|
58
|
+
print_lane_context
|
59
|
+
print_error_line(ex)
|
60
|
+
e = ex
|
61
|
+
rescue Exception => ex # rubocop:disable Lint/RescueException
|
62
|
+
# We also catch Exception, since the implemented action might send a SystemExit signal
|
63
|
+
# (or similar). We still want to catch that, since we want properly finish running pantograph
|
64
|
+
# Tested with `xcake`, which throws a `Xcake::Informative` object
|
65
|
+
|
66
|
+
print_lane_context
|
67
|
+
print_error_line(ex)
|
68
|
+
UI.error(ex.to_s) if ex.kind_of?(StandardError) # we don't want to print things like 'system exit'
|
69
|
+
e = ex
|
70
|
+
end
|
71
|
+
|
72
|
+
# After running the lanes, since skip_docs might be somewhere in-between
|
73
|
+
Pantograph::DocsGenerator.run(ff) unless skip_docs?
|
74
|
+
|
75
|
+
duration = ((Time.now - started) / 60.0).round
|
76
|
+
finish_pantograph(ff, duration, e)
|
77
|
+
|
78
|
+
return ff
|
79
|
+
end
|
80
|
+
# rubocop:enable Metrics/PerceivedComplexity
|
81
|
+
|
82
|
+
def self.skip_docs?
|
83
|
+
Helper.test? || PantographCore::Env.truthy?("PANTOGRAPH_SKIP_DOCS")
|
84
|
+
end
|
85
|
+
|
86
|
+
# Lane chooser if user didn't provide a lane
|
87
|
+
# @param platform: is probably nil, but user might have called `pantograph android`, and only wants to list those actions
|
88
|
+
def self.choose_lane(ff, platform)
|
89
|
+
available = []
|
90
|
+
|
91
|
+
# nil is the key for lanes that are not under a specific platform
|
92
|
+
lane_platforms = [nil] + Pantograph::SupportedPlatforms.all
|
93
|
+
lane_platforms.each do |p|
|
94
|
+
available += ff.runner.lanes[p].to_a.reject { |lane| lane.last.is_private }
|
95
|
+
end
|
96
|
+
|
97
|
+
if available.empty?
|
98
|
+
UI.user_error!("It looks like you don't have any lanes to run just yet. Check out how to get started here: https://github.com/pantograph/pantograph 🚀")
|
99
|
+
end
|
100
|
+
|
101
|
+
rows = []
|
102
|
+
available.each_with_index do |lane, index|
|
103
|
+
rows << [index + 1, lane.last.pretty_name, lane.last.description.join("\n")]
|
104
|
+
end
|
105
|
+
|
106
|
+
rows << [0, "cancel", "No selection, exit pantograph!"]
|
107
|
+
|
108
|
+
require 'terminal-table'
|
109
|
+
|
110
|
+
table = Terminal::Table.new(
|
111
|
+
title: "Available lanes to run",
|
112
|
+
headings: ['Number', 'Lane Name', 'Description'],
|
113
|
+
rows: PantographCore::PrintTable.transform_output(rows)
|
114
|
+
)
|
115
|
+
|
116
|
+
UI.message("Welcome to pantograph! Here's what your app is setup to do:")
|
117
|
+
|
118
|
+
puts(table)
|
119
|
+
|
120
|
+
i = UI.input("Which number would you like run?")
|
121
|
+
|
122
|
+
i = i.to_i - 1
|
123
|
+
if i >= 0 && available[i]
|
124
|
+
selection = available[i].last.pretty_name
|
125
|
+
UI.important("Running lane `#{selection}`. Next time you can do this by directly typing `pantograph #{selection}` 🚀.")
|
126
|
+
platform = selection.split(' ')[0]
|
127
|
+
lane_name = selection.split(' ')[1]
|
128
|
+
|
129
|
+
unless lane_name # no specific platform, just a root lane
|
130
|
+
lane_name = platform
|
131
|
+
platform = nil
|
132
|
+
end
|
133
|
+
|
134
|
+
return platform, lane_name # yeah
|
135
|
+
else
|
136
|
+
UI.user_error!("Run `pantograph` the next time you need to build, test or release your app 🚀")
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
module Pantograph
|
2
|
+
# Base class for all LaneManager classes
|
3
|
+
# Takes care of all common things like printing the lane description tables and loading .env files
|
4
|
+
class LaneManagerBase
|
5
|
+
def self.skip_docs?
|
6
|
+
Helper.test? || PantographCore::Env.truthy?("PANTOGRAPH_SKIP_DOCS")
|
7
|
+
end
|
8
|
+
|
9
|
+
# All the finishing up that needs to be done
|
10
|
+
def self.finish_pantograph(ff, duration, error, skip_message: false)
|
11
|
+
# Sometimes we don't have a pantfile
|
12
|
+
unless ff.nil?
|
13
|
+
ff.runner.did_finish
|
14
|
+
end
|
15
|
+
|
16
|
+
# Finished with all the lanes
|
17
|
+
Pantograph::JUnitGenerator.generate(Pantograph::Actions.executed_actions)
|
18
|
+
print_table(Pantograph::Actions.executed_actions)
|
19
|
+
|
20
|
+
Pantograph::PluginUpdateManager.show_update_status
|
21
|
+
|
22
|
+
if error
|
23
|
+
UI.error('pantograph finished with errors') unless skip_message
|
24
|
+
raise error
|
25
|
+
elsif duration > 5
|
26
|
+
UI.success("pantograph.tools just saved you #{duration} minutes! 🎉") unless skip_message
|
27
|
+
else
|
28
|
+
UI.success('pantograph.tools finished successfully 🎉') unless skip_message
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Print a table as summary of the executed actions
|
33
|
+
def self.print_table(actions)
|
34
|
+
return if actions.count == 0
|
35
|
+
return if PantographCore::Env.truthy?('PANTOGRAPH_SKIP_ACTION_SUMMARY') # User disabled table output
|
36
|
+
|
37
|
+
require 'terminal-table'
|
38
|
+
|
39
|
+
rows = []
|
40
|
+
actions.each_with_index do |current, i|
|
41
|
+
is_error_step = !current[:error].to_s.empty?
|
42
|
+
|
43
|
+
name = current[:name][0..60]
|
44
|
+
name = name.red if is_error_step
|
45
|
+
index = i + 1
|
46
|
+
index = "💥" if is_error_step
|
47
|
+
rows << [index, name, current[:time].to_i]
|
48
|
+
end
|
49
|
+
|
50
|
+
puts("")
|
51
|
+
puts(Terminal::Table.new(
|
52
|
+
title: "pantograph summary".green,
|
53
|
+
headings: ["Step", "Action", "Time (in s)"],
|
54
|
+
rows: PantographCore::PrintTable.transform_output(rows)
|
55
|
+
))
|
56
|
+
puts("")
|
57
|
+
end
|
58
|
+
|
59
|
+
def self.print_lane_context
|
60
|
+
return if Actions.lane_context.empty?
|
61
|
+
|
62
|
+
if PantographCore::Globals.verbose?
|
63
|
+
UI.important('Lane Context:'.yellow)
|
64
|
+
UI.message(Actions.lane_context)
|
65
|
+
return
|
66
|
+
end
|
67
|
+
|
68
|
+
# Print a nice table unless in PantographCore::Globals.verbose? mode
|
69
|
+
rows = Actions.lane_context.collect do |key, content|
|
70
|
+
[key, content.to_s]
|
71
|
+
end
|
72
|
+
|
73
|
+
require 'terminal-table'
|
74
|
+
puts(Terminal::Table.new({
|
75
|
+
title: "Lane Context".yellow,
|
76
|
+
rows: PantographCore::PrintTable.transform_output(rows)
|
77
|
+
}))
|
78
|
+
end
|
79
|
+
|
80
|
+
def self.print_error_line(ex)
|
81
|
+
error_line = ex.backtrace.first
|
82
|
+
return if error_line.nil?
|
83
|
+
|
84
|
+
error_line = error_line.match("Pantfile:(\\d+):")
|
85
|
+
return unless error_line
|
86
|
+
|
87
|
+
line = error_line[1]
|
88
|
+
UI.error("Error in your Pantfile at line #{line}")
|
89
|
+
UI.content_error(File.read(PantographCore::PantographFolder.pantfile_path, encoding: "utf-8"), line)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
module Pantograph
|
2
|
+
class MarkdownTableFormatter
|
3
|
+
# taken from: https://github.com/benbalter/markdown-table-formatter
|
4
|
+
def initialize(string, header = true)
|
5
|
+
@doc = string
|
6
|
+
@header = header
|
7
|
+
end
|
8
|
+
|
9
|
+
# converts the markdown string into an array of arrays
|
10
|
+
def parse
|
11
|
+
@table = []
|
12
|
+
rows = @doc.split(/\r?\n/)
|
13
|
+
rows.each do |row|
|
14
|
+
row_array = row.split("|")
|
15
|
+
row_array.each(&:strip!)
|
16
|
+
@table.push(row_array)
|
17
|
+
end
|
18
|
+
@table.delete_at(1) if @header # strip header separator
|
19
|
+
@table
|
20
|
+
end
|
21
|
+
|
22
|
+
def table
|
23
|
+
@table ||= parse
|
24
|
+
end
|
25
|
+
|
26
|
+
def column_width(column)
|
27
|
+
width = 0
|
28
|
+
table.each do |row|
|
29
|
+
length = row[column].strip.length
|
30
|
+
width = length if length > width
|
31
|
+
end
|
32
|
+
width
|
33
|
+
end
|
34
|
+
|
35
|
+
def pad(string, length)
|
36
|
+
string.strip.ljust(length, ' ')
|
37
|
+
end
|
38
|
+
|
39
|
+
def separator(length)
|
40
|
+
"".ljust(length, '-')
|
41
|
+
end
|
42
|
+
|
43
|
+
def header_separator_row
|
44
|
+
output = []
|
45
|
+
[*0...table.first.length].each do |column|
|
46
|
+
output.push(separator(column_width(column)))
|
47
|
+
end
|
48
|
+
output
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_md
|
52
|
+
output = ""
|
53
|
+
t = table.clone
|
54
|
+
t.insert(1, header_separator_row) if @header
|
55
|
+
t.each_with_index do |row, index|
|
56
|
+
row.map!.with_index { |cell_row, index_row| pad(cell_row, column_width(index_row)) }
|
57
|
+
output += "#{row.join(' | ').lstrip} |\n"
|
58
|
+
end
|
59
|
+
output
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Pantograph
|
2
|
+
# Guides the new user through creating a new action
|
3
|
+
module NewAction
|
4
|
+
def self.run(new_action_name: nil)
|
5
|
+
name = new_action_name && check_action_name_from_args(new_action_name) ? new_action_name : fetch_name
|
6
|
+
generate_action(name)
|
7
|
+
end
|
8
|
+
|
9
|
+
def self.fetch_name
|
10
|
+
puts("Must be lower case, and use a '_' between words. Do not use '.'".green)
|
11
|
+
puts("examples: 'testflight', 'upload_to_s3'".green)
|
12
|
+
name = UI.input("Name of your action: ")
|
13
|
+
until name_valid?(name)
|
14
|
+
puts("Name is invalid. Please ensure the name is all lowercase, free of spaces and without special characters! Try again.")
|
15
|
+
name = UI.input("Name of your action: ")
|
16
|
+
end
|
17
|
+
name
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.generate_action(name)
|
21
|
+
template = File.read("#{Pantograph::ROOT}/lib/assets/custom_action_template.rb")
|
22
|
+
template.gsub!('[[NAME]]', name)
|
23
|
+
template.gsub!('[[NAME_UP]]', name.upcase)
|
24
|
+
template.gsub!('[[NAME_CLASS]]', name.pantograph_class + 'Action')
|
25
|
+
|
26
|
+
actions_path = File.join((PantographCore::PantographFolder.path || Dir.pwd), 'actions')
|
27
|
+
FileUtils.mkdir_p(actions_path) unless File.directory?(actions_path)
|
28
|
+
|
29
|
+
path = File.join(actions_path, "#{name}.rb")
|
30
|
+
File.write(path, template)
|
31
|
+
UI.success("Created new action file '#{path}'. Edit it to implement your custom action.")
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.check_action_name_from_args(new_action_name)
|
35
|
+
if name_valid?(new_action_name)
|
36
|
+
new_action_name
|
37
|
+
else
|
38
|
+
puts("Name is invalid. Please ensure the name is all lowercase, free of spaces and without special characters! Try again.")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def self.name_valid?(name)
|
43
|
+
name =~ /^[a-z0-9_]+$/
|
44
|
+
end
|
45
|
+
private_class_method :name_valid?
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Pantograph
|
2
|
+
# Call actions without triggering a full lane
|
3
|
+
class OneOff
|
4
|
+
def self.execute(args: nil)
|
5
|
+
action_parameters = {}
|
6
|
+
action_name = nil
|
7
|
+
|
8
|
+
args.each do |current|
|
9
|
+
if current.include?(":") # that's a key/value which we want to pass to the lane
|
10
|
+
key, value = current.split(":", 2)
|
11
|
+
UI.user_error!("Please pass values like this: key:value") unless key.length > 0
|
12
|
+
value = CommandLineHandler.convert_value(value)
|
13
|
+
UI.verbose("Using #{key}: #{value}")
|
14
|
+
action_parameters[key.to_sym] = value
|
15
|
+
else
|
16
|
+
action_name ||= current
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
UI.crash!("invalid syntax") unless action_name
|
21
|
+
|
22
|
+
run(action: action_name,
|
23
|
+
parameters: action_parameters)
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.run(action: nil, parameters: nil)
|
27
|
+
Pantograph.load_actions
|
28
|
+
|
29
|
+
class_ref = Actions.action_class_ref(action)
|
30
|
+
unless class_ref
|
31
|
+
if Pantograph::Actions.formerly_bundled_actions.include?(action)
|
32
|
+
# This was a formerly bundled action which is now a plugin.
|
33
|
+
UI.verbose(caller.join("\n"))
|
34
|
+
UI.user_error!("The action '#{action}' is no longer bundled with pantograph. You can install it using `pantograph add_plugin #{action}`")
|
35
|
+
else
|
36
|
+
Pantograph::ActionsList.print_suggestions(action)
|
37
|
+
UI.user_error!("Action '#{action}' not available, run `pantograph actions` to get a full list")
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
r = Runner.new
|
42
|
+
r.execute_action(action, class_ref, [parameters], custom_dir: '.')
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
module Pantograph
|
2
|
+
# This class is used to call other actions from within actions
|
3
|
+
# We use a separate class so that we can easily identify when
|
4
|
+
# we have dependencies between actions
|
5
|
+
class OtherAction
|
6
|
+
attr_accessor :runner
|
7
|
+
|
8
|
+
def initialize(runner)
|
9
|
+
self.runner = runner
|
10
|
+
end
|
11
|
+
|
12
|
+
# Allows the user to call an action from an action
|
13
|
+
def method_missing(method_sym, *arguments, &_block)
|
14
|
+
# We have to go inside the pantograph directory
|
15
|
+
# since in the pantograph runner.rb we do the following
|
16
|
+
# custom_dir = ".."
|
17
|
+
# Dir.chdir(custom_dir) do
|
18
|
+
# this goes one folder up, since we're inside the "pantograph"
|
19
|
+
# folder at that point
|
20
|
+
# Since we call an action from an action we need to go inside
|
21
|
+
# the pantograph folder too
|
22
|
+
|
23
|
+
self.runner.trigger_action_by_name(method_sym,
|
24
|
+
PantographCore::PantographFolder.path,
|
25
|
+
true,
|
26
|
+
*arguments)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|