airenv 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +17 -0
- data/.rspec +2 -0
- data/.travis.yml +3 -0
- data/Gemfile +4 -0
- data/Guardfile +24 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +6 -0
- data/airenv.gemspec +36 -0
- data/bin/airenv +8 -0
- data/lib/airenv.rb +10 -0
- data/lib/airenv/cli.rb +19 -0
- data/lib/airenv/commands.rb +4 -0
- data/lib/airenv/commands/fetch.thor +16 -0
- data/lib/airenv/commands/init.thor +31 -0
- data/lib/airenv/commands/install.thor +15 -0
- data/lib/airenv/commands/list.thor +19 -0
- data/lib/airenv/commands/use.thor +21 -0
- data/lib/airenv/configuration.rb +44 -0
- data/lib/airenv/downloader.rb +48 -0
- data/lib/airenv/sdk.rb +117 -0
- data/lib/airenv/sdk_description.rb +77 -0
- data/lib/airenv/version.rb +3 -0
- data/spec/airenv/downloader_spec.rb +5 -0
- data/spec/airenv/sdk_description_spec.rb +180 -0
- data/spec/airenv/sdk_spec.rb +60 -0
- data/spec/airenv_spec.rb +7 -0
- data/spec/spec_helper.rb +2 -0
- metadata +277 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: b2f8733f5c5f755b5132359959e60e2a678a29d0
|
4
|
+
data.tar.gz: 873c868df8753881884f328b0fd21f01e7fe10bf
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: ac28e50aa1c2e0a678f47208446d98960dac8d6d27b180901cd8f7cdf69625cdc2c335b360b7d4ec5e951be78ba715d615d888d2a96f9ace1e9b2dd688ab5b4b
|
7
|
+
data.tar.gz: 7a805da497cc99b090a8db106bc676e064357fc01c59a2210333be8ecaea5277464c5019e77bd617e4ae70d0a8f28c84ea41b1c8750a2bbf9be0564cd22ae880
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# A sample Guardfile
|
2
|
+
# More info at https://github.com/guard/guard#readme
|
3
|
+
|
4
|
+
guard :rspec do
|
5
|
+
watch(%r{^spec/.+_spec\.rb$})
|
6
|
+
watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
|
7
|
+
watch('spec/spec_helper.rb') { "spec" }
|
8
|
+
|
9
|
+
# Rails example
|
10
|
+
watch(%r{^app/(.+)\.rb$}) { |m| "spec/#{m[1]}_spec.rb" }
|
11
|
+
watch(%r{^app/(.*)(\.erb|\.haml|\.slim)$}) { |m| "spec/#{m[1]}#{m[2]}_spec.rb" }
|
12
|
+
watch(%r{^app/controllers/(.+)_(controller)\.rb$}) { |m| ["spec/routing/#{m[1]}_routing_spec.rb", "spec/#{m[2]}s/#{m[1]}_#{m[2]}_spec.rb", "spec/acceptance/#{m[1]}_spec.rb"] }
|
13
|
+
watch(%r{^spec/support/(.+)\.rb$}) { "spec" }
|
14
|
+
watch('config/routes.rb') { "spec/routing" }
|
15
|
+
watch('app/controllers/application_controller.rb') { "spec/controllers" }
|
16
|
+
|
17
|
+
# Capybara features specs
|
18
|
+
watch(%r{^app/views/(.+)/.*\.(erb|haml|slim)$}) { |m| "spec/features/#{m[1]}_spec.rb" }
|
19
|
+
|
20
|
+
# Turnip features and steps
|
21
|
+
watch(%r{^spec/acceptance/(.+)\.feature$})
|
22
|
+
watch(%r{^spec/acceptance/steps/(.+)_steps\.rb$}) { |m| Dir[File.join("**/#{m[1]}.feature")][0] || 'spec/acceptance' }
|
23
|
+
end
|
24
|
+
|
data/LICENSE.txt
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
Copyright (c) 2014 Toshiyuki Hirooka
|
2
|
+
|
3
|
+
MIT License
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
# Airenv
|
2
|
+
|
3
|
+
Automatically download, archive, switch airsdk for flash builder on mac.
|
4
|
+
|
5
|
+
## Installation
|
6
|
+
|
7
|
+
Add this line to your application's Gemfile:
|
8
|
+
|
9
|
+
gem 'airenv'
|
10
|
+
|
11
|
+
And then execute:
|
12
|
+
|
13
|
+
$ bundle
|
14
|
+
|
15
|
+
Or install it yourself as:
|
16
|
+
|
17
|
+
$ gem install airenv
|
18
|
+
|
19
|
+
## Usage
|
20
|
+
|
21
|
+
TODO: Write usage instructions here
|
22
|
+
|
23
|
+
## Contributing
|
24
|
+
|
25
|
+
1. Fork it
|
26
|
+
2. Create your feature branch (`git checkout -b my-new-feature`)
|
27
|
+
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
|
+
4. Push to the branch (`git push origin my-new-feature`)
|
29
|
+
5. Create new Pull Request
|
data/Rakefile
ADDED
data/airenv.gemspec
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'airenv/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |spec|
|
7
|
+
spec.name = "airenv"
|
8
|
+
spec.version = Airenv::VERSION
|
9
|
+
spec.authors = ["Toshiyuki Hirooka", "Hidenori Doi"]
|
10
|
+
spec.email = ["toshi.hirooka@gmail.com", "mewlist@mewlist.com"]
|
11
|
+
spec.description = %q{Automatically download, archive, switch AIR SDK for flash builder on mac.}
|
12
|
+
spec.summary = %q{Adobe AIR SDK package manager}
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.license = "MIT"
|
15
|
+
|
16
|
+
spec.files = `git ls-files`.split($/)
|
17
|
+
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
18
|
+
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
19
|
+
spec.require_paths = ["lib"]
|
20
|
+
|
21
|
+
spec.add_dependency "thor"
|
22
|
+
spec.add_dependency "active_support"
|
23
|
+
spec.add_dependency "i18n"
|
24
|
+
spec.add_dependency "progressbar"
|
25
|
+
spec.add_dependency "configuration"
|
26
|
+
spec.add_dependency "rubyzip"
|
27
|
+
spec.add_dependency "archive-tar-minitar"
|
28
|
+
spec.add_dependency "bzip2-ruby-rb20"
|
29
|
+
|
30
|
+
spec.add_development_dependency "bundler", "~> 1.3"
|
31
|
+
spec.add_development_dependency "rake"
|
32
|
+
spec.add_development_dependency "rspec"
|
33
|
+
spec.add_development_dependency "guard"
|
34
|
+
spec.add_development_dependency "guard-rspec"
|
35
|
+
spec.add_development_dependency "pry"
|
36
|
+
end
|
data/bin/airenv
ADDED
data/lib/airenv.rb
ADDED
data/lib/airenv/cli.rb
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'thor'
|
2
|
+
require 'active_support/inflector'
|
3
|
+
|
4
|
+
class Airenv::CLI < Thor
|
5
|
+
|
6
|
+
desc 'version', 'Prints Airenv version'
|
7
|
+
def version
|
8
|
+
puts "Airenv #{Airenv::VERSION}"
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.load_thorfiles(dir)
|
12
|
+
thor_files = Dir.glob('**/*.thor').delete_if { |x| not File.file?(x) }
|
13
|
+
thor_files.each do |f|
|
14
|
+
load f
|
15
|
+
include f.to_s.gsub('lib/', '').gsub('.thor', '').camelize.constantize
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module Airenv
|
2
|
+
module Commands
|
3
|
+
module Fetch
|
4
|
+
def self.included(thor)
|
5
|
+
thor.class_eval do
|
6
|
+
desc 'fetch', 'Fetches a AIR SDK of specified version'
|
7
|
+
def fetch(version_id)
|
8
|
+
sdk = Airenv::Sdk.new version_id
|
9
|
+
sdk.fetch
|
10
|
+
puts "#{sdk.description.name} fetched."
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require 'shellwords'
|
2
|
+
|
3
|
+
module Airenv
|
4
|
+
module Commands
|
5
|
+
module Init
|
6
|
+
def self.included(thor)
|
7
|
+
thor.class_eval do
|
8
|
+
desc 'init', 'Initialize Airenv for first use'
|
9
|
+
def init
|
10
|
+
puts "To attempt to remove Flash Builder system directory then making a symbolic link instead of the directory."
|
11
|
+
puts " REMOVES: #{Settings.flash_builder_airsdk_path}"
|
12
|
+
puts " SYMLINK: #{Settings.flash_builder_airsdk_path} -> #{Settings.current_sdk_symlink_path}"
|
13
|
+
puts "Do you permit to do it? [yN]"
|
14
|
+
answer = STDIN.gets.chomp
|
15
|
+
if ['y', 'Y'].include? answer
|
16
|
+
if File.symlink?(Settings.flash_builder_airsdk_path)
|
17
|
+
File.delete(Settings.flash_builder_airsdk_path)
|
18
|
+
else
|
19
|
+
File.rename(Settings.flash_builder_airsdk_path, "#{Settings.flash_builder_airsdk_path}_bak")
|
20
|
+
end
|
21
|
+
File.symlink(Settings.current_sdk_symlink_path, Settings.flash_builder_airsdk_path)
|
22
|
+
puts "Airenv is initialized for your environment."
|
23
|
+
else
|
24
|
+
puts "All are cancelled. Did nothing."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module Airenv
|
2
|
+
module Commands
|
3
|
+
module Install
|
4
|
+
def self.included(thor)
|
5
|
+
thor.class_eval do
|
6
|
+
desc 'install', 'Fetch and use a AIR SDK of specified version'
|
7
|
+
def install(version_id)
|
8
|
+
fetch version_id
|
9
|
+
use version_id
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
|
3
|
+
module Airenv
|
4
|
+
module Commands
|
5
|
+
module List
|
6
|
+
def self.included(thor)
|
7
|
+
thor.class_eval do
|
8
|
+
desc 'list', 'List fetched SDKs up'
|
9
|
+
def list
|
10
|
+
Airenv::SdkDescription.installed_versions.each do |version_id|
|
11
|
+
sdk = Airenv::Sdk.new(version_id)
|
12
|
+
puts "#{sdk.description.version} (#{sdk.simple_version})"
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
module Airenv
|
2
|
+
module Commands
|
3
|
+
module Use
|
4
|
+
def self.included(thor)
|
5
|
+
thor.class_eval do
|
6
|
+
desc 'use', 'Change current to ready to use a AIR SDK of specified version'
|
7
|
+
def use(version_id)
|
8
|
+
if Airenv::SdkDescription.usable?(version_id)
|
9
|
+
normalized_version_id = Airenv::SdkDescription.normalize_version_id(version_id)
|
10
|
+
sdk = Airenv::Sdk.new normalized_version_id
|
11
|
+
sdk.use
|
12
|
+
puts "Switched to #{sdk.description.name}."
|
13
|
+
else
|
14
|
+
puts "The version #{version_id} is not installed on your system. Please use 'install' command to get the version."
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'configuration'
|
2
|
+
|
3
|
+
module Airenv
|
4
|
+
module Configuration
|
5
|
+
def temporary_sdk_file_path(simple_name)
|
6
|
+
File.expand_path("#{temporary_sdk_file_directory}/#{simple_name}.tbz2")
|
7
|
+
end
|
8
|
+
|
9
|
+
def temporary_sdk_file_extracted_directory
|
10
|
+
File.expand_path("#{temporary_sdk_file_directory}/temporary_sdk")
|
11
|
+
end
|
12
|
+
|
13
|
+
def temporary_sdk_file_directory
|
14
|
+
File.expand_path("#{envdir}/tmp/sdks/")
|
15
|
+
end
|
16
|
+
|
17
|
+
def sdks_directory
|
18
|
+
File.expand_path("#{envdir}/sdks/")
|
19
|
+
end
|
20
|
+
|
21
|
+
def current_sdk_symlink_path
|
22
|
+
"#{sdks_directory}/current"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def default_config_string
|
28
|
+
<<EOS
|
29
|
+
Settings = Configuration.for('config') {
|
30
|
+
envdir '~/.airenv'
|
31
|
+
flash_builder_airsdk_path '/Applications/Adobe Flash Builder 4.7/eclipse/plugins/com.adobe.flash.compiler_4.7.0.349722/AIRSDK'
|
32
|
+
}
|
33
|
+
EOS
|
34
|
+
end
|
35
|
+
|
36
|
+
path = File.expand_path '~/.airenvconfig.rb'
|
37
|
+
unless File.exists? path
|
38
|
+
File.open(path, 'w') do |file|
|
39
|
+
file.write(default_config_string)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
Kernel.load(path)
|
44
|
+
Configuration.__send__(:include, Airenv::Configuration)
|
@@ -0,0 +1,48 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
require 'progressbar'
|
3
|
+
require 'net/http'
|
4
|
+
require 'uri'
|
5
|
+
require 'fileutils'
|
6
|
+
|
7
|
+
class Airenv::Downloader
|
8
|
+
|
9
|
+
def initialize(uri, simple_name)
|
10
|
+
@uri = URI.parse(uri)
|
11
|
+
@simple_name = simple_name
|
12
|
+
end
|
13
|
+
|
14
|
+
def start
|
15
|
+
FileUtils.mkdir_p Settings.temporary_sdk_file_directory
|
16
|
+
|
17
|
+
bar = nil
|
18
|
+
|
19
|
+
Net::HTTP.start(@uri.host, @uri.port) do |http|
|
20
|
+
request = Net::HTTP::Get.new(@uri.request_uri)
|
21
|
+
|
22
|
+
http.request(request) do |response|
|
23
|
+
size = response["Content-Length"].to_f
|
24
|
+
bar = ProgressBar.new(@simple_name, size) if bar.blank?
|
25
|
+
|
26
|
+
File.open(temporary_sdk_file_path, "wb") do |file|
|
27
|
+
response.read_body do |data|
|
28
|
+
file.write data
|
29
|
+
bar.set(file.tell)
|
30
|
+
end
|
31
|
+
|
32
|
+
if file.tell == size
|
33
|
+
bar.finish
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def temporary_sdk_file_path
|
41
|
+
Settings.temporary_sdk_file_path(@simple_name)
|
42
|
+
end
|
43
|
+
|
44
|
+
def archive_exists?
|
45
|
+
File.exists?(temporary_sdk_file_path)
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
data/lib/airenv/sdk.rb
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
require 'active_support/core_ext'
|
2
|
+
require 'progressbar'
|
3
|
+
require 'archive/tar/minitar'
|
4
|
+
require 'fileutils'
|
5
|
+
require 'bzip2'
|
6
|
+
require 'shellwords'
|
7
|
+
|
8
|
+
class Airenv::Sdk
|
9
|
+
|
10
|
+
include Comparable
|
11
|
+
|
12
|
+
attr_accessor :description
|
13
|
+
|
14
|
+
def initialize(version_id=nil)
|
15
|
+
self.description = Airenv::SdkDescription.new
|
16
|
+
parse_version_id(version_id) if version_id.present?
|
17
|
+
parse_sdk_description if archive_extracted?
|
18
|
+
end
|
19
|
+
|
20
|
+
def parse_version_id(version_id)
|
21
|
+
self.description.version, build = *version_id.split('-b')
|
22
|
+
self.description.build = build.to_i if build.present?
|
23
|
+
end
|
24
|
+
|
25
|
+
def package_uri
|
26
|
+
"http://airdownload.adobe.com/air/mac/download/#{simple_version}/AIRSDK_Compiler.tbz2"
|
27
|
+
end
|
28
|
+
|
29
|
+
def simple_version
|
30
|
+
description.version.split('.')[0..1].join('.')
|
31
|
+
end
|
32
|
+
|
33
|
+
def package_name
|
34
|
+
"AIRSDK_#{description.id}"
|
35
|
+
end
|
36
|
+
|
37
|
+
def simple_name
|
38
|
+
"AIRSDK_#{simple_version}"
|
39
|
+
end
|
40
|
+
|
41
|
+
def fetch
|
42
|
+
puts "Downloading..."
|
43
|
+
download
|
44
|
+
puts "Archive extracting..."
|
45
|
+
extract_archive
|
46
|
+
parse_sdk_description_from_temporary_sdk
|
47
|
+
move_to_sdks_directory
|
48
|
+
end
|
49
|
+
|
50
|
+
def download
|
51
|
+
downloader = Airenv::Downloader.new(package_uri, simple_name)
|
52
|
+
if downloader.archive_exists?
|
53
|
+
puts "Skipped downloading because the archive exists."
|
54
|
+
else
|
55
|
+
downloader.start
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def extracted_dir
|
60
|
+
"#{Settings.sdks_directory}/#{package_name}"
|
61
|
+
end
|
62
|
+
|
63
|
+
def temporary_extracted_dir
|
64
|
+
"#{Settings.temporary_sdk_file_extracted_directory}"
|
65
|
+
end
|
66
|
+
|
67
|
+
def extract_archive
|
68
|
+
FileUtils.mkdir_p(temporary_extracted_dir)
|
69
|
+
system("tar zxf #{Shellwords.escape(Settings.temporary_sdk_file_path(simple_name))} -C #{temporary_extracted_dir}")
|
70
|
+
end
|
71
|
+
|
72
|
+
def sdk_description_xml_path
|
73
|
+
"#{extracted_dir}/air-sdk-description.xml"
|
74
|
+
end
|
75
|
+
|
76
|
+
def archive_extracted?
|
77
|
+
File.exists?(extracted_dir)
|
78
|
+
end
|
79
|
+
|
80
|
+
def sdk_description_xml
|
81
|
+
File.read("#{sdk_description_xml_path}")
|
82
|
+
end
|
83
|
+
|
84
|
+
def parse_sdk_description
|
85
|
+
self.description.load(sdk_description_xml)
|
86
|
+
end
|
87
|
+
|
88
|
+
def temporary_sdk_description_xml_path
|
89
|
+
"#{temporary_extracted_dir}/air-sdk-description.xml"
|
90
|
+
end
|
91
|
+
|
92
|
+
def temporary_sdk_description_xml
|
93
|
+
File.read("#{temporary_sdk_description_xml_path}")
|
94
|
+
end
|
95
|
+
|
96
|
+
def parse_sdk_description_from_temporary_sdk
|
97
|
+
self.description.load(temporary_sdk_description_xml)
|
98
|
+
end
|
99
|
+
|
100
|
+
def move_to_sdks_directory
|
101
|
+
FileUtils.mkdir_p(Settings.sdks_directory)
|
102
|
+
File.rename(temporary_extracted_dir, extracted_dir)
|
103
|
+
end
|
104
|
+
|
105
|
+
def current_sdk_symlink_exists?
|
106
|
+
File.exists?(Settings.current_sdk_symlink_path)
|
107
|
+
end
|
108
|
+
|
109
|
+
def use
|
110
|
+
File.delete(Settings.current_sdk_symlink_path) if current_sdk_symlink_exists?
|
111
|
+
File.symlink(extracted_dir, Settings.current_sdk_symlink_path)
|
112
|
+
end
|
113
|
+
|
114
|
+
def <=>(other)
|
115
|
+
self.description <=> other.description
|
116
|
+
end
|
117
|
+
end
|
@@ -0,0 +1,77 @@
|
|
1
|
+
require 'rexml/document'
|
2
|
+
require 'digest/md5'
|
3
|
+
|
4
|
+
class Airenv::SdkDescription
|
5
|
+
include Comparable
|
6
|
+
|
7
|
+
attr_accessor :name
|
8
|
+
attr_accessor :version
|
9
|
+
attr_accessor :build
|
10
|
+
|
11
|
+
def initialize(name=nil, version=nil, build=nil)
|
12
|
+
self.name = name
|
13
|
+
self.version = version
|
14
|
+
self.build = build
|
15
|
+
end
|
16
|
+
|
17
|
+
def load(xml)
|
18
|
+
@doc = parse(xml)
|
19
|
+
root = @doc.elements['air-sdk-description']
|
20
|
+
self.name = root.elements['name'].text
|
21
|
+
self.version = root.elements['version'].text
|
22
|
+
self.build = root.elements['build'].text.to_i
|
23
|
+
end
|
24
|
+
|
25
|
+
def parse(xml)
|
26
|
+
REXML::Document.new xml
|
27
|
+
end
|
28
|
+
|
29
|
+
def id
|
30
|
+
"#{version}-b#{build}"
|
31
|
+
end
|
32
|
+
|
33
|
+
def digest
|
34
|
+
Digest::MD5.digest(id)
|
35
|
+
end
|
36
|
+
|
37
|
+
def <=>(other)
|
38
|
+
result = self.version <=> other.version
|
39
|
+
if result == 0
|
40
|
+
self.build <=> other.build
|
41
|
+
else
|
42
|
+
result
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
class << self
|
47
|
+
def normalize_version_id(version_id)
|
48
|
+
if simple_version?(version_id)
|
49
|
+
installed_sdks.select {|sdk|
|
50
|
+
sdk.simple_version == version_id
|
51
|
+
}.sort.last.description.id
|
52
|
+
else
|
53
|
+
version_id
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
def usable?(version_id)
|
58
|
+
installed_sdks.map {|sdk| [sdk.description.id, sdk.simple_version] }.flatten.include? version_id
|
59
|
+
end
|
60
|
+
|
61
|
+
def installed_sdks
|
62
|
+
installed_versions.map {|version| Airenv::Sdk.new(version) }
|
63
|
+
end
|
64
|
+
|
65
|
+
def simple_version?(version_id)
|
66
|
+
not version_id.include?("-b")
|
67
|
+
end
|
68
|
+
|
69
|
+
def installed_versions
|
70
|
+
Dir.glob("#{Settings.sdks_directory}/*").map {|f|
|
71
|
+
Pathname.new(f).basename.to_s
|
72
|
+
}.reject {|basename| basename == 'current' }.map {|basename|
|
73
|
+
basename.to_s.gsub("AIRSDK_", '')
|
74
|
+
}
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
@@ -0,0 +1,180 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Airenv::SdkDescription do
|
4
|
+
subject { Airenv::SdkDescription.new }
|
5
|
+
describe 'properties' do
|
6
|
+
before do
|
7
|
+
subject.name = "AIR 1.2.3"
|
8
|
+
subject.version = "1.2.3"
|
9
|
+
subject.build = 1234
|
10
|
+
end
|
11
|
+
|
12
|
+
its(:name) { should be_an_instance_of(String) }
|
13
|
+
its(:version) { should be_an_instance_of(String) }
|
14
|
+
its(:build) { should be_an_instance_of(Fixnum) }
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#load' do
|
18
|
+
let(:xml) do
|
19
|
+
<<-EOS
|
20
|
+
<?xml version="1.0"?>
|
21
|
+
<air-sdk-description>
|
22
|
+
<name>AIR 4.5.6</name>
|
23
|
+
<version>4.5.6</version>
|
24
|
+
<build>5678</build>
|
25
|
+
</air-sdk-description>
|
26
|
+
EOS
|
27
|
+
end
|
28
|
+
before do
|
29
|
+
subject.load xml
|
30
|
+
end
|
31
|
+
|
32
|
+
its(:name) { should == "AIR 4.5.6" }
|
33
|
+
its(:version) { should == "4.5.6" }
|
34
|
+
its(:build) { should == 5678 }
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#digest' do
|
38
|
+
let(:another) { Airenv::SdkDescription.new }
|
39
|
+
before do
|
40
|
+
subject.name = "foo"
|
41
|
+
subject.version = "bar"
|
42
|
+
subject.build = 3141
|
43
|
+
|
44
|
+
another.name = "hoge"
|
45
|
+
another.version = "fuga"
|
46
|
+
another.build = 5926
|
47
|
+
end
|
48
|
+
its(:digest) { should_not == another.digest }
|
49
|
+
end
|
50
|
+
|
51
|
+
describe '#id' do
|
52
|
+
before do
|
53
|
+
subject.name = "AIR 4.5.6"
|
54
|
+
subject.version = "4.5.6"
|
55
|
+
subject.build = 3141
|
56
|
+
end
|
57
|
+
|
58
|
+
its(:id) { should == "4.5.6-b3141" }
|
59
|
+
end
|
60
|
+
|
61
|
+
describe '#<=>' do
|
62
|
+
let(:left) { Airenv::SdkDescription.new }
|
63
|
+
let(:right) { Airenv::SdkDescription.new }
|
64
|
+
|
65
|
+
context 'when right version is bigger' do
|
66
|
+
before do
|
67
|
+
left.version = "4.5.6"
|
68
|
+
left.build = 4567
|
69
|
+
|
70
|
+
right.version = "4.5.8"
|
71
|
+
right.build = 1234
|
72
|
+
end
|
73
|
+
|
74
|
+
subject { left <=> right }
|
75
|
+
it { should == -1 }
|
76
|
+
end
|
77
|
+
|
78
|
+
context 'when left version is bigger' do
|
79
|
+
before do
|
80
|
+
left.version = "4.5.8"
|
81
|
+
left.build = 4567
|
82
|
+
|
83
|
+
right.version = "4.5.4"
|
84
|
+
right.build = 1234
|
85
|
+
end
|
86
|
+
|
87
|
+
subject { left <=> right }
|
88
|
+
it { should == 1 }
|
89
|
+
end
|
90
|
+
|
91
|
+
context 'when left build version is bigger' do
|
92
|
+
before do
|
93
|
+
left.version = "4.5.8"
|
94
|
+
left.build = 1235
|
95
|
+
|
96
|
+
right.version = "4.5.8"
|
97
|
+
right.build = 1234
|
98
|
+
end
|
99
|
+
|
100
|
+
subject { left <=> right }
|
101
|
+
it { should == 1 }
|
102
|
+
end
|
103
|
+
|
104
|
+
context 'when right build version is bigger' do
|
105
|
+
before do
|
106
|
+
left.version = "4.5.8"
|
107
|
+
left.build = 1235
|
108
|
+
|
109
|
+
right.version = "4.5.8"
|
110
|
+
right.build = 1236
|
111
|
+
end
|
112
|
+
|
113
|
+
subject { left <=> right }
|
114
|
+
it { should == -1 }
|
115
|
+
end
|
116
|
+
|
117
|
+
context 'when version and build version is same' do
|
118
|
+
before do
|
119
|
+
left.version = "4.5.8"
|
120
|
+
left.build = 1235
|
121
|
+
|
122
|
+
right.version = "4.5.8"
|
123
|
+
right.build = 1235
|
124
|
+
end
|
125
|
+
|
126
|
+
subject { left <=> right }
|
127
|
+
it { should == 0 }
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
describe '.usable?' do
|
132
|
+
subject { Airenv::SdkDescription.usable?(version_id) }
|
133
|
+
before do
|
134
|
+
Airenv::SdkDescription.stub(:installed_versions).and_return(['1.2.3-b456', '1.2.4-b123'])
|
135
|
+
end
|
136
|
+
context do
|
137
|
+
let(:version_id) { '1.2' }
|
138
|
+
it { should be_true }
|
139
|
+
end
|
140
|
+
context do
|
141
|
+
let(:version_id) { '1.3' }
|
142
|
+
it { should be_false }
|
143
|
+
end
|
144
|
+
context do
|
145
|
+
let(:version_id) { '1.2.4-b123' }
|
146
|
+
it { should be_true }
|
147
|
+
end
|
148
|
+
context do
|
149
|
+
let(:version_id) { '1.2.2-b987' }
|
150
|
+
it { should be_false }
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
describe '.normalize_version_id' do
|
155
|
+
subject { Airenv::SdkDescription.normalize_version_id(version_id) }
|
156
|
+
before do
|
157
|
+
Airenv::SdkDescription.stub(:installed_versions).and_return(['1.2.3-b456', '1.2.4-b123'])
|
158
|
+
end
|
159
|
+
context do
|
160
|
+
let(:version_id) { '1.2' }
|
161
|
+
it { should == '1.2.4-b123' }
|
162
|
+
end
|
163
|
+
context do
|
164
|
+
let(:version_id) { '1.2.3-b456' }
|
165
|
+
it { should == '1.2.3-b456' }
|
166
|
+
end
|
167
|
+
end
|
168
|
+
|
169
|
+
describe '.simple_version?' do
|
170
|
+
subject { Airenv::SdkDescription.simple_version?(version_id) }
|
171
|
+
context do
|
172
|
+
let(:version_id) { '1.2' }
|
173
|
+
it { should be_true }
|
174
|
+
end
|
175
|
+
context do
|
176
|
+
let(:version_id) { '1.2.2-b987' }
|
177
|
+
it { should be_false }
|
178
|
+
end
|
179
|
+
end
|
180
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'airenv/sdk'
|
3
|
+
|
4
|
+
describe Airenv::Sdk do
|
5
|
+
subject { Airenv::Sdk.new }
|
6
|
+
let(:description) { Airenv::SdkDescription.new("AIR 4.5.6", "4.5.6", 5678) }
|
7
|
+
|
8
|
+
describe '#package_uri' do
|
9
|
+
before do
|
10
|
+
subject.description = description
|
11
|
+
end
|
12
|
+
|
13
|
+
its(:package_uri) { should == "http://airdownload.adobe.com/air/mac/download/4.5/AIRSDK_Compiler.tbz2" }
|
14
|
+
end
|
15
|
+
|
16
|
+
describe '#simple_version' do
|
17
|
+
before do
|
18
|
+
subject.description = description
|
19
|
+
end
|
20
|
+
|
21
|
+
its(:simple_version) { should == "4.5" }
|
22
|
+
end
|
23
|
+
|
24
|
+
describe '#parse_version_id' do
|
25
|
+
context 'given build number' do
|
26
|
+
before do
|
27
|
+
subject.description = description
|
28
|
+
subject.parse_version_id("4.5-b1234")
|
29
|
+
end
|
30
|
+
|
31
|
+
its(:simple_version) { should == "4.5" }
|
32
|
+
its("description.build") { should == 1234 }
|
33
|
+
end
|
34
|
+
|
35
|
+
context 'not given build number' do
|
36
|
+
before do
|
37
|
+
subject.parse_version_id("4.6")
|
38
|
+
end
|
39
|
+
|
40
|
+
its(:simple_version) { should == "4.6" }
|
41
|
+
its("description.build") { should be_nil }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe '#package_name' do
|
46
|
+
before do
|
47
|
+
subject.description = description
|
48
|
+
end
|
49
|
+
|
50
|
+
its(:package_name) { should == "AIRSDK_4.5.6-b5678" }
|
51
|
+
end
|
52
|
+
|
53
|
+
describe '#simple_name' do
|
54
|
+
before do
|
55
|
+
subject.description = description
|
56
|
+
end
|
57
|
+
|
58
|
+
its(:simple_name) { should == "AIRSDK_4.5" }
|
59
|
+
end
|
60
|
+
end
|
data/spec/airenv_spec.rb
ADDED
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,277 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: airenv
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Toshiyuki Hirooka
|
8
|
+
- Hidenori Doi
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2014-02-24 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: thor
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
requirements:
|
18
|
+
- - '>='
|
19
|
+
- !ruby/object:Gem::Version
|
20
|
+
version: '0'
|
21
|
+
type: :runtime
|
22
|
+
prerelease: false
|
23
|
+
version_requirements: !ruby/object:Gem::Requirement
|
24
|
+
requirements:
|
25
|
+
- - '>='
|
26
|
+
- !ruby/object:Gem::Version
|
27
|
+
version: '0'
|
28
|
+
- !ruby/object:Gem::Dependency
|
29
|
+
name: active_support
|
30
|
+
requirement: !ruby/object:Gem::Requirement
|
31
|
+
requirements:
|
32
|
+
- - '>='
|
33
|
+
- !ruby/object:Gem::Version
|
34
|
+
version: '0'
|
35
|
+
type: :runtime
|
36
|
+
prerelease: false
|
37
|
+
version_requirements: !ruby/object:Gem::Requirement
|
38
|
+
requirements:
|
39
|
+
- - '>='
|
40
|
+
- !ruby/object:Gem::Version
|
41
|
+
version: '0'
|
42
|
+
- !ruby/object:Gem::Dependency
|
43
|
+
name: i18n
|
44
|
+
requirement: !ruby/object:Gem::Requirement
|
45
|
+
requirements:
|
46
|
+
- - '>='
|
47
|
+
- !ruby/object:Gem::Version
|
48
|
+
version: '0'
|
49
|
+
type: :runtime
|
50
|
+
prerelease: false
|
51
|
+
version_requirements: !ruby/object:Gem::Requirement
|
52
|
+
requirements:
|
53
|
+
- - '>='
|
54
|
+
- !ruby/object:Gem::Version
|
55
|
+
version: '0'
|
56
|
+
- !ruby/object:Gem::Dependency
|
57
|
+
name: progressbar
|
58
|
+
requirement: !ruby/object:Gem::Requirement
|
59
|
+
requirements:
|
60
|
+
- - '>='
|
61
|
+
- !ruby/object:Gem::Version
|
62
|
+
version: '0'
|
63
|
+
type: :runtime
|
64
|
+
prerelease: false
|
65
|
+
version_requirements: !ruby/object:Gem::Requirement
|
66
|
+
requirements:
|
67
|
+
- - '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
- !ruby/object:Gem::Dependency
|
71
|
+
name: configuration
|
72
|
+
requirement: !ruby/object:Gem::Requirement
|
73
|
+
requirements:
|
74
|
+
- - '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :runtime
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: !ruby/object:Gem::Requirement
|
80
|
+
requirements:
|
81
|
+
- - '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
- !ruby/object:Gem::Dependency
|
85
|
+
name: rubyzip
|
86
|
+
requirement: !ruby/object:Gem::Requirement
|
87
|
+
requirements:
|
88
|
+
- - '>='
|
89
|
+
- !ruby/object:Gem::Version
|
90
|
+
version: '0'
|
91
|
+
type: :runtime
|
92
|
+
prerelease: false
|
93
|
+
version_requirements: !ruby/object:Gem::Requirement
|
94
|
+
requirements:
|
95
|
+
- - '>='
|
96
|
+
- !ruby/object:Gem::Version
|
97
|
+
version: '0'
|
98
|
+
- !ruby/object:Gem::Dependency
|
99
|
+
name: archive-tar-minitar
|
100
|
+
requirement: !ruby/object:Gem::Requirement
|
101
|
+
requirements:
|
102
|
+
- - '>='
|
103
|
+
- !ruby/object:Gem::Version
|
104
|
+
version: '0'
|
105
|
+
type: :runtime
|
106
|
+
prerelease: false
|
107
|
+
version_requirements: !ruby/object:Gem::Requirement
|
108
|
+
requirements:
|
109
|
+
- - '>='
|
110
|
+
- !ruby/object:Gem::Version
|
111
|
+
version: '0'
|
112
|
+
- !ruby/object:Gem::Dependency
|
113
|
+
name: bzip2-ruby-rb20
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
115
|
+
requirements:
|
116
|
+
- - '>='
|
117
|
+
- !ruby/object:Gem::Version
|
118
|
+
version: '0'
|
119
|
+
type: :runtime
|
120
|
+
prerelease: false
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
122
|
+
requirements:
|
123
|
+
- - '>='
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '0'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: bundler
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
requirements:
|
130
|
+
- - ~>
|
131
|
+
- !ruby/object:Gem::Version
|
132
|
+
version: '1.3'
|
133
|
+
type: :development
|
134
|
+
prerelease: false
|
135
|
+
version_requirements: !ruby/object:Gem::Requirement
|
136
|
+
requirements:
|
137
|
+
- - ~>
|
138
|
+
- !ruby/object:Gem::Version
|
139
|
+
version: '1.3'
|
140
|
+
- !ruby/object:Gem::Dependency
|
141
|
+
name: rake
|
142
|
+
requirement: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - '>='
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
type: :development
|
148
|
+
prerelease: false
|
149
|
+
version_requirements: !ruby/object:Gem::Requirement
|
150
|
+
requirements:
|
151
|
+
- - '>='
|
152
|
+
- !ruby/object:Gem::Version
|
153
|
+
version: '0'
|
154
|
+
- !ruby/object:Gem::Dependency
|
155
|
+
name: rspec
|
156
|
+
requirement: !ruby/object:Gem::Requirement
|
157
|
+
requirements:
|
158
|
+
- - '>='
|
159
|
+
- !ruby/object:Gem::Version
|
160
|
+
version: '0'
|
161
|
+
type: :development
|
162
|
+
prerelease: false
|
163
|
+
version_requirements: !ruby/object:Gem::Requirement
|
164
|
+
requirements:
|
165
|
+
- - '>='
|
166
|
+
- !ruby/object:Gem::Version
|
167
|
+
version: '0'
|
168
|
+
- !ruby/object:Gem::Dependency
|
169
|
+
name: guard
|
170
|
+
requirement: !ruby/object:Gem::Requirement
|
171
|
+
requirements:
|
172
|
+
- - '>='
|
173
|
+
- !ruby/object:Gem::Version
|
174
|
+
version: '0'
|
175
|
+
type: :development
|
176
|
+
prerelease: false
|
177
|
+
version_requirements: !ruby/object:Gem::Requirement
|
178
|
+
requirements:
|
179
|
+
- - '>='
|
180
|
+
- !ruby/object:Gem::Version
|
181
|
+
version: '0'
|
182
|
+
- !ruby/object:Gem::Dependency
|
183
|
+
name: guard-rspec
|
184
|
+
requirement: !ruby/object:Gem::Requirement
|
185
|
+
requirements:
|
186
|
+
- - '>='
|
187
|
+
- !ruby/object:Gem::Version
|
188
|
+
version: '0'
|
189
|
+
type: :development
|
190
|
+
prerelease: false
|
191
|
+
version_requirements: !ruby/object:Gem::Requirement
|
192
|
+
requirements:
|
193
|
+
- - '>='
|
194
|
+
- !ruby/object:Gem::Version
|
195
|
+
version: '0'
|
196
|
+
- !ruby/object:Gem::Dependency
|
197
|
+
name: pry
|
198
|
+
requirement: !ruby/object:Gem::Requirement
|
199
|
+
requirements:
|
200
|
+
- - '>='
|
201
|
+
- !ruby/object:Gem::Version
|
202
|
+
version: '0'
|
203
|
+
type: :development
|
204
|
+
prerelease: false
|
205
|
+
version_requirements: !ruby/object:Gem::Requirement
|
206
|
+
requirements:
|
207
|
+
- - '>='
|
208
|
+
- !ruby/object:Gem::Version
|
209
|
+
version: '0'
|
210
|
+
description: Automatically download, archive, switch AIR SDK for flash builder on
|
211
|
+
mac.
|
212
|
+
email:
|
213
|
+
- toshi.hirooka@gmail.com
|
214
|
+
- mewlist@mewlist.com
|
215
|
+
executables:
|
216
|
+
- airenv
|
217
|
+
extensions: []
|
218
|
+
extra_rdoc_files: []
|
219
|
+
files:
|
220
|
+
- .gitignore
|
221
|
+
- .rspec
|
222
|
+
- .travis.yml
|
223
|
+
- Gemfile
|
224
|
+
- Guardfile
|
225
|
+
- LICENSE.txt
|
226
|
+
- README.md
|
227
|
+
- Rakefile
|
228
|
+
- airenv.gemspec
|
229
|
+
- bin/airenv
|
230
|
+
- lib/airenv.rb
|
231
|
+
- lib/airenv/cli.rb
|
232
|
+
- lib/airenv/commands.rb
|
233
|
+
- lib/airenv/commands/fetch.thor
|
234
|
+
- lib/airenv/commands/init.thor
|
235
|
+
- lib/airenv/commands/install.thor
|
236
|
+
- lib/airenv/commands/list.thor
|
237
|
+
- lib/airenv/commands/use.thor
|
238
|
+
- lib/airenv/configuration.rb
|
239
|
+
- lib/airenv/downloader.rb
|
240
|
+
- lib/airenv/sdk.rb
|
241
|
+
- lib/airenv/sdk_description.rb
|
242
|
+
- lib/airenv/version.rb
|
243
|
+
- spec/airenv/downloader_spec.rb
|
244
|
+
- spec/airenv/sdk_description_spec.rb
|
245
|
+
- spec/airenv/sdk_spec.rb
|
246
|
+
- spec/airenv_spec.rb
|
247
|
+
- spec/spec_helper.rb
|
248
|
+
homepage: ''
|
249
|
+
licenses:
|
250
|
+
- MIT
|
251
|
+
metadata: {}
|
252
|
+
post_install_message:
|
253
|
+
rdoc_options: []
|
254
|
+
require_paths:
|
255
|
+
- lib
|
256
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
257
|
+
requirements:
|
258
|
+
- - '>='
|
259
|
+
- !ruby/object:Gem::Version
|
260
|
+
version: '0'
|
261
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
262
|
+
requirements:
|
263
|
+
- - '>='
|
264
|
+
- !ruby/object:Gem::Version
|
265
|
+
version: '0'
|
266
|
+
requirements: []
|
267
|
+
rubyforge_project:
|
268
|
+
rubygems_version: 2.0.3
|
269
|
+
signing_key:
|
270
|
+
specification_version: 4
|
271
|
+
summary: Adobe AIR SDK package manager
|
272
|
+
test_files:
|
273
|
+
- spec/airenv/downloader_spec.rb
|
274
|
+
- spec/airenv/sdk_description_spec.rb
|
275
|
+
- spec/airenv/sdk_spec.rb
|
276
|
+
- spec/airenv_spec.rb
|
277
|
+
- spec/spec_helper.rb
|