codeunion 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -0
- data/.rubocop.yml +35 -0
- data/Makefile +101 -0
- data/README.md +13 -0
- data/bin/codeunion +9 -1
- data/codeunion.gemspec +6 -0
- data/lib/codeunion/api.rb +16 -0
- data/lib/codeunion/command.rb +21 -0
- data/lib/codeunion/command/base.rb +3 -3
- data/lib/codeunion/command/config.rb +15 -28
- data/lib/codeunion/command/feedback.rb +39 -0
- data/lib/codeunion/command/main.rb +2 -2
- data/lib/codeunion/command/search.rb +34 -0
- data/lib/codeunion/config.rb +66 -4
- data/lib/codeunion/feedback_request.rb +97 -0
- data/lib/codeunion/github_api.rb +19 -0
- data/lib/codeunion/helpers/text.rb +38 -0
- data/lib/codeunion/http_client.rb +55 -0
- data/lib/codeunion/search.rb +51 -0
- data/lib/codeunion/version.rb +1 -1
- data/libexec/codeunion-config +116 -0
- data/libexec/codeunion-examples +37 -0
- data/libexec/codeunion-feedback +98 -0
- data/libexec/codeunion-projects +37 -0
- data/libexec/codeunion-search +42 -0
- data/test/features.rb +4 -0
- data/test/features/config_test.rb +27 -0
- data/test/fixtures/codeunion_api_search.rb +33 -0
- data/test/unit.rb +5 -0
- data/test/unit/config_test.rb +39 -0
- data/test/unit/feedback_request_test.rb +119 -0
- data/test/unit/fixtures/sample_config +3 -0
- data/test/unit/search_test.rb +59 -0
- metadata +118 -5
- data/bin/codeunion-config +0 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52ea6972b9909f54b51efc7492a367c1a52b390e
|
4
|
+
data.tar.gz: b107ddbc578eb45603bbac1f1aa804938508f48b
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cfa18400fa8db69c0d40157fc8f1f2bd28b8475e0875278abf50585f50f8ae6c67dae18db445b8997da2abb2dfc881ca24d9097e88b1a358b070ab2730211ef3
|
7
|
+
data.tar.gz: 0ad6a777f8a1949284c155c49b73cca2185ce251068ef437fac55c953f45d6182fcf253bf6b1ca1d371decbdd93d4440b6680b19c6b0bdcc3f68f3ca711f6395
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
AllCops:
|
2
2
|
Exclude:
|
3
3
|
- '*.gemspec'
|
4
|
+
- 'test/fixtures/**/*.rb'
|
4
5
|
|
5
6
|
Style/Documentation:
|
6
7
|
Exclude:
|
@@ -9,7 +10,41 @@ Style/Documentation:
|
|
9
10
|
Style/FileName:
|
10
11
|
Exclude:
|
11
12
|
- 'bin/*'
|
13
|
+
- 'libexec/*'
|
14
|
+
|
15
|
+
Style/LineEndConcatenation:
|
16
|
+
Enabled: false
|
17
|
+
|
18
|
+
Style/HashSyntax:
|
19
|
+
Enabled: true
|
20
|
+
EnforcedStyle: hash_rockets
|
21
|
+
|
22
|
+
Style/IndentHash:
|
23
|
+
EnforcedStyle: consistent
|
24
|
+
|
25
|
+
|
26
|
+
Style/BracesAroundHashParameters:
|
27
|
+
EnforcedStyle: braces
|
28
|
+
|
29
|
+
|
30
|
+
Style/WordArray:
|
31
|
+
Enabled: false
|
12
32
|
|
13
33
|
Style/StringLiterals:
|
14
34
|
Enabled: true
|
15
35
|
EnforcedStyle: double_quotes
|
36
|
+
|
37
|
+
Style/StringLiteralsInInterpolation:
|
38
|
+
Enabled: false
|
39
|
+
|
40
|
+
Style/MethodCallParentheses:
|
41
|
+
Enabled: false
|
42
|
+
|
43
|
+
Metrics/MethodLength:
|
44
|
+
Max: 20
|
45
|
+
|
46
|
+
Metrics/LineLength:
|
47
|
+
Max: 120
|
48
|
+
|
49
|
+
Metrics/AbcSize:
|
50
|
+
Max: 25
|
data/Makefile
ADDED
@@ -0,0 +1,101 @@
|
|
1
|
+
193_version = 1.9.3-p551
|
2
|
+
193_env = RBENV_VERSION=$(193_version)
|
3
|
+
|
4
|
+
20_version = 2.0.0-p598
|
5
|
+
20_env = RBENV_VERSION=$(20_version)
|
6
|
+
|
7
|
+
21_version = 2.1.5
|
8
|
+
21_env = RBENV_VERSION=$(21_version)
|
9
|
+
|
10
|
+
rerun = wach -e test/unit/fixtures/\* make
|
11
|
+
test_unit = bundle exec ruby test/unit.rb
|
12
|
+
test_feature = bundle exec ruby test/features.rb
|
13
|
+
|
14
|
+
test: unit-test feature-test
|
15
|
+
|
16
|
+
unit-test: unit-test-193 unit-test-20 unit-test-21
|
17
|
+
|
18
|
+
retest-193:
|
19
|
+
$(rerun) unit-test-193
|
20
|
+
|
21
|
+
unit-test-193:
|
22
|
+
$(193_env) $(test_unit)
|
23
|
+
|
24
|
+
retest-20:
|
25
|
+
$(rerun) unit-test-20
|
26
|
+
|
27
|
+
unit-test-20:
|
28
|
+
$(20_env) $(test_unit)
|
29
|
+
|
30
|
+
retest-21:
|
31
|
+
$(rerun) unit-test-21
|
32
|
+
|
33
|
+
unit-test-21:
|
34
|
+
$(21_env) $(test_unit)
|
35
|
+
|
36
|
+
|
37
|
+
feature-test: feature-test-193 feature-test-20 feature-test-21
|
38
|
+
|
39
|
+
feature-test-193:
|
40
|
+
$(193_env) $(test_feature)
|
41
|
+
|
42
|
+
feature-test-20:
|
43
|
+
$(20_env) $(test_feature)
|
44
|
+
|
45
|
+
feature-test-21:
|
46
|
+
$(21_env) $(test_feature)
|
47
|
+
|
48
|
+
install: install-deps install-193 install-20 install-21
|
49
|
+
|
50
|
+
install-deps: install-wach install-rbenv install-ruby-build
|
51
|
+
brew install npm
|
52
|
+
npm -g install wach
|
53
|
+
|
54
|
+
install-ruby-build:
|
55
|
+
brew install ruby-build
|
56
|
+
|
57
|
+
install-rbenv:
|
58
|
+
brew install rbenv
|
59
|
+
|
60
|
+
install-wach: install-npm
|
61
|
+
npm -g install wach
|
62
|
+
|
63
|
+
install-npm:
|
64
|
+
brew install npm
|
65
|
+
|
66
|
+
install-193: install-ruby-193 install-gems-193
|
67
|
+
install-20: install-ruby-20 install-gems-20
|
68
|
+
install-21: install-ruby-21 install-gems-21
|
69
|
+
|
70
|
+
install_ruby = rbenv install -s
|
71
|
+
|
72
|
+
install-ruby-193:
|
73
|
+
$(install_ruby) $(193_version)
|
74
|
+
|
75
|
+
install-ruby-20:
|
76
|
+
$(install_ruby) $(20_version)
|
77
|
+
|
78
|
+
install-ruby-21:
|
79
|
+
$(install_ruby) $(21_version)
|
80
|
+
|
81
|
+
|
82
|
+
install_bundler = gem install bundler
|
83
|
+
install_gems = bundle install
|
84
|
+
|
85
|
+
install-gems-193:
|
86
|
+
$(193_env) $(install_bundler)
|
87
|
+
$(193_env) $(install_gems)
|
88
|
+
|
89
|
+
install-gems-20:
|
90
|
+
$(20_env) $(install_bundler)
|
91
|
+
$(20_env) $(install_gems)
|
92
|
+
|
93
|
+
install-gems-21:
|
94
|
+
$(21_env) $(install_bundler)
|
95
|
+
$(21_env) $(install_gems)
|
96
|
+
|
97
|
+
lint:
|
98
|
+
bundle exec rubocop
|
99
|
+
|
100
|
+
relint:
|
101
|
+
$(rerun) lint
|
data/README.md
CHANGED
@@ -33,3 +33,16 @@ $ codeunion waffles
|
|
33
33
|
the CodeUnion tool would look for an executable named `codeunion-waffles`. If
|
34
34
|
the executable exists, the tool will run it. If it doesn't exist, we would see
|
35
35
|
a `CommandNotFound` error.
|
36
|
+
|
37
|
+
## Development
|
38
|
+
|
39
|
+
The CodeUnion client targets Ruby 1.9.3, 2.0, and 2.1. Assuming you have
|
40
|
+
[homebrew](http://brew.sh) installed already:
|
41
|
+
|
42
|
+
```
|
43
|
+
make install # Installs npm, wach, rbenv, ruby-build and ruby 1.9.3, 2.0
|
44
|
+
# and 2.1
|
45
|
+
make unit-test # Runs the unit tests against all ruby versions. Thread-safe.
|
46
|
+
make feature-test # Runs the feature tests against all ruby versions. Not-thread-safe.
|
47
|
+
make test # Runs unit and feature tests against all ruby versions
|
48
|
+
```
|
data/bin/codeunion
CHANGED
@@ -8,6 +8,14 @@ bin_file = Pathname.new(__FILE__).realpath
|
|
8
8
|
# Add the gem's "lib" directory to library path
|
9
9
|
$LOAD_PATH.unshift File.expand_path("../../lib", bin_file)
|
10
10
|
|
11
|
+
# Add our gem-specific "libexec" directory to the PATH
|
12
|
+
ENV["PATH"] += ":" + File.expand_path("../../libexec", bin_file)
|
13
|
+
|
11
14
|
require "codeunion/command/main"
|
12
15
|
|
13
|
-
|
16
|
+
options = {
|
17
|
+
:command_name => ARGV.first,
|
18
|
+
:command_args => ARGV.drop(1)
|
19
|
+
}
|
20
|
+
|
21
|
+
CodeUnion::Command::Main.new(options).run
|
data/codeunion.gemspec
CHANGED
@@ -21,6 +21,12 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.7"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
23
|
spec.add_development_dependency "rubocop", "~> 0.27"
|
24
|
+
spec.add_development_dependency "minitest", "~> 5.5"
|
24
25
|
|
25
26
|
spec.add_dependency "ptools", "~> 1.2"
|
27
|
+
spec.add_dependency "faraday", "~> 0.9"
|
28
|
+
spec.add_dependency "faraday_middleware", "~> 0.9"
|
29
|
+
spec.add_dependency "addressable", "~> 2.3"
|
30
|
+
spec.add_dependency "multi_json", "~> 1.10"
|
31
|
+
spec.add_dependency "rainbow", "~> 2.0"
|
26
32
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# require "codeunion"
|
2
|
+
require "codeunion/http_client"
|
3
|
+
|
4
|
+
module CodeUnion
|
5
|
+
# A simple module for interacting with the CodeUnion API
|
6
|
+
class API
|
7
|
+
attr_reader :http_client
|
8
|
+
def initialize(host, version)
|
9
|
+
@http_client = HTTPClient.new("http://#{host}/#{version}")
|
10
|
+
end
|
11
|
+
|
12
|
+
def search(params = {})
|
13
|
+
http_client.get("search", params)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/codeunion/command.rb
CHANGED
@@ -2,6 +2,27 @@ require "codeunion"
|
|
2
2
|
|
3
3
|
module CodeUnion
|
4
4
|
module Command
|
5
|
+
# Raised when a command doesn't exist
|
5
6
|
class CommandNotFound < StandardError; end
|
7
|
+
|
8
|
+
# Raised when a command is missing required configuration fields
|
9
|
+
#
|
10
|
+
# Example:
|
11
|
+
# fail(MissingConfig, {
|
12
|
+
# :name => "codeunion.api_token",
|
13
|
+
# :help => "See: http://codeunion.com/guides/creating-a-codeunion-access-token"
|
14
|
+
# }
|
15
|
+
class MissingConfig < StandardError
|
16
|
+
def initialize(field)
|
17
|
+
super("Run 'codeunion config set #{field[:name]} VALUE'#{help_text(field)}")
|
18
|
+
end
|
19
|
+
|
20
|
+
def help_text(field)
|
21
|
+
field[:help] ? "\n#{field[:help]}" : ""
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
# Raised when input isn't appropriate for a command
|
26
|
+
class InvalidInput < StandardError; end
|
6
27
|
end
|
7
28
|
end
|
@@ -4,13 +4,13 @@ module CodeUnion
|
|
4
4
|
module Command
|
5
5
|
# A base class for built-in commands
|
6
6
|
class Base
|
7
|
-
def initialize(
|
8
|
-
@
|
7
|
+
def initialize(options)
|
8
|
+
@options = options
|
9
9
|
end
|
10
10
|
|
11
11
|
private
|
12
12
|
|
13
|
-
attr_reader :
|
13
|
+
attr_reader :options
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
@@ -4,43 +4,30 @@ require "fileutils"
|
|
4
4
|
|
5
5
|
module CodeUnion
|
6
6
|
module Command
|
7
|
-
# The
|
7
|
+
# The built-in `codeunion config` command
|
8
8
|
class Config < Base
|
9
|
-
CONFIG_DIR = File.join(Dir.home, ".codeunion")
|
10
|
-
CONFIG_FILE = File.join(CONFIG_DIR, "config")
|
11
|
-
|
12
9
|
def run
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
10
|
+
edit_config do
|
11
|
+
if options[:command] == "get"
|
12
|
+
return config.get(options[:input].join(""))
|
13
|
+
elsif options[:command] == "set"
|
14
|
+
config.set(*options[:input])
|
15
|
+
elsif options[:command] == "unset"
|
16
|
+
config.unset(options[:input].join(""))
|
17
|
+
end
|
20
18
|
end
|
21
|
-
|
22
|
-
save_config!
|
19
|
+
nil
|
23
20
|
end
|
24
21
|
|
25
22
|
private
|
26
23
|
|
27
|
-
def
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
def ensure_config_exists!
|
32
|
-
FileUtils.mkdir(CONFIG_DIR) unless Dir.exist?(CONFIG_DIR)
|
33
|
-
write_config_data({}) unless File.exist?(CONFIG_FILE)
|
34
|
-
end
|
35
|
-
|
36
|
-
def save_config!
|
37
|
-
write_config_data(config)
|
24
|
+
def edit_config
|
25
|
+
yield
|
26
|
+
config.write
|
38
27
|
end
|
39
28
|
|
40
|
-
def
|
41
|
-
|
42
|
-
f.write YAML.dump(Hash(data))
|
43
|
-
end
|
29
|
+
def config
|
30
|
+
@config ||= CodeUnion::Config.load
|
44
31
|
end
|
45
32
|
end
|
46
33
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "codeunion/command/base"
|
2
|
+
require "codeunion/feedback_request"
|
3
|
+
require "codeunion/config"
|
4
|
+
|
5
|
+
module CodeUnion
|
6
|
+
module Command
|
7
|
+
# "View" in Traditional MVC for the Feedback command. Validates Input
|
8
|
+
# and Builds response
|
9
|
+
class Feedback < Base
|
10
|
+
CREATE_ACCESS_TOKEN_URL =
|
11
|
+
"https://help.github.com/articles/creating-an-access-token-for-command-line-use/"
|
12
|
+
|
13
|
+
def run
|
14
|
+
config = Config.load
|
15
|
+
token = config.get("github.access_token")
|
16
|
+
repository = config.get("feedback.repository")
|
17
|
+
if !token
|
18
|
+
fail(CodeUnion::Command::MissingConfig, { :name => "github.access_token",
|
19
|
+
:help => "See: #{CREATE_ACCESS_TOKEN_URL }" })
|
20
|
+
elsif !repository
|
21
|
+
fail(CodeUnion::Command::MissingConfig, { :name => "feedback.repository" })
|
22
|
+
end
|
23
|
+
@feedback_request = FeedbackRequest.new(input, token, repository)
|
24
|
+
ensure_valid_input!
|
25
|
+
@feedback_request.send!
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def input
|
31
|
+
options[:input].join("")
|
32
|
+
end
|
33
|
+
|
34
|
+
def ensure_valid_input!
|
35
|
+
fail(CodeUnion::Command::InvalidInput, @feedback_request.errors) unless @feedback_request.valid?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "codeunion/command/base"
|
2
|
+
require "codeunion/api"
|
3
|
+
require "codeunion/helpers/text"
|
4
|
+
require "codeunion/search"
|
5
|
+
|
6
|
+
require "faraday"
|
7
|
+
require "rainbow"
|
8
|
+
require "io/console"
|
9
|
+
|
10
|
+
module CodeUnion
|
11
|
+
module Command
|
12
|
+
# The built-in `codeunion search` command
|
13
|
+
class Search < Base
|
14
|
+
include CodeUnion::Helpers::Text
|
15
|
+
|
16
|
+
def run
|
17
|
+
results.inject([]) do |lines, result|
|
18
|
+
lines.push(CodeUnion::Search::ResultPresenter.new(result).to_s)
|
19
|
+
lines << format_output("")
|
20
|
+
end.join("\n")
|
21
|
+
end
|
22
|
+
|
23
|
+
def results
|
24
|
+
@results ||= api.search(options)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def api
|
30
|
+
@api ||= CodeUnion::API.new("api.codeunion.io", "v1")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/codeunion/config.rb
CHANGED
@@ -1,10 +1,17 @@
|
|
1
1
|
require "yaml"
|
2
2
|
|
3
3
|
module CodeUnion
|
4
|
-
#
|
4
|
+
# Manages CodeUnion configuration data
|
5
5
|
class Config
|
6
|
-
|
7
|
-
|
6
|
+
DEFAULT_CONFIG_FILE = File.join(Dir.home, ".codeunion", "config")
|
7
|
+
|
8
|
+
def self.load(config_file_path = DEFAULT_CONFIG_FILE)
|
9
|
+
CodeUnion::Config.new(FileAdapter.new(config_file_path))
|
10
|
+
end
|
11
|
+
|
12
|
+
def initialize(config_file)
|
13
|
+
@file = config_file
|
14
|
+
@config = Hash.try_convert(config_file)
|
8
15
|
@config.default_proc = proc { |h, k| h[k] = {} }
|
9
16
|
end
|
10
17
|
|
@@ -13,6 +20,11 @@ module CodeUnion
|
|
13
20
|
self
|
14
21
|
end
|
15
22
|
|
23
|
+
def unset(dotted_key)
|
24
|
+
@config = unset_dotted(@config, dotted_key)
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
16
28
|
def get(dotted_key)
|
17
29
|
get_dotted(@config, dotted_key)
|
18
30
|
end
|
@@ -23,6 +35,10 @@ module CodeUnion
|
|
23
35
|
|
24
36
|
alias_method :to_h, :to_hash
|
25
37
|
|
38
|
+
def write
|
39
|
+
@file.write(to_hash)
|
40
|
+
end
|
41
|
+
|
26
42
|
private
|
27
43
|
|
28
44
|
def set_dotted(config, dotted_key, value)
|
@@ -30,7 +46,18 @@ module CodeUnion
|
|
30
46
|
|
31
47
|
key, sub_key = extract_subkey(dotted_key)
|
32
48
|
|
33
|
-
config.merge(key => set_dotted(config[key], sub_key, value))
|
49
|
+
config.merge({ key => set_dotted(config[key], sub_key, value) })
|
50
|
+
end
|
51
|
+
|
52
|
+
def unset_dotted(config, dotted_key)
|
53
|
+
key, sub_key = extract_subkey(dotted_key)
|
54
|
+
if sub_key
|
55
|
+
unset_dotted(config[key], sub_key)
|
56
|
+
config.delete(key) if config[key].empty?
|
57
|
+
else
|
58
|
+
config.delete(key)
|
59
|
+
end
|
60
|
+
config
|
34
61
|
end
|
35
62
|
|
36
63
|
def get_dotted(config, dotted_key)
|
@@ -46,5 +73,40 @@ module CodeUnion
|
|
46
73
|
def extract_subkey(dotted_key)
|
47
74
|
dotted_key.split(".", 2)
|
48
75
|
end
|
76
|
+
|
77
|
+
# Reads and writes YAML to the FileSystem
|
78
|
+
class FileAdapter
|
79
|
+
attr_reader :file_path
|
80
|
+
|
81
|
+
def initialize(file_path)
|
82
|
+
@file_path = file_path
|
83
|
+
end
|
84
|
+
|
85
|
+
def write(data)
|
86
|
+
ensure_exists!
|
87
|
+
write_fearlessly(data)
|
88
|
+
end
|
89
|
+
|
90
|
+
def to_hash
|
91
|
+
ensure_exists!
|
92
|
+
YAML.load_file(file_path).dup
|
93
|
+
end
|
94
|
+
|
95
|
+
alias_method :to_h, :to_hash
|
96
|
+
|
97
|
+
private
|
98
|
+
|
99
|
+
def write_fearlessly(data)
|
100
|
+
File.open(file_path, "w") do |f|
|
101
|
+
f.write YAML.dump(Hash.try_convert(data))
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
def ensure_exists!
|
106
|
+
config_dir = File.dirname(file_path)
|
107
|
+
FileUtils.mkdir(config_dir) unless Dir.exist?(config_dir)
|
108
|
+
write_fearlessly({}) unless File.exist?(file_path)
|
109
|
+
end
|
110
|
+
end
|
49
111
|
end
|
50
112
|
end
|