trip_advisor 0.0.15
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.document +5 -0
- data/.gitignore +52 -0
- data/.rspec +1 -0
- data/.ruby-version +1 -0
- data/.travis.yml +5 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +118 -0
- data/LICENSE.txt +20 -0
- data/README.md +23 -0
- data/Rakefile +7 -0
- data/lib/trip_advisor/api.rb +45 -0
- data/lib/trip_advisor/build.rb +221 -0
- data/lib/trip_advisor/rake_tasks.rb +182 -0
- data/lib/trip_advisor/resource_manager.rb +101 -0
- data/lib/trip_advisor/strings_file.rb +112 -0
- data/lib/trip_advisor/translation.rb +63 -0
- data/lib/trip_advisor/translation_tool.rb +110 -0
- data/lib/trip_advisor/version.rb +3 -0
- data/lib/trip_advisor.rb +5 -0
- data/run_tests.sh +6 -0
- data/spec/api_spec.rb +34 -0
- data/spec/builder_spec.rb +262 -0
- data/spec/fixtures/AndroidStrings.txt +21 -0
- data/spec/fixtures/Strings.txt +47 -0
- data/spec/fixtures/project.git/.gitignore +1 -0
- data/spec/fixtures/project.git/BUILD.json +7 -0
- data/spec/fixtures/project.git/Code/Project.h +0 -0
- data/spec/fixtures/project.git/Code/Project.m +0 -0
- data/spec/fixtures/project.git/Gemfile +3 -0
- data/spec/fixtures/project.git/Gemfile.lock +38 -0
- data/spec/fixtures/project.git/HEAD +1 -0
- data/spec/fixtures/project.git/LICENSE +1 -0
- data/spec/fixtures/project.git/Podfile +6 -0
- data/spec/fixtures/project.git/Podfile.lock +14 -0
- data/spec/fixtures/project.git/Project.podspec +14 -0
- data/spec/fixtures/project.git/TestProject/Images.xcassets/AppIcon.appiconset/Contents.json +23 -0
- data/spec/fixtures/project.git/TestProject/Images.xcassets/LaunchImage.launchimage/Contents.json +23 -0
- data/spec/fixtures/project.git/TestProject/TATPAppDelegate.h +15 -0
- data/spec/fixtures/project.git/TestProject/TATPAppDelegate.m +49 -0
- data/spec/fixtures/project.git/TestProject/TestProject-Info.plist +38 -0
- data/spec/fixtures/project.git/TestProject/TestProject-Prefix.pch +16 -0
- data/spec/fixtures/project.git/TestProject/en.lproj/InfoPlist.strings +1 -0
- data/spec/fixtures/project.git/TestProject/main.m +18 -0
- data/spec/fixtures/project.git/TestProject.xcodeproj/project.pbxproj +1020 -0
- data/spec/fixtures/project.git/TestProject.xcodeproj/project.xcworkspace/contents.xcworkspacedata +7 -0
- data/spec/fixtures/project.git/TestProject.xcodeproj/project.xcworkspace/xcuserdata/blake.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
- data/spec/fixtures/project.git/TestProject.xcodeproj/xcuserdata/blake.xcuserdatad/xcschemes/TestProject.xcscheme +96 -0
- data/spec/fixtures/project.git/TestProject.xcodeproj/xcuserdata/blake.xcuserdatad/xcschemes/xcschememanagement.plist +27 -0
- data/spec/fixtures/project.git/TestProject.xcworkspace/contents.xcworkspacedata +1 -0
- data/spec/fixtures/project.git/TestProjectTests/TestProjectTests-Info.plist +22 -0
- data/spec/fixtures/project.git/TestProjectTests/TestProjectTests.m +34 -0
- data/spec/fixtures/project.git/TestProjectTests/en.lproj/InfoPlist.strings +1 -0
- data/spec/fixtures/project.git/VERSION +1 -0
- data/spec/fixtures/project.git/config +7 -0
- data/spec/fixtures/project.git/description +1 -0
- data/spec/fixtures/project.git/index +0 -0
- data/spec/fixtures/project.git/info/exclude +6 -0
- data/spec/fixtures/project.git/logs/HEAD +1 -0
- data/spec/fixtures/project.git/logs/refs/heads/master +1 -0
- data/spec/fixtures/project.git/objects/00/a6b3f80ebbe4019f03461416061e8805e6eab1 +0 -0
- data/spec/fixtures/project.git/objects/03/c303d5552f29d366d11a13448c3c18e94c3bfa +0 -0
- data/spec/fixtures/project.git/objects/03/ff7c3a95a196ac8ad1d53db2bd4fb4c80507c1 +0 -0
- data/spec/fixtures/project.git/objects/0a/7123364a174ffda52d29a18cdd31fd325bbd6c +0 -0
- data/spec/fixtures/project.git/objects/0d/183cba8b0a5e477ea1d001130c222af19b8324 +0 -0
- data/spec/fixtures/project.git/objects/0e/6ba5232c3c2f8a7e435794e845b5dc9f339d8b +0 -0
- data/spec/fixtures/project.git/objects/25/5b4ee687ed1337cffb10e6d07bb89ee6e5d180 +0 -0
- data/spec/fixtures/project.git/objects/25/60a2b9ab9323ca61a0fdebd3b4af46dbe4c272 +0 -0
- data/spec/fixtures/project.git/objects/2b/f8bd93d56787a7548c7f8960a94f05c269b486 +0 -0
- data/spec/fixtures/project.git/objects/38/439105a884d2556443c7b5c645034e67fb7987 +0 -0
- data/spec/fixtures/project.git/objects/3e/efcb9dd5b38e2c1dc061052455dd97bcd51e6c +0 -0
- data/spec/fixtures/project.git/objects/53/8b3019ab68814604fbc8e017d09b690c22728c +0 -0
- data/spec/fixtures/project.git/objects/59/c178850684e21fafbebedeff15b2b522402af2 +0 -0
- data/spec/fixtures/project.git/objects/62/037867910d9aa803d7e02addc26574e270d3d8 +0 -0
- data/spec/fixtures/project.git/objects/66/05c1af131470a3b635d166f2591917b32f3b82 +0 -0
- data/spec/fixtures/project.git/objects/69/67e396037a52d8300eb9dc8a1e9f7155dd55bf +0 -0
- data/spec/fixtures/project.git/objects/6b/5ad4043aee9bc0936466760665f870d4f2f40f +0 -0
- data/spec/fixtures/project.git/objects/6c/fc746d4ecf2e3ac67bb0cf6c4013e1aff9b1f1 +0 -0
- data/spec/fixtures/project.git/objects/6f/3b0ab36651ca648408c176f81e4b2e202efa0b +0 -0
- data/spec/fixtures/project.git/objects/74/3435c9bee5c433fe166891e698fdc70d81a3de +0 -0
- data/spec/fixtures/project.git/objects/96/81bfb8ec019f74df384cfb66d68e94bd6d9005 +0 -0
- data/spec/fixtures/project.git/objects/99/fa9259e929fe3bee4791ff2a63070fc0358c0a +3 -0
- data/spec/fixtures/project.git/objects/a1/5f8980cfbf126a9a0b3ddf7fb1c3fbd6480934 +2 -0
- data/spec/fixtures/project.git/objects/a3/96706db4ec4cfca4d984d38b90dc8098bded40 +1 -0
- data/spec/fixtures/project.git/objects/b4/42134ccda2b0b1813288e7e04a401a4bef2b59 +0 -0
- data/spec/fixtures/project.git/objects/b9/2732c79e00cf2fad5ceceb61bbc7a9a9739d2c +0 -0
- data/spec/fixtures/project.git/objects/ba/01f5352549018dfdb95423b9e0974443ec0346 +1 -0
- data/spec/fixtures/project.git/objects/ba/8dd7d2162334426facd310f62ed923eb6f4cf5 +0 -0
- data/spec/fixtures/project.git/objects/bf/422763a0101a5971e15d53581acb825b4d38b8 +0 -0
- data/spec/fixtures/project.git/objects/c7/9ebd3ada1309bae694b8e6760592b1254e035c +2 -0
- data/spec/fixtures/project.git/objects/ca/7ced48ee61e517fc57576a33dc9d95f5d4f539 +2 -0
- data/spec/fixtures/project.git/objects/ce/eed5f059b6d374d08e0b1e732463842b3a5a91 +0 -0
- data/spec/fixtures/project.git/objects/d7/89fd591fee7d26c2f40c6614b5a91931377f88 +0 -0
- data/spec/fixtures/project.git/objects/d8/ec4dbb2804f53fd863cd0adb830c5bf4e85a1d +0 -0
- data/spec/fixtures/project.git/objects/dc/680e07f12748657d5a798495f08ce3ad884f0b +0 -0
- data/spec/fixtures/project.git/objects/de/de871ad5691708aca809557a823082a70dde69 +0 -0
- data/spec/fixtures/project.git/objects/e0/30730e56be52e4dc293c829f73e0c586073ad2 +0 -0
- data/spec/fixtures/project.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
- data/spec/fixtures/project.git/objects/e6/f7f8a92eb3177d10a809b96f41905e9be4cc2b +0 -0
- data/spec/fixtures/project.git/objects/ed/7115c4ae4c1885ee75f6ffe946b559546efd28 +0 -0
- data/spec/fixtures/project.git/objects/f1/e01dd1256054d5717ef0c89008f0a22639e273 +2 -0
- data/spec/fixtures/project.git/objects/f9/3e9c03a56aba331bcd98cb2ef00ba0003de285 +0 -0
- data/spec/fixtures/project.git/refs/heads/master +1 -0
- data/spec/fixtures/search.json +14159 -0
- data/spec/fixtures/search_results_1-50.html +1076 -0
- data/spec/fixtures/search_results_101-110.html +476 -0
- data/spec/fixtures/search_results_51-100.html +1076 -0
- data/spec/fixtures/translation_details.html +728 -0
- data/spec/fixtures/translation_details.json +738 -0
- data/spec/spec_helper.rb +28 -0
- data/spec/strings_file_spec.rb +225 -0
- data/spec/translation_spec.rb +21 -0
- data/spec/translation_tool_spec.rb +146 -0
- data/trip_advisor.gemspec +38 -0
- metadata +474 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 37b68982a31da5d78d1dada2e1cbeea00866d469
|
4
|
+
data.tar.gz: c4f085998646ab79ab6bee99bbea4a8aba0463b4
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 2a1ed3a13ab73984766aaf58df02f2922adddc3b8bc15f1e75db442e9bff0ac3ccc4a4a66e0dd24b8b3acb86826e2ab261391816dc20251d8678da6b76215eab
|
7
|
+
data.tar.gz: a574629b28a8d3dc9844c250c1eb8db074f2972604438f1444bf8e3867d2f5e67cf0d52452ee165cf039eb8084b772e4ecf276b19d0c176a5a90fde25cf722fe
|
data/.document
ADDED
data/.gitignore
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# rcov generated
|
2
|
+
coverage
|
3
|
+
coverage.data
|
4
|
+
|
5
|
+
# rdoc generated
|
6
|
+
rdoc
|
7
|
+
|
8
|
+
# yard generated
|
9
|
+
doc
|
10
|
+
.yardoc
|
11
|
+
|
12
|
+
# bundler
|
13
|
+
.bundle
|
14
|
+
|
15
|
+
# jeweler generated
|
16
|
+
pkg
|
17
|
+
|
18
|
+
# Have editor/IDE/OS specific files you need to ignore? Consider using a global gitignore:
|
19
|
+
#
|
20
|
+
# * Create a file at ~/.gitignore
|
21
|
+
# * Include files you want ignored
|
22
|
+
# * Run: git config --global core.excludesfile ~/.gitignore
|
23
|
+
#
|
24
|
+
# After doing this, these files will be ignored in all your git projects,
|
25
|
+
# saving you from having to 'pollute' every project you touch with them
|
26
|
+
#
|
27
|
+
# Not sure what to needs to be ignored for particular editors/OSes? Here's some ideas to get you started. (Remember, remove the leading # of the line)
|
28
|
+
#
|
29
|
+
# For MacOS:
|
30
|
+
#
|
31
|
+
#.DS_Store
|
32
|
+
|
33
|
+
# For TextMate
|
34
|
+
#*.tmproj
|
35
|
+
#tmtags
|
36
|
+
|
37
|
+
# For emacs:
|
38
|
+
#*~
|
39
|
+
#\#*
|
40
|
+
#.\#*
|
41
|
+
|
42
|
+
# For vim:
|
43
|
+
#*.swp
|
44
|
+
|
45
|
+
# For redcar:
|
46
|
+
#.redcar
|
47
|
+
|
48
|
+
# For rubinius:
|
49
|
+
#*.rbc
|
50
|
+
|
51
|
+
# /bin
|
52
|
+
bin
|
data/.rspec
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
--color
|
data/.ruby-version
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
2.0.0-p598
|
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Gemfile.lock
ADDED
@@ -0,0 +1,118 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
trip_advisor (0.0.15)
|
5
|
+
addressable (~> 2.3.5)
|
6
|
+
cocoapods (~> 0.34.2)
|
7
|
+
highline (~> 1.6.19)
|
8
|
+
nokogiri (~> 1.6.0)
|
9
|
+
oj (~> 2.1.6)
|
10
|
+
rest-client (~> 1.6.7)
|
11
|
+
rugged (~> 0.19.0)
|
12
|
+
twine (~> 0.4.0)
|
13
|
+
xcpretty (~> 0.1.7)
|
14
|
+
|
15
|
+
GEM
|
16
|
+
remote: https://rubygems.org/
|
17
|
+
specs:
|
18
|
+
activesupport (3.2.21)
|
19
|
+
i18n (~> 0.6, >= 0.6.4)
|
20
|
+
multi_json (~> 1.0)
|
21
|
+
addressable (2.3.6)
|
22
|
+
claide (0.7.0)
|
23
|
+
cocoapods (0.34.4)
|
24
|
+
activesupport (>= 3.2.15, < 4)
|
25
|
+
claide (~> 0.7.0)
|
26
|
+
cocoapods-core (= 0.34.4)
|
27
|
+
cocoapods-downloader (~> 0.7.2)
|
28
|
+
cocoapods-plugins (~> 0.3.1)
|
29
|
+
cocoapods-trunk (~> 0.3.1)
|
30
|
+
cocoapods-try (~> 0.4.1)
|
31
|
+
colored (~> 1.2)
|
32
|
+
escape (~> 0.0.4)
|
33
|
+
json_pure (~> 1.8)
|
34
|
+
nap (~> 0.8)
|
35
|
+
open4 (~> 1.3)
|
36
|
+
xcodeproj (~> 0.19.4)
|
37
|
+
cocoapods-core (0.34.4)
|
38
|
+
activesupport (>= 3.2.15)
|
39
|
+
fuzzy_match (~> 2.0.4)
|
40
|
+
json_pure (~> 1.8)
|
41
|
+
nap (~> 0.8.0)
|
42
|
+
cocoapods-downloader (0.7.2)
|
43
|
+
cocoapods-plugins (0.3.2)
|
44
|
+
nap
|
45
|
+
cocoapods-trunk (0.3.1)
|
46
|
+
json_pure (~> 1.8)
|
47
|
+
nap (>= 0.8)
|
48
|
+
netrc (= 0.7.8)
|
49
|
+
cocoapods-try (0.4.3)
|
50
|
+
colored (1.2)
|
51
|
+
crack (0.4.2)
|
52
|
+
safe_yaml (~> 1.0.0)
|
53
|
+
diff-lcs (1.2.5)
|
54
|
+
escape (0.0.4)
|
55
|
+
excon (0.26.0)
|
56
|
+
fuzzy_match (2.0.4)
|
57
|
+
highline (1.6.21)
|
58
|
+
i18n (0.7.0)
|
59
|
+
json (1.8.2)
|
60
|
+
json_pure (1.8.2)
|
61
|
+
mime-types (1.25.1)
|
62
|
+
mini_portile (0.6.2)
|
63
|
+
multi_json (1.10.1)
|
64
|
+
nap (0.8.0)
|
65
|
+
netrc (0.7.8)
|
66
|
+
nokogiri (1.6.6.2)
|
67
|
+
mini_portile (~> 0.6.0)
|
68
|
+
oj (2.1.7)
|
69
|
+
open4 (1.3.4)
|
70
|
+
rake (10.4.2)
|
71
|
+
rdoc (4.2.0)
|
72
|
+
json (~> 1.4)
|
73
|
+
rest-client (1.6.8)
|
74
|
+
mime-types (~> 1.16)
|
75
|
+
rdoc (>= 2.4.2)
|
76
|
+
rspec (2.14.1)
|
77
|
+
rspec-core (~> 2.14.0)
|
78
|
+
rspec-expectations (~> 2.14.0)
|
79
|
+
rspec-mocks (~> 2.14.0)
|
80
|
+
rspec-core (2.14.8)
|
81
|
+
rspec-expectations (2.14.5)
|
82
|
+
diff-lcs (>= 1.1.3, < 2.0)
|
83
|
+
rspec-mocks (2.14.6)
|
84
|
+
ruby_parser (3.6.3)
|
85
|
+
sexp_processor (~> 4.1)
|
86
|
+
rubyzip (0.9.9)
|
87
|
+
rugged (0.19.0)
|
88
|
+
safe_yaml (1.0.4)
|
89
|
+
sexp_processor (4.4.4)
|
90
|
+
simplecov (0.7.1)
|
91
|
+
multi_json (~> 1.0)
|
92
|
+
simplecov-html (~> 0.7.1)
|
93
|
+
simplecov-html (0.7.1)
|
94
|
+
tomdoc (0.2.5)
|
95
|
+
colored
|
96
|
+
ruby_parser (>= 2.0.4)
|
97
|
+
twine (0.4.0)
|
98
|
+
rubyzip (~> 0.9.5)
|
99
|
+
webmock (1.13.0)
|
100
|
+
addressable (>= 2.2.7)
|
101
|
+
crack (>= 0.3.2)
|
102
|
+
xcodeproj (0.19.4)
|
103
|
+
activesupport (~> 3.0)
|
104
|
+
colored (~> 1.2)
|
105
|
+
xcpretty (0.1.10)
|
106
|
+
|
107
|
+
PLATFORMS
|
108
|
+
ruby
|
109
|
+
|
110
|
+
DEPENDENCIES
|
111
|
+
bundler (~> 1.7)
|
112
|
+
excon (~> 0.26.0)
|
113
|
+
rake
|
114
|
+
rspec (~> 2.14.0)
|
115
|
+
simplecov (~> 0.7.1)
|
116
|
+
tomdoc (~> 0.2.5)
|
117
|
+
trip_advisor!
|
118
|
+
webmock (~> 1.13.0)
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2013 Blake Watters
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
Trip Advisor
|
2
|
+
============
|
3
|
+
|
4
|
+
[![Build Status](https://magnum.travis-ci.com/GateGuru/trip_advisor.png?token=SBJXqCxG7QrbzehxzzMq&branch=master)](https://magnum.travis-ci.com/GateGuru/trip_advisor)
|
5
|
+
|
6
|
+
This gem provides a simple, well tested interface to a number of TripAdvisor internal API's that are useful when
|
7
|
+
developing application.
|
8
|
+
|
9
|
+
## Features
|
10
|
+
|
11
|
+
* Provides access to the TripAdvisor Translation Tool
|
12
|
+
|
13
|
+
## Credits
|
14
|
+
|
15
|
+
Blake Watters
|
16
|
+
|
17
|
+
- http://github.com/blakewatters
|
18
|
+
- http://twitter.com/blakewatters
|
19
|
+
- bwatters@tripadvisor.com
|
20
|
+
|
21
|
+
## License
|
22
|
+
|
23
|
+
The TripAdvisor Gem is proprietary software copyright (c) TripAdvisor 2013. All rights reserved.
|
data/Rakefile
ADDED
@@ -0,0 +1,45 @@
|
|
1
|
+
module TripAdvisor
|
2
|
+
class API
|
3
|
+
attr_accessor :base_url, :api_key
|
4
|
+
attr_writer :verbose
|
5
|
+
|
6
|
+
def initialize(options={})
|
7
|
+
require 'rest-client'
|
8
|
+
require 'addressable/uri'
|
9
|
+
require 'oj'
|
10
|
+
|
11
|
+
self.api_key = options[:api_key]
|
12
|
+
self.base_url = options[:base_url] || ENV['TRIPADVISOR_API_BASE_URL'] || 'https://www.tripadvisor.com/api/internal/1.0/'
|
13
|
+
raise "API Key cannot be nil" unless api_key
|
14
|
+
end
|
15
|
+
|
16
|
+
def base_url=(base_url)
|
17
|
+
@base_url = base_url.is_a?(String) ? Addressable::URI.parse(base_url) : base_url
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_locales
|
21
|
+
response = get(:locales)
|
22
|
+
Oj.load(response)['data']
|
23
|
+
end
|
24
|
+
|
25
|
+
def get_flights_locales
|
26
|
+
get_locales.select { |locale| locale['is_mobile_flights_enabled'] == 'true' }
|
27
|
+
end
|
28
|
+
|
29
|
+
def verbose?
|
30
|
+
@verbose
|
31
|
+
end
|
32
|
+
|
33
|
+
def get(method, params = {})
|
34
|
+
query_string = "?%s" % Addressable::URI.form_encode(params.merge('key' => api_key))
|
35
|
+
url = Addressable::URI.join(base_url, method.to_s, query_string)
|
36
|
+
puts_verbose("GET URL '#{url}'")
|
37
|
+
RestClient.get(url.to_s)
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
def puts_verbose(string)
|
42
|
+
puts(string) if verbose?
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,221 @@
|
|
1
|
+
require 'rugged'
|
2
|
+
require 'oj'
|
3
|
+
require 'time'
|
4
|
+
|
5
|
+
module TripAdvisor
|
6
|
+
class BuildInfo
|
7
|
+
attr_accessor :version, :branch, :sha1, :author
|
8
|
+
attr_reader :date
|
9
|
+
|
10
|
+
def initialize(repo)
|
11
|
+
@date = Time.now
|
12
|
+
@branch = repo.branches.detect { |b| b.canonical_name == repo.head.name }.name
|
13
|
+
name = repo.config['user.name']
|
14
|
+
email = repo.config['user.email']
|
15
|
+
@author = "#{name} <#{email}>"
|
16
|
+
@sha1 = repo.head.target
|
17
|
+
end
|
18
|
+
|
19
|
+
def timestamp
|
20
|
+
date.utc.strftime("%Y%m%d%H%M%S")
|
21
|
+
end
|
22
|
+
|
23
|
+
def to_hash
|
24
|
+
Hash.new.tap do |info|
|
25
|
+
info['version'] = self.version
|
26
|
+
info['branch'] = self.branch
|
27
|
+
info['sha1'] = self.sha1
|
28
|
+
info['author'] = self.author
|
29
|
+
info['date'] = self.date.utc.iso8601
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
class NullReporter
|
35
|
+
def say(message)
|
36
|
+
nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
class ConsoleReporter
|
41
|
+
def say(message)
|
42
|
+
puts message
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class AbstractBuild
|
47
|
+
attr_reader :path, :repo, :info
|
48
|
+
attr_accessor :pod_repo, :reporter, :version_prefix, :remotes
|
49
|
+
|
50
|
+
def initialize(path)
|
51
|
+
@path = path
|
52
|
+
@repo = Rugged::Repository.new(path)
|
53
|
+
@info = BuildInfo.new(repo)
|
54
|
+
@pod_repo = "tripadvisor"
|
55
|
+
@reporter = ConsoleReporter.new
|
56
|
+
@version_prefix = 'v'
|
57
|
+
end
|
58
|
+
|
59
|
+
def build!
|
60
|
+
raise "Cannot build a TripAdvisor::AbstractBuild: Only concrete subclasses are buildable."
|
61
|
+
end
|
62
|
+
|
63
|
+
def podspec_file
|
64
|
+
@podspec_file ||= Dir.entries(path).detect { |f| f =~ /.podspec$/ }
|
65
|
+
end
|
66
|
+
|
67
|
+
def remotes
|
68
|
+
if @remotes.nil?
|
69
|
+
@remotes = `git remote`.split("\n")
|
70
|
+
raise "Build failed: Non-zero exit status returned while executing `git remote`" unless $?.success?
|
71
|
+
end
|
72
|
+
@remotes
|
73
|
+
end
|
74
|
+
|
75
|
+
def run(command)
|
76
|
+
unless system(command)
|
77
|
+
raise "Build failed: Non-zero exit status returned while executing `#{command}`"
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def pod_update!
|
82
|
+
run("bundle exec pod update")
|
83
|
+
end
|
84
|
+
|
85
|
+
def release_version
|
86
|
+
File.read(File.join(path, 'VERSION')).chomp
|
87
|
+
end
|
88
|
+
|
89
|
+
def author
|
90
|
+
@author ||= { name: repo.config['user.name'], email: repo.config['user.email'], time: Time.now }
|
91
|
+
end
|
92
|
+
|
93
|
+
def update_build_assets
|
94
|
+
info.version = version
|
95
|
+
File.open('BUILD.json', 'w') { |f| f << Oj.dump(info.to_hash) }
|
96
|
+
podspec_content = File.read(podspec_file)
|
97
|
+
unless podspec_content.gsub!(/(\.version\s+=\s+)['"](.+)['"]$/, "\\1'#{version}'")
|
98
|
+
raise "Unable to update version of Podspec: version attribute not matched."
|
99
|
+
end
|
100
|
+
unless podspec_content.gsub!(/(\:tag\s+=>\s+)['"](.+)['"]/, "\\1'#{tag_name}'")
|
101
|
+
raise "Unable to update version of Podspec: version attribute not matched."
|
102
|
+
end
|
103
|
+
File.open(podspec_file, 'w') { |f| f << podspec_content }
|
104
|
+
end
|
105
|
+
|
106
|
+
def commit!(files)
|
107
|
+
say "Committing to #{path}"
|
108
|
+
index = repo.index
|
109
|
+
files.each { |f| index.add f }
|
110
|
+
|
111
|
+
options = {}
|
112
|
+
options[:tree] = index.write_tree(repo)
|
113
|
+
|
114
|
+
options[:author] = author
|
115
|
+
options[:committer] = author
|
116
|
+
options[:message] = "Creating build #{version}"
|
117
|
+
options[:parents] = [ repo.head.target ]
|
118
|
+
options[:update_ref] = 'HEAD'
|
119
|
+
|
120
|
+
Rugged::Commit.create(repo, options)
|
121
|
+
end
|
122
|
+
|
123
|
+
def tag!(target)
|
124
|
+
Rugged::Tag.create(repo,
|
125
|
+
:name => tag_name,
|
126
|
+
:message => "Tagging build #{version}",
|
127
|
+
:target => target,
|
128
|
+
:tagger => author)
|
129
|
+
end
|
130
|
+
|
131
|
+
def push!
|
132
|
+
branch = info.branch
|
133
|
+
remotes.each do |remote_name|
|
134
|
+
say "Pushing to remote '#{remote_name}'"
|
135
|
+
# NOTE: Rugged apparently cannot push to the repositories we need
|
136
|
+
# remote = Rugged::Remote.lookup(@repo, remote_name)
|
137
|
+
# remote.push ["refs/heads/#{info.branch}", "refs/tags/#{tag_name}"]
|
138
|
+
run("git push #{remote_name} #{branch}:#{branch} --tags")
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def push_podspec!
|
143
|
+
run("bundle exec pod repo push #{pod_repo} #{podspec_file}")
|
144
|
+
end
|
145
|
+
|
146
|
+
def update_staging_area(files)
|
147
|
+
run("git add #{files.join(' ')}")
|
148
|
+
end
|
149
|
+
|
150
|
+
protected
|
151
|
+
def say(message)
|
152
|
+
reporter.say(message)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
class AdHocBuild < AbstractBuild
|
157
|
+
def build!
|
158
|
+
say "Creating AdHoc build at path: #{path}"
|
159
|
+
Dir.chdir(path) do
|
160
|
+
update_build_assets
|
161
|
+
pod_update!
|
162
|
+
files = [podspec_file, 'BUILD.json', 'Podfile.lock']
|
163
|
+
target = commit!(files)
|
164
|
+
say "Committed updates to #{files.join(', ')} (ref: #{target})"
|
165
|
+
tag!(target)
|
166
|
+
say "Tagged build as #{tag_name}"
|
167
|
+
push!
|
168
|
+
say "Pushed to #{remotes.join(', ')}"
|
169
|
+
push_podspec!
|
170
|
+
say "Pushed podspec to spec repository '#{pod_repo}'"
|
171
|
+
update_staging_area(files)
|
172
|
+
end
|
173
|
+
say "Build complete."
|
174
|
+
end
|
175
|
+
|
176
|
+
def version
|
177
|
+
@version ||= "#{release_version}-b#{info.timestamp}"
|
178
|
+
end
|
179
|
+
|
180
|
+
def tag_name
|
181
|
+
"builds/#{version_prefix}#{version}"
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
class ReleaseBuild < AbstractBuild
|
186
|
+
attr_accessor :release_version
|
187
|
+
|
188
|
+
def initialize(path, release_version)
|
189
|
+
super(path)
|
190
|
+
@release_version = release_version
|
191
|
+
File.write(File.join(path, 'VERSION'), "#{release_version}")
|
192
|
+
end
|
193
|
+
|
194
|
+
def build!
|
195
|
+
say "Creating Release build at path: #{path}"
|
196
|
+
Dir.chdir(path) do
|
197
|
+
update_build_assets
|
198
|
+
pod_update!
|
199
|
+
files = [podspec_file, 'BUILD.json', 'Podfile.lock', 'VERSION']
|
200
|
+
target = commit!(files)
|
201
|
+
say "Committed updates to #{files.join(', ')} (ref: #{target})"
|
202
|
+
tag!(target)
|
203
|
+
say "Tagged build as #{tag_name}"
|
204
|
+
push!
|
205
|
+
say "Pushed to #{remotes.join(', ')}"
|
206
|
+
push_podspec!
|
207
|
+
say "Pushed podspec to spec repository '#{pod_repo}'"
|
208
|
+
update_staging_area(files)
|
209
|
+
end
|
210
|
+
say "Build complete."
|
211
|
+
end
|
212
|
+
|
213
|
+
def version
|
214
|
+
@version ||= "#{release_version}"
|
215
|
+
end
|
216
|
+
|
217
|
+
def tag_name
|
218
|
+
"#{version_prefix}#{version}"
|
219
|
+
end
|
220
|
+
end
|
221
|
+
end
|