Skip to content

Commit

Permalink
Merge pull request #17 from jdee/expand-macros
Browse files Browse the repository at this point in the history
expand macros in settings
  • Loading branch information
jdee authored Jun 20, 2017
2 parents 029f7a4 + 7fb91f5 commit ba0fe7e
Show file tree
Hide file tree
Showing 2 changed files with 84 additions and 6 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -58,15 +58,10 @@ def settings_from_project(project, configuration, target_name)
raise "No application target found" if target.nil?
end

# find the Info.plist paths for all configurations
info_plist_paths = target.resolved_build_setting "INFOPLIST_FILE"

raise "INFOPLIST_FILE not found in target" if info_plist_paths.nil? or info_plist_paths.empty?

# this can differ from one configuration to another.
# take from Release, since only one Settings.bundle per project
# (not per configuration)
release_info_plist_path = info_plist_paths[configuration]
release_info_plist_path = expanded_build_setting target, "INFOPLIST_FILE", configuration

raise "Info.plist not found for configuration #{configuration}" if release_info_plist_path.nil?

Expand Down Expand Up @@ -159,6 +154,31 @@ def xcodeproj_path_from_params(params)
# one project found: great
xcodeproj_paths.first
end

def expanded_build_setting(target, setting_name, configuration)
setting_values = target.resolved_build_setting setting_name
return if setting_values.nil?
setting_value = setting_values[configuration]
return if setting_value.nil?
expand_macros target, setting_value, configuration
end

def expand_macros(target, setting_value, configuration)
# TODO: Properly balance these delimiters. Currently it will also match
# $(SETTING} and ${SETTING). See the pending spec.
matches = /\$[{(]([^})]+)[})]/.match(setting_value)
return setting_value if matches.nil?

macro_name = matches[1]
return setting_value if macro_name.nil?

expanded_macro = macro_name == "SRCROOT" ? "." : expanded_build_setting(target, macro_name, configuration)
return setting_value if expanded_macro.nil?

setting_value.gsub!(/\$[{(]#{macro_name}[})]/, expanded_macro)

expand_macros target, setting_value, configuration
end
end
end
end
Expand Down
58 changes: 58 additions & 0 deletions spec/settings_bundle_helper_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -438,4 +438,62 @@
expect(helper.xcodeproj_path_from_params({})).to be_nil
end
end

describe "#expanded_build_setting" do
let (:target) { double "target" }
it "expands values delimited by $()" do
expect(target).to receive(:resolved_build_setting).with("SETTING_WITH_NESTED_VALUE") { { "Release" => "$(SETTING_VALUE)" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE") { { "Release" => "value" } }
expect(helper.expanded_build_setting(target, "SETTING_WITH_NESTED_VALUE", "Release")).to eq "value"
end

it "expands values delimited by ${}" do
expect(target).to receive(:resolved_build_setting).with("SETTING_WITH_NESTED_VALUE") { { "Release" => "${SETTING_VALUE}" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE") { { "Release" => "value" } }
expect(helper.expanded_build_setting(target, "SETTING_WITH_NESTED_VALUE", "Release")).to eq "value"
end

it "returns nil if the setting is not present" do
expect(target).to receive(:resolved_build_setting).with("NONEXISTENT_SETTING") { { "Release" => nil } }
expect(helper.expanded_build_setting(target, "NONEXISTENT_SETTING", "Release")).to be_nil
end

it "substitutes . for $(SRCROOT)" do
expect(target).to receive(:resolved_build_setting).with("SETTING_USING_SRCROOT") { { "Release" => "$(SRCROOT)/some.file" } }
expect(helper.expanded_build_setting(target, "SETTING_USING_SRCROOT", "Release")).to eq "./some.file"
end

it "returns the setting when no macro present" do
expect(target).to receive(:resolved_build_setting).with("SETTING_WITHOUT_MACRO") { { "Release" => "setting" } }
expect(helper.expanded_build_setting(target, "SETTING_WITHOUT_MACRO", "Release")).to eq "setting"
end

it "expands multiple instances of the same macro" do
expect(target).to receive(:resolved_build_setting).with("SETTING_WITH_NESTED_VALUE") { { "Release" => "$(SETTING_VALUE).$(SETTING_VALUE)" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE") { { "Release" => "value" } }
expect(helper.expanded_build_setting(target, "SETTING_WITH_NESTED_VALUE", "Release")).to eq "value.value"
end

it "expands multiple macros in a setting" do
expect(target).to receive(:resolved_build_setting).with("SETTING_WITH_NESTED_VALUES") { { "Release" => "$(SETTING_VALUE1).$(SETTING_VALUE2)" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE1") { { "Release" => "value1" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE2") { { "Release" => "value2" } }
expect(helper.expanded_build_setting(target, "SETTING_WITH_NESTED_VALUES", "Release")).to eq "value1.value2"
end

it "balances delimiters" do
pending "sort out the regex matching"
expect(target).to receive(:resolved_build_setting).with("SETTING_WITH_NESTED_VALUES") { { "Release" => "$(SETTING_VALUE1}.${SETTING_VALUE2)" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE1") { { "Release" => "value1" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE2") { { "Release" => "value2" } }
expect(helper.expanded_build_setting(target, "SETTING_WITH_NESTED_VALUES", "Release")).to eq "$(SETTING_VALUE1}.${SETTING_VALUE2)"
end

it "expands recursively" do
expect(target).to receive(:resolved_build_setting).with("SETTING_WITH_NESTED_VALUES") { { "Release" => "$(SETTING_VALUE1)" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE1") { { "Release" => "$(SETTING_VALUE2)" } }
expect(target).to receive(:resolved_build_setting).with("SETTING_VALUE2") { { "Release" => "value2" } }
expect(helper.expanded_build_setting(target, "SETTING_WITH_NESTED_VALUES", "Release")).to eq "value2"
end
end
end

0 comments on commit ba0fe7e

Please sign in to comment.