social_snippet 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/.gitignore +2 -0
- data/.travis.yml +22 -3
- data/Gemfile +25 -2
- data/Guardfile +9 -0
- data/README.md +6 -1
- data/Rakefile +51 -1
- data/appveyor.yml +36 -0
- data/bin/ssnip +10 -0
- data/bin/sspm +10 -0
- data/lib/social_snippet.rb +15 -4
- data/lib/social_snippet/api.rb +238 -0
- data/lib/social_snippet/command_line.rb +4 -0
- data/lib/social_snippet/command_line/command.rb +158 -0
- data/lib/social_snippet/command_line/ssnip.rb +2 -0
- data/lib/social_snippet/command_line/ssnip/main_command.rb +26 -0
- data/lib/social_snippet/command_line/sspm.rb +3 -0
- data/lib/social_snippet/command_line/sspm/main_command.rb +63 -0
- data/lib/social_snippet/command_line/sspm/sub_commands.rb +16 -0
- data/lib/social_snippet/command_line/sspm/sub_commands/complete_command.rb +28 -0
- data/lib/social_snippet/command_line/sspm/sub_commands/info_command.rb +28 -0
- data/lib/social_snippet/command_line/sspm/sub_commands/install_command.rb +103 -0
- data/lib/social_snippet/command_line/sspm/sub_commands/publish_command.rb +51 -0
- data/lib/social_snippet/command_line/sspm/sub_commands/search_command.rb +32 -0
- data/lib/social_snippet/command_line/sspm/sub_commands/update_command.rb +37 -0
- data/lib/social_snippet/config.rb +92 -0
- data/lib/social_snippet/context.rb +89 -0
- data/lib/social_snippet/core.rb +40 -0
- data/lib/social_snippet/inserter.rb +64 -0
- data/lib/social_snippet/logger.rb +9 -0
- data/lib/social_snippet/registry.rb +3 -0
- data/lib/social_snippet/registry/registry_client.rb +15 -0
- data/lib/social_snippet/registry/registry_resources.rb +3 -0
- data/lib/social_snippet/registry/registry_resources/base.rb +80 -0
- data/lib/social_snippet/registry/registry_resources/repositories.rb +23 -0
- data/lib/social_snippet/repository.rb +6 -0
- data/lib/social_snippet/repository/drivers.rb +3 -0
- data/lib/social_snippet/repository/drivers/base_repository.rb +192 -0
- data/lib/social_snippet/repository/drivers/git_repository.rb +76 -0
- data/lib/social_snippet/repository/repository_errors.rb +5 -0
- data/lib/social_snippet/repository/repository_factory.rb +59 -0
- data/lib/social_snippet/repository/repository_installer.rb +86 -0
- data/lib/social_snippet/repository/repository_manager.rb +177 -0
- data/lib/social_snippet/resolvers.rb +4 -0
- data/lib/social_snippet/resolvers/base_resolver.rb +103 -0
- data/lib/social_snippet/resolvers/dep_resolver.rb +61 -0
- data/lib/social_snippet/resolvers/insert_resolver.rb +100 -0
- data/lib/social_snippet/snippet.rb +14 -0
- data/lib/social_snippet/tag.rb +198 -0
- data/lib/social_snippet/tag_parser.rb +61 -0
- data/lib/social_snippet/version.rb +26 -1
- data/social_snippet.gemspec +18 -3
- data/spec/helpers/codeclimate_helper.rb +4 -0
- data/spec/helpers/fakefs_helper.rb +15 -0
- data/spec/helpers/webmock_helper.rb +16 -0
- data/spec/lib/api_spec.rb +106 -0
- data/spec/lib/command_line/sspm_install_spec.rb +224 -0
- data/spec/lib/command_line/sspm_search_spec.rb +167 -0
- data/spec/lib/command_line/sspm_spec.rb +81 -0
- data/spec/lib/config_spec.rb +56 -0
- data/spec/lib/context_spec.rb +48 -0
- data/spec/lib/core_spec.rb +126 -0
- data/spec/lib/inserter_spec.rb +177 -0
- data/spec/lib/registry_client_spec.rb +173 -0
- data/spec/lib/repository/base_repository_spec.rb +104 -0
- data/spec/lib/repository/git_repository_spec.rb +83 -0
- data/spec/lib/repository/repository_factory_spec.rb +31 -0
- data/spec/lib/repository/repository_installer_spec.rb +63 -0
- data/spec/lib/repository/repository_manager_spec.rb +201 -0
- data/spec/lib/tag_parser_spec.rb +173 -0
- data/spec/lib/tag_spec.rb +93 -0
- data/spec/spec_helper.rb +106 -0
- data/test/base_repository_test.rb +375 -0
- data/test/command_test.rb +39 -0
- data/test/context_test.rb +31 -0
- data/test/core_test.rb +2091 -0
- data/test/git_repository_test.rb +114 -0
- data/test/install_command_test.rb +28 -0
- data/test/repository_manager_test.rb +109 -0
- data/test/tag_parser_test.rb +47 -0
- data/test/tag_test.rb +217 -0
- data/test/version_test.rb +56 -0
- metadata +271 -14
@@ -0,0 +1,51 @@
|
|
1
|
+
module SocialSnippet::CommandLine
|
2
|
+
|
3
|
+
class SSpm::SubCommands::PublishCommand < Command
|
4
|
+
|
5
|
+
def usage
|
6
|
+
<<EOF
|
7
|
+
Usage:
|
8
|
+
- sspm publish [options] [--] <repo-url>
|
9
|
+
- sspm publish [options] [--] <owner-id> <repo-id>
|
10
|
+
(published as "https://github.com/{owner-id}/{repo-id}.git")
|
11
|
+
|
12
|
+
Example:
|
13
|
+
$ sspm publish https://github.com/user/repo
|
14
|
+
-> published as the name written in snippet.json
|
15
|
+
|
16
|
+
[another method]
|
17
|
+
$ sspm publish user repo
|
18
|
+
|
19
|
+
Note:
|
20
|
+
- Currently the registry system supported the GitHub repositories only.
|
21
|
+
|
22
|
+
EOF
|
23
|
+
end
|
24
|
+
|
25
|
+
def desc
|
26
|
+
"Publish a repository to the registry system"
|
27
|
+
end
|
28
|
+
|
29
|
+
def define_options
|
30
|
+
end
|
31
|
+
|
32
|
+
def run
|
33
|
+
if has_next_token?
|
34
|
+
repo_url = next_token
|
35
|
+
if /^(git|http|https)\:\/\// === repo_url # url
|
36
|
+
social_snippet.api.add_url repo_url
|
37
|
+
elsif has_next_token? # {repo_owner_id} {repo_id}
|
38
|
+
owner_id = repo_url
|
39
|
+
repo_id = next_token
|
40
|
+
social_snippet.api.add_url "https://github.com/#{owner_id}/#{repo_id}.git"
|
41
|
+
else
|
42
|
+
help
|
43
|
+
end
|
44
|
+
else
|
45
|
+
help
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
module SocialSnippet::CommandLine
|
2
|
+
|
3
|
+
class SSpm::SubCommands::SearchCommand < Command
|
4
|
+
|
5
|
+
def usage
|
6
|
+
<<EOF
|
7
|
+
Usage: sspm search [options] [--] <keyword>
|
8
|
+
EOF
|
9
|
+
end
|
10
|
+
|
11
|
+
def desc
|
12
|
+
"Search for repository by keyword"
|
13
|
+
end
|
14
|
+
|
15
|
+
def define_options
|
16
|
+
define_option :name, :type => :flag, :short => true, :default => true
|
17
|
+
define_option :desc, :type => :flag, :short => true, :default => true
|
18
|
+
define_option :url, :type => :flag, :short => true, :default => false
|
19
|
+
define_option :installed, :type => :flag, :short => true, :default => true
|
20
|
+
end
|
21
|
+
|
22
|
+
def run
|
23
|
+
if has_next_token?
|
24
|
+
social_snippet.api.search_repositories next_token, options
|
25
|
+
else
|
26
|
+
help
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module SocialSnippet::CommandLine
|
2
|
+
|
3
|
+
class SSpm::SubCommands::UpdateCommand < Command
|
4
|
+
|
5
|
+
def usage
|
6
|
+
<<EOF
|
7
|
+
Usage: sspm update [options] [--] [<repo> ...]
|
8
|
+
|
9
|
+
Examples:
|
10
|
+
$ sspm update
|
11
|
+
-> Update all installed repositories
|
12
|
+
|
13
|
+
$ sspm update example-repo
|
14
|
+
-> Update example-repo and Install missing dependencies
|
15
|
+
EOF
|
16
|
+
end
|
17
|
+
|
18
|
+
def desc
|
19
|
+
"Update repositories"
|
20
|
+
end
|
21
|
+
|
22
|
+
def define_options
|
23
|
+
end
|
24
|
+
|
25
|
+
def run
|
26
|
+
if has_next_token?
|
27
|
+
while has_next_token?
|
28
|
+
social_snippet.api.update_repository next_token, options
|
29
|
+
end
|
30
|
+
else
|
31
|
+
social_snippet.api.update_all_repositories options
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,92 @@
|
|
1
|
+
class SocialSnippet::Config
|
2
|
+
|
3
|
+
attr_reader :social_snippet
|
4
|
+
|
5
|
+
# prefix of environment variables
|
6
|
+
ENV_PREFIX = "SOCIAL_SNIPPET_"
|
7
|
+
|
8
|
+
FIELDS = [
|
9
|
+
# The path of home directory [default: "$HOME/.social-snippet"]
|
10
|
+
:home,
|
11
|
+
# Enable debug mode? [default: false]
|
12
|
+
:debug,
|
13
|
+
# Web API host [default: "sspm.herokuapp.com"]
|
14
|
+
:sspm_host,
|
15
|
+
# Web API version [default: "v0"]
|
16
|
+
:sspm_version,
|
17
|
+
# Web API protocol [default: "https"]
|
18
|
+
:sspm_protocol,
|
19
|
+
]
|
20
|
+
|
21
|
+
# use "true" / "false"
|
22
|
+
FLAGS = [
|
23
|
+
:debug,
|
24
|
+
]
|
25
|
+
|
26
|
+
# set accessors
|
27
|
+
FIELDS.each {|field| attr_reader field }
|
28
|
+
|
29
|
+
# Constructor
|
30
|
+
def initialize(new_social_snippet, options = {})
|
31
|
+
@social_snippet = new_social_snippet
|
32
|
+
|
33
|
+
fields = {}
|
34
|
+
fields.merge! options
|
35
|
+
load_environment_variables fields
|
36
|
+
|
37
|
+
# set default values
|
38
|
+
fields[:home] ||= "#{ENV["HOME"]}/.social-snippet"
|
39
|
+
fields[:sspm_host] ||= "sspm.herokuapp.com"
|
40
|
+
fields[:sspm_version] ||= "v0"
|
41
|
+
fields[:sspm_protocol] ||= "https"
|
42
|
+
|
43
|
+
FIELDS.each do |field_name|
|
44
|
+
key = "@#{field_name.to_s}".to_sym
|
45
|
+
instance_variable_set key, fields[field_name]
|
46
|
+
end
|
47
|
+
|
48
|
+
init_directories
|
49
|
+
end
|
50
|
+
|
51
|
+
def repository_cache_path
|
52
|
+
::File.join home, "repo_cache"
|
53
|
+
end
|
54
|
+
|
55
|
+
def installed_repos_file
|
56
|
+
::File.join home, "installed_repos.yml"
|
57
|
+
end
|
58
|
+
|
59
|
+
def install_path
|
60
|
+
::File.join home, "repo"
|
61
|
+
end
|
62
|
+
|
63
|
+
def init_directories
|
64
|
+
::FileUtils.mkdir_p home
|
65
|
+
::FileUtils.mkdir_p install_path
|
66
|
+
::FileUtils.mkdir_p repository_cache_path
|
67
|
+
end
|
68
|
+
|
69
|
+
def debug?
|
70
|
+
debug
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
|
75
|
+
def load_environment_variables(fields)
|
76
|
+
FIELDS.each do |field_sym|
|
77
|
+
fields[field_sym] ||= load_env(field_sym)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def load_env(sym)
|
82
|
+
name = sym.to_s.upcase # :foo_bar => FOO_BAR
|
83
|
+
key = "#{ENV_PREFIX}#{name}"
|
84
|
+
return nil unless ENV.has_key?(key) && (not ENV[key].nil?)
|
85
|
+
if FLAGS.include?(sym)
|
86
|
+
ENV[key] === "true"
|
87
|
+
else
|
88
|
+
ENV[key]
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
class SocialSnippet::Context
|
2
|
+
|
3
|
+
attr_reader :flag_absolute
|
4
|
+
attr_reader :path
|
5
|
+
attr_reader :repo
|
6
|
+
attr_reader :ref
|
7
|
+
|
8
|
+
# Constructor
|
9
|
+
#
|
10
|
+
# @param new_path [String] The path of context
|
11
|
+
def initialize(new_path, new_repo = nil, new_ref = nil)
|
12
|
+
@flag_absolute = is_absolute_path(new_path)
|
13
|
+
@path = new_path
|
14
|
+
@repo = new_repo
|
15
|
+
@ref = new_ref
|
16
|
+
end
|
17
|
+
|
18
|
+
# Check context in repo
|
19
|
+
#
|
20
|
+
# @return [Boolean]
|
21
|
+
def is_in_repository?
|
22
|
+
repo.nil? === false
|
23
|
+
end
|
24
|
+
|
25
|
+
# Move to new path from current path
|
26
|
+
#
|
27
|
+
# @param new_path [String] The next path
|
28
|
+
# @param new_repo [String] The next repository
|
29
|
+
# @param new_ref [String] The next reference
|
30
|
+
def move(new_path, new_repo = nil, new_ref = nil)
|
31
|
+
if new_repo.nil?
|
32
|
+
if is_absolute_path(new_path)
|
33
|
+
@flag_absolute = true
|
34
|
+
@path = new_path
|
35
|
+
else
|
36
|
+
@path = move_func(new_path)
|
37
|
+
end
|
38
|
+
else
|
39
|
+
@flag_absolute = false
|
40
|
+
@path = new_path
|
41
|
+
@repo = new_repo
|
42
|
+
@ref = new_ref
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
private
|
47
|
+
|
48
|
+
def move_func(new_path)
|
49
|
+
source = path.split("/")
|
50
|
+
source_file = source.pop
|
51
|
+
dest = new_path.split("/")
|
52
|
+
dest_file = dest.pop
|
53
|
+
|
54
|
+
if is_absolute_path(path)
|
55
|
+
source.shift
|
56
|
+
end
|
57
|
+
|
58
|
+
dest.each do |x|
|
59
|
+
if is_dotdot(x)
|
60
|
+
source.pop
|
61
|
+
elsif ! is_dot(x)
|
62
|
+
source.push x
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
if flag_absolute
|
67
|
+
"/" + source.join("/") + "/" + dest_file
|
68
|
+
else
|
69
|
+
source.join("/") + "/" + dest_file
|
70
|
+
end
|
71
|
+
end
|
72
|
+
|
73
|
+
private
|
74
|
+
# Check given text is absolute path
|
75
|
+
def is_absolute_path(s)
|
76
|
+
s[0] === "/"
|
77
|
+
end
|
78
|
+
|
79
|
+
# Check given text is `.`
|
80
|
+
def is_dot(s)
|
81
|
+
s === "."
|
82
|
+
end
|
83
|
+
|
84
|
+
# Check given text is `..`
|
85
|
+
def is_dotdot(s)
|
86
|
+
s === ".."
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
require "tsort"
|
2
|
+
|
3
|
+
# Extend Hash tsortable
|
4
|
+
class Hash
|
5
|
+
include TSort
|
6
|
+
alias tsort_each_node each_key
|
7
|
+
def tsort_each_child(node, &block)
|
8
|
+
fetch(node).each(&block)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
class SocialSnippet::Core
|
13
|
+
|
14
|
+
attr_reader :input_stream
|
15
|
+
attr_reader :output_stream
|
16
|
+
attr_reader :repo_manager
|
17
|
+
attr_reader :config
|
18
|
+
attr_reader :registry_client
|
19
|
+
attr_reader :logger
|
20
|
+
attr_reader :api
|
21
|
+
|
22
|
+
# Constructor
|
23
|
+
def initialize(new_input_stream = STDIN, new_output_stream = STDOUT)
|
24
|
+
@input_stream = new_input_stream
|
25
|
+
@output_stream = new_output_stream
|
26
|
+
@config = ::SocialSnippet::Config.new(self)
|
27
|
+
@logger = ::SocialSnippet::Logger.new output_stream
|
28
|
+
init_logger
|
29
|
+
|
30
|
+
@repo_manager = ::SocialSnippet::Repository::RepositoryManager.new(self)
|
31
|
+
@registry_client = ::SocialSnippet::Registry::RegistryClient.new(self)
|
32
|
+
@api = ::SocialSnippet::Api.new(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def init_logger
|
36
|
+
logger.level = ::SocialSnippet::Logger::Severity::INFO
|
37
|
+
logger.level = ::SocialSnippet::Logger::Severity::DEBUG if config.debug?
|
38
|
+
end
|
39
|
+
|
40
|
+
end # SocialSnippet
|
@@ -0,0 +1,64 @@
|
|
1
|
+
class SocialSnippet::Inserter
|
2
|
+
|
3
|
+
attr_reader :src_index
|
4
|
+
attr_reader :dest_index
|
5
|
+
attr_reader :src
|
6
|
+
attr_reader :dest
|
7
|
+
|
8
|
+
# Constructor
|
9
|
+
#
|
10
|
+
# @param src [Array<String>] The source code
|
11
|
+
def initialize(src)
|
12
|
+
@src_index = 0
|
13
|
+
@dest_index = -1
|
14
|
+
@src = src.clone.freeze
|
15
|
+
@dest = []
|
16
|
+
end
|
17
|
+
|
18
|
+
# Set index
|
19
|
+
#
|
20
|
+
# @param new_index [Number] The next index
|
21
|
+
def set_index(new_index)
|
22
|
+
if new_index > src.length
|
23
|
+
raise "invalid index"
|
24
|
+
end
|
25
|
+
if new_index > src_index
|
26
|
+
last_index = [new_index - 1, src.length - 1].min
|
27
|
+
insert src[src_index .. last_index]
|
28
|
+
@src_index = new_index
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Set index to last
|
33
|
+
def set_index_last
|
34
|
+
set_index src.length
|
35
|
+
end
|
36
|
+
|
37
|
+
# Ignore current line
|
38
|
+
def ignore
|
39
|
+
@src_index += 1
|
40
|
+
end
|
41
|
+
|
42
|
+
# Insert text
|
43
|
+
#
|
44
|
+
# @param line_or_lines [String or Array<String>] The inserted text
|
45
|
+
def insert(line_or_lines)
|
46
|
+
if line_or_lines.is_a?(Array)
|
47
|
+
lines = line_or_lines
|
48
|
+
dest.insert dest_index + 1, *lines
|
49
|
+
@dest_index += lines.length
|
50
|
+
else
|
51
|
+
line = line_or_lines
|
52
|
+
dest.insert dest_index + 1, line
|
53
|
+
@dest_index += 1
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
# Get text
|
58
|
+
#
|
59
|
+
# @return [String]
|
60
|
+
def to_s
|
61
|
+
dest.join("\n")
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
module SocialSnippet::Registry
|
2
|
+
|
3
|
+
class RegistryClient
|
4
|
+
|
5
|
+
attr_reader :social_snippet
|
6
|
+
attr_reader :repositories
|
7
|
+
|
8
|
+
def initialize(new_social_snippet)
|
9
|
+
@social_snippet = new_social_snippet
|
10
|
+
@repositories = RegistryResources::Repositories.new(social_snippet)
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|