-
Notifications
You must be signed in to change notification settings - Fork 454
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Gemspec] Bump CLAide to
'>= 1.0.1', '< 2.0'
- Loading branch information
Showing
6 changed files
with
238 additions
and
2 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,162 @@ | ||
require 'xcodeproj/scheme/xml_element_wrapper' | ||
|
||
module Xcodeproj | ||
class XCScheme | ||
COMMAND_LINE_ARGS_NODE = 'CommandLineArguments'.freeze | ||
COMMAND_LINE_ARG_NODE = 'CommandLineArgument'.freeze | ||
|
||
# This class wraps the CommandLineArguments node of a .xcscheme XML file. This | ||
# is just a container of CommandLineArgument objects. It can either appear on a | ||
# LaunchAction or TestAction scheme group. | ||
# | ||
class CommandLineArguments < XMLElementWrapper | ||
# @param [nil,REXML::Element,Array<CommandLineArgument>,Array<Hash{Symbol => String,Bool}>] node_or_arguments | ||
# The 'CommandLineArguments' XML node, or list of command line arguments, that this object represents. | ||
# - If nil, an empty 'CommandLineArguments' XML node will be created | ||
# - If an REXML::Element, it must be named 'CommandLineArguments' | ||
# - If an Array of objects or Hashes, they'll each be passed to {#assign_argument} | ||
# | ||
def initialize(node_or_arguments = nil) | ||
create_xml_element_with_fallback(node_or_arguments, COMMAND_LINE_ARGS_NODE) do | ||
@all_arguments = [] | ||
node_or_arguments.each { |var| assign_argument(var) } unless node_or_arguments.nil? | ||
end | ||
end | ||
|
||
# @return [Array<CommandLineArgument>] | ||
# The key value pairs currently set in @xml_element | ||
# | ||
def all_arguments | ||
@all_arguments ||= @xml_element.get_elements(COMMAND_LINE_ARG_NODE).map { |argument| CommandLineArgument.new(argument) } | ||
end | ||
|
||
# Adds a given argument to the set of command line arguments, or replaces it if that key already exists | ||
# | ||
# @param [CommandLineArgument,Hash{Symbol => String,Bool}] argument | ||
# The argument to add or update, backed by an CommandLineArgument node. | ||
# - If an CommandLineArgument, the previous reference will still be valid | ||
# - If a Hash, must conform to {CommandLineArgument#initialize} requirements | ||
# @return [Array<CommandLineArgument>] | ||
# The new set of command line arguments after addition | ||
# | ||
def assign_argument(argument) | ||
command_line_arg = if argument.is_a?(CommandLineArgument) | ||
argument | ||
else | ||
CommandLineArgument.new(argument) | ||
end | ||
all_arguments.each { |existing_var| remove_argument(existing_var) if existing_var.argument == command_line_arg.argument } | ||
@xml_element.add_element(command_line_arg.xml_element) | ||
@all_arguments << command_line_arg | ||
end | ||
|
||
# Removes a specified argument (by string or object) from the set of command line arguments | ||
# | ||
# @param [CommandLineArgument,String] argument | ||
# The argument to remove | ||
# @return [Array<CommandLineArgument>] | ||
# The new set of command line arguments after removal | ||
# | ||
def remove_argument(argument) | ||
command_line_arg = if argument.is_a?(CommandLineArgument) | ||
argument | ||
else | ||
CommandLineArgument.new(argument) | ||
end | ||
raise "Unexpected parameter type: #{command_line_arg.class}" unless command_line_arg.is_a?(CommandLineArgument) | ||
@xml_element.delete_element(command_line_arg.xml_element) | ||
@all_arguments -= [command_line_arg] | ||
end | ||
|
||
# @param [String] key | ||
# The key to lookup | ||
# @return [CommandLineArgument] argument | ||
# Returns the matching command line argument for a specified key | ||
# | ||
def [](argument) | ||
all_arguments.find { |var| var.argument == argument } | ||
end | ||
|
||
# Assigns a value for a specified key | ||
# | ||
# @param [String] key | ||
# The key to update in the command line arguments | ||
# @param [String] value | ||
# The value to lookup | ||
# @return [CommandLineArgument] argument | ||
# The newly updated command line argument | ||
# | ||
def []=(argument, enabled) | ||
assign_argument(:argument => argument, :enabled => enabled) | ||
self[argument] | ||
end | ||
|
||
# @return [Array<Hash{Symbol => String,Bool}>] | ||
# The current command line arguments represented as an array | ||
# | ||
def to_a | ||
all_arguments.map(&:to_h) | ||
end | ||
end | ||
|
||
# This class wraps the CommandLineArgument node of a .xcscheme XML file. | ||
# Environment arguments are accessible via the NSDictionary returned from | ||
# [[NSProcessInfo processInfo] arguments] in your app code. | ||
# | ||
class CommandLineArgument < XMLElementWrapper | ||
# @param [nil,REXML::Element,Hash{Symbol => String,Bool}] node_or_argument | ||
# - If nil, it will create a default XML node to use | ||
# - If a REXML::Element, should be a <CommandLineArgument> XML node to wrap | ||
# - If a Hash, must contain keys :key and :value (Strings) and optionally :enabled (Boolean) | ||
# | ||
def initialize(node_or_argument) | ||
create_xml_element_with_fallback(node_or_argument, COMMAND_LINE_ARG_NODE) do | ||
raise "Must pass a Hash with 'argument' and 'enabled'!" unless node_or_argument.is_a?(Hash) && | ||
node_or_argument.key?(:argument) && node_or_argument.key?(:enabled) | ||
|
||
@xml_element.attributes['argument'] = node_or_argument[:argument] | ||
@xml_element.attributes['isEnabled'] = if node_or_argument.key?(:enabled) | ||
bool_to_string(node_or_argument[:enabled]) | ||
else | ||
bool_to_string(false) | ||
end | ||
end | ||
end | ||
|
||
# Returns the CommandLineArgument's key | ||
# @return [String] | ||
# | ||
def argument | ||
@xml_element.attributes['argument'] | ||
end | ||
|
||
# Sets the CommandLineArgument's key | ||
# @param [String] key | ||
# | ||
def argument=(argument) | ||
@xml_element.attributes['argument'] = argument | ||
end | ||
|
||
# Returns the CommandLineArgument's enabled state | ||
# @return [Bool] | ||
# | ||
def enabled | ||
string_to_bool(@xml_element.attributes['isEnabled']) | ||
end | ||
|
||
# Sets the CommandLineArgument's enabled state | ||
# @param [Bool] enabled | ||
# | ||
def enabled=(enabled) | ||
@xml_element.attributes['isEnabled'] = bool_to_string(enabled) | ||
end | ||
|
||
# @return [Hash{:key => String, :value => String, :enabled => Bool}] | ||
# The command line argument XML node with attributes converted to a representative Hash | ||
# | ||
def to_h | ||
{ :argument => argument, :enabled => enabled } | ||
end | ||
end | ||
end | ||
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters