firebrew 0.1.0

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.
Files changed (38) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +18 -0
  3. data/.rspec +2 -0
  4. data/.travis.yml +3 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +127 -0
  8. data/Rakefile +6 -0
  9. data/bin/firebrew +5 -0
  10. data/firebrew.gemspec +29 -0
  11. data/lib/firebrew.rb +20 -0
  12. data/lib/firebrew/amo_api/search.rb +50 -0
  13. data/lib/firebrew/command_line.rb +140 -0
  14. data/lib/firebrew/entity.rb +39 -0
  15. data/lib/firebrew/firefox/basic_extension.rb +10 -0
  16. data/lib/firebrew/firefox/command.rb +27 -0
  17. data/lib/firebrew/firefox/extension.rb +104 -0
  18. data/lib/firebrew/firefox/profile.rb +56 -0
  19. data/lib/firebrew/runner.rb +83 -0
  20. data/lib/firebrew/version.rb +3 -0
  21. data/spec/double/firefox.rb +2 -0
  22. data/spec/firebrew/amo_api/search_spec.rb +69 -0
  23. data/spec/firebrew/command_line_spec.rb +150 -0
  24. data/spec/firebrew/entity_spec.rb +79 -0
  25. data/spec/firebrew/firefox/command_spec.rb +39 -0
  26. data/spec/firebrew/firefox/extension_spec.rb +159 -0
  27. data/spec/firebrew/firefox/profile_spec.rb +69 -0
  28. data/spec/firebrew/runner_spec.rb +142 -0
  29. data/spec/firebrew_spec.rb +7 -0
  30. data/spec/fixtures/amo_api/search/base.xml +28 -0
  31. data/spec/fixtures/amo_api/search/empty.xml +4 -0
  32. data/spec/fixtures/amo_api/search/single.xml +12 -0
  33. data/spec/fixtures/firefox/extension/extensions.v16.json +227 -0
  34. data/spec/fixtures/firefox/extension/extensions_added_hoge.v16.json +235 -0
  35. data/spec/fixtures/firefox/profile/base.ini +18 -0
  36. data/spec/fixtures/firefox/profile/empty.ini +2 -0
  37. data/spec/spec_helper.rb +13 -0
  38. metadata +196 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: ee0908cafa9dc7f91a605e060ed0e023b63cb9a4
4
+ data.tar.gz: 88e3a156dfba8e25ed0f3dab12e6a6418a6a5f93
5
+ SHA512:
6
+ metadata.gz: 9258b7043880fe71cf3259f7b4d065694e8936d3a69f88bf63705d2d98cd77223dfdbeb3ca0de5bca35768e605c9e6d0e7562494818d06eab1247839eddb95d3
7
+ data.tar.gz: 5b7b4e143d90517b87eeb16938b51171356970b91d105f8be5d5f62874ae8caf118c9f7a8cf3dfccf1b841b2f5401669ae67631535617f9610858940a5661e12
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ /vendor/bundle
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
data/.travis.yml ADDED
@@ -0,0 +1,3 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.1.1
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in firebrew.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Yuichi Murata
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,127 @@
1
+ # Firebrew
2
+
3
+ Firefox add-ons manager for CUI.
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ gem 'firebrew'
10
+
11
+ And then execute:
12
+
13
+ $ bundle
14
+
15
+ Or install it yourself as:
16
+
17
+ $ gem install firebrew
18
+
19
+ ## Usage
20
+
21
+ The structure of the command line is shown below:
22
+
23
+ ```bash
24
+ $ firebrew [--help] [--version]
25
+ [--base-dir=<path>] [--profile=<name>] [--firefox=<path>]
26
+ <command> [<args>]
27
+ ```
28
+
29
+ ### commands
30
+
31
+ #### install
32
+
33
+ Install the extension which is designated by the `extension-name` argument:
34
+
35
+ ```bash
36
+ $ firebrew install <extension-name>
37
+ ```
38
+
39
+ #### uninstall
40
+
41
+ Uninstall the extension which is designated by the `extension-name` argument:
42
+
43
+ ```bash
44
+ $ firebrew uninstall <extension-name>
45
+ ```
46
+
47
+ #### info
48
+
49
+ Show detail information of the extension which is designated by the `extension-name` argument:
50
+
51
+ ```bash
52
+ $ firebrew info <extension-name>
53
+ ```
54
+
55
+ #### search
56
+
57
+ Enumerate the remote extensions whose name is matched the `term` argument:
58
+
59
+ ```bash
60
+ $ firebrew search <term>
61
+ ```
62
+
63
+ #### list
64
+
65
+ Enumerate the installed extensions:
66
+
67
+ ```bash
68
+ $ firebrew list
69
+ ```
70
+
71
+ ### options
72
+
73
+ #### --base-dir
74
+
75
+ The Firefox profiles.ini directory:
76
+
77
+ ```bash
78
+ -d <path>, --base-dir=<path>
79
+ ```
80
+
81
+ The default value is listed below:
82
+
83
+ | platform | path |
84
+ | -------- | ---- |
85
+ | Mac OS X | ~/Library/Application Support/Firefox |
86
+ | Linux | ~/.mozilla/firefox |
87
+ | Windows 7 x86\_64 | %UserProfile%\AppData\Roming\Mozilla\Firefox |
88
+
89
+ It's able to overridden by the `FIREBREW_FIREFOX_PROFILE_BASE_DIR` environment variable.
90
+
91
+ #### --profile-name
92
+
93
+ The Firefox profile name:
94
+
95
+ ```bash
96
+ -p <name>, --profile=<name>
97
+ ```
98
+
99
+ The default value is `default`, and it's able to overridden by the `FIREBREW_FIREFOX_PROFILE` environment variable.
100
+
101
+ #### --firefox
102
+
103
+ The Firefox command path:
104
+
105
+ ```bash
106
+ -f <path>, --firefox=<path>
107
+ ```
108
+
109
+ The default value is listed below:
110
+
111
+ | platform | path |
112
+ | -------- | ---- |
113
+ | Mac OS X | /Applications/Firefox.app/Contents/MacOS/firefox-bin |
114
+ | Linux | /usr/bin/firefox |
115
+ | Windows 7 x86\_64 | C:\Program Files (x86)\Mozilla Firefox\firefox.exe |
116
+
117
+ It's able to overridden by the `FIREBREW_FIREFOX` environment variable.
118
+
119
+
120
+ ## Contributing
121
+
122
+ 1. Fork it ( http://github.com/mrk21/firebrew/fork )
123
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
124
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
125
+ 4. Push to the branch (`git push origin my-new-feature`)
126
+ 5. Create new Pull Request
127
+
data/Rakefile ADDED
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
data/bin/firebrew ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'firebrew'
4
+
5
+ Firebrew::CommandLine.execute
data/firebrew.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'firebrew/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "firebrew"
8
+ spec.version = Firebrew::VERSION
9
+ spec.authors = ["Yuichi Murata"]
10
+ spec.email = ["mrk21info+rubygems@gmail.com"]
11
+ spec.summary = %q{Firefox add-ons manager for CUI.}
12
+ spec.description = %q{Firefox add-ons manager for CUI.}
13
+ spec.homepage = "https://github.com/mrk21/firebrew"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
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_development_dependency "bundler", "~> 1.5"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec", "~> 3.0"
24
+
25
+ spec.add_dependency "activesupport", "~> 4.1"
26
+ spec.add_dependency "activeresource", "~> 4.0"
27
+ spec.add_dependency "activemodel", "~> 4.1"
28
+ spec.add_dependency "inifile", "~> 2.0"
29
+ end
data/lib/firebrew.rb ADDED
@@ -0,0 +1,20 @@
1
+ require "firebrew/version"
2
+
3
+ module Firebrew
4
+ class Error < StandardError; def status; 1 end end
5
+ class ProfilesFileNotFoundError < Error; def status; 2 end end
6
+ class ProfileNotFoundError < Error; def status; 3 end end
7
+ class ExtensionsFileNotFoundError < Error; def status; 4 end end
8
+ class ExtensionNotFoundError < Error; def status; 5 end end
9
+ class FirefoxCommandError < Error; def status; 6 end end
10
+ class CommandLineError < Error; def status; 7 end end
11
+ class OperationAlreadyCompletedError < Error; def status; 8 end end
12
+ end
13
+
14
+ require 'firebrew/entity'
15
+ require 'firebrew/amo_api/search'
16
+ require 'firebrew/firefox/profile'
17
+ require 'firebrew/firefox/extension'
18
+ require 'firebrew/firefox/command'
19
+ require 'firebrew/runner'
20
+ require 'firebrew/command_line'
@@ -0,0 +1,50 @@
1
+ require 'active_resource'
2
+ require 'uri'
3
+ require 'firebrew/firefox/basic_extension'
4
+
5
+ module Firebrew::AmoApi
6
+ class Search < ActiveResource::Base
7
+ class Format
8
+ include ActiveResource::Formats::XmlFormat
9
+
10
+ def decode(xml)
11
+ results = super(xml)['addon'] || []
12
+ results.instance_of?(Array) ? results : [results]
13
+ end
14
+ end
15
+
16
+ self.site = 'https://services.addons.mozilla.org'
17
+ self.format = Format.new
18
+
19
+ def self.path(params={})
20
+ path_source = '/ja/firefox/api/%{api_version}/search/%{term}/%{type}/%{max}/%{os}/%{version}'
21
+ default_params = {
22
+ api_version: 1.5,
23
+ type: 'all',
24
+ max: 30,
25
+ os: 'all',
26
+ version: '',
27
+ }
28
+ URI.encode(path_source % default_params.merge(params))
29
+ end
30
+
31
+ def self.fetch(params={})
32
+ self.find(:all, from: self.path(params)).to_a
33
+ end
34
+
35
+ def self.fetch!(params={})
36
+ results = self.fetch(params)
37
+ raise Firebrew::ExtensionNotFoundError if results.empty?
38
+ results
39
+ end
40
+
41
+ def extension
42
+ Firebrew::Firefox::BasicExtension.new(
43
+ name: self.name,
44
+ guid: self.guid,
45
+ uri: self.install,
46
+ version: self.version
47
+ )
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,140 @@
1
+ require 'optparse'
2
+
3
+ module Firebrew
4
+ class CommandLine
5
+ attr_accessor :arguments
6
+
7
+ def self.execute
8
+ begin
9
+ if block_given? then
10
+ yield
11
+ else
12
+ self.new(ARGV).execute
13
+ end
14
+ rescue Firebrew::Error => e
15
+ $stderr.puts e.message
16
+ exit e.status
17
+ rescue SystemExit => e
18
+ exit 1
19
+ rescue Exception => e
20
+ $stderr.puts e.inspect
21
+ $stderr.puts e.backtrace
22
+ exit 255
23
+ else
24
+ exit 0
25
+ end
26
+ end
27
+
28
+ def initialize(args=[])
29
+ opt = OptionParser.new
30
+ opt.version = Firebrew::VERSION
31
+ opt.banner = <<-USAGE.split(/\n/).map{|v| v.gsub(/^( ){4}/,'')}.join("\n")
32
+ Usage: firebrew [--help] [--version]
33
+ [--base-dir=<path>] [--profile=<name>] [--firefox=<path>]
34
+ <command> [<args>]
35
+
36
+ commands:
37
+ install:
38
+ firebrew install <extension-name>
39
+
40
+ uninstall:
41
+ firebrew uninstall <extension-name>
42
+
43
+ info:
44
+ firebrew info <extension-name>
45
+
46
+ search:
47
+ firebrew search <term>
48
+
49
+ list:
50
+ firebrew list
51
+
52
+ options:
53
+ USAGE
54
+
55
+ self.arguments = {
56
+ command: nil,
57
+ params: {},
58
+ config: {}
59
+ }
60
+
61
+ self.register_global_options(opt)
62
+ self.class.opt_operation(opt, :order!, args)
63
+
64
+ case args.shift
65
+ when 'install' then
66
+ self.class.opt_operation(opt, :permute!, args)
67
+ self.arguments[:command] = :install
68
+ self.arguments[:params][:term] = args[0]
69
+
70
+ when 'uninstall' then
71
+ self.class.opt_operation(opt, :permute!, args)
72
+ self.arguments[:command] = :uninstall
73
+ self.arguments[:params][:term] = args[0]
74
+
75
+ when 'info' then
76
+ self.class.opt_operation(opt, :permute!, args)
77
+ self.arguments[:command] = :info
78
+ self.arguments[:params][:term] = args[0]
79
+
80
+ when 'search' then
81
+ self.class.opt_operation(opt, :permute!, args)
82
+ self.arguments[:command] = :search
83
+ self.arguments[:params][:term] = args[0]
84
+
85
+ when 'list' then
86
+ self.class.opt_operation(opt, :permute!, args)
87
+ self.arguments[:command] = :list
88
+
89
+ when nil then
90
+ self.class.opt_operation(opt, :permute, ['--help'])
91
+
92
+ else
93
+ raise Firebrew::CommandLineError
94
+ end
95
+ end
96
+
97
+ def execute
98
+ runner = Runner.new(self.arguments[:config])
99
+
100
+ case self.arguments[:command]
101
+ when :search, :list then
102
+ results = runner.send(self.arguments[:command], self.arguments[:params])
103
+ results.each do |result|
104
+ puts result.name
105
+ end
106
+
107
+ when :info then
108
+ result = runner.send(self.arguments[:command], self.arguments[:params])
109
+ puts result.to_xml
110
+
111
+ else
112
+ runner.send(self.arguments[:command], self.arguments[:params])
113
+ end
114
+ end
115
+
116
+ protected
117
+
118
+ def self.opt_operation(opt, operation, args)
119
+ begin
120
+ opt.send(operation, args)
121
+ rescue OptionParser::InvalidOption
122
+ raise Firebrew::CommandLineError
123
+ end
124
+ end
125
+
126
+ def register_global_options(opt)
127
+ opt.on('-d <path>','--base-dir=<path>','Firefox profiles.ini directory') do |v|
128
+ self.arguments[:config][:base_dir] = v
129
+ end
130
+
131
+ opt.on('-p <name>','--profile=<name>','Firefox profile name') do |v|
132
+ self.arguments[:config][:profile] = v
133
+ end
134
+
135
+ opt.on('-f <path>','--firefox=<path>','Firefox command path') do |v|
136
+ self.arguments[:config][:firefox] = v
137
+ end
138
+ end
139
+ end
140
+ end