social_snippet 0.0.1 → 0.0.2
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 +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,198 @@
|
|
1
|
+
class SocialSnippet::Tag
|
2
|
+
|
3
|
+
attr_reader :path
|
4
|
+
attr_reader :repo
|
5
|
+
attr_reader :ref
|
6
|
+
attr_reader :prefix
|
7
|
+
attr_reader :suffix
|
8
|
+
attr_reader :spaces
|
9
|
+
|
10
|
+
# Create instance
|
11
|
+
#
|
12
|
+
# @param s [String] tag line text
|
13
|
+
def initialize(s)
|
14
|
+
@path = SocialSnippet::Tag.get_path(s)
|
15
|
+
@repo = SocialSnippet::Tag.get_repo(s)
|
16
|
+
@ref = SocialSnippet::Tag.get_ref(s)
|
17
|
+
@prefix = SocialSnippet::Tag.get_prefix(s)
|
18
|
+
@suffix = SocialSnippet::Tag.get_suffix(s)
|
19
|
+
@spaces = SocialSnippet::Tag.get_spaces(s)
|
20
|
+
|
21
|
+
# to normalize repo's path
|
22
|
+
set_path SocialSnippet::Tag.get_path(s)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Set information by another tag
|
26
|
+
def set_by_tag(base_tag)
|
27
|
+
return self if base_tag.nil?
|
28
|
+
@prefix = base_tag.prefix
|
29
|
+
@suffix = base_tag.suffix
|
30
|
+
@spaces = base_tag.spaces
|
31
|
+
self
|
32
|
+
end
|
33
|
+
|
34
|
+
# Set path
|
35
|
+
def set_path(new_path)
|
36
|
+
@path = normalize_path(new_path)
|
37
|
+
end
|
38
|
+
|
39
|
+
def normalize_path(path)
|
40
|
+
# repo:/path/to/file -> repo:path/to/file
|
41
|
+
path[0] = "" if has_repo? && path[0] == "/"
|
42
|
+
|
43
|
+
path
|
44
|
+
end
|
45
|
+
|
46
|
+
# Set repo
|
47
|
+
def set_repo(new_repo)
|
48
|
+
@repo = new_repo
|
49
|
+
end
|
50
|
+
|
51
|
+
# Set ref
|
52
|
+
def set_ref(new_ref)
|
53
|
+
@ref = new_ref
|
54
|
+
end
|
55
|
+
|
56
|
+
# Check to have ref
|
57
|
+
def has_ref?
|
58
|
+
return ref.nil? === false && ref != ""
|
59
|
+
end
|
60
|
+
|
61
|
+
# Check to have repository
|
62
|
+
def has_repo?
|
63
|
+
return repo != ""
|
64
|
+
end
|
65
|
+
|
66
|
+
# Get path text
|
67
|
+
def to_path
|
68
|
+
if has_repo?
|
69
|
+
if has_ref?
|
70
|
+
"#{repo}##{ref}:#{path}"
|
71
|
+
else
|
72
|
+
"#{repo}:#{path}"
|
73
|
+
end
|
74
|
+
else
|
75
|
+
"#{path}"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
# Get tag text by given tag text
|
80
|
+
def to_tag_text(tag_text)
|
81
|
+
"#{prefix}#{tag_text}#{spaces}<#{to_path}>#{suffix}"
|
82
|
+
end
|
83
|
+
|
84
|
+
# Get @snip tag text
|
85
|
+
def to_snip_tag
|
86
|
+
return to_tag_text("@snip")
|
87
|
+
end
|
88
|
+
|
89
|
+
# Get @snippet tag text
|
90
|
+
def to_snippet_tag
|
91
|
+
return to_tag_text("@snippet")
|
92
|
+
end
|
93
|
+
|
94
|
+
class << self
|
95
|
+
|
96
|
+
# Check given line to match @snip tag
|
97
|
+
def is_snip_tag_line(s)
|
98
|
+
return /@snip\s*<.*?>/ === s
|
99
|
+
end
|
100
|
+
|
101
|
+
# Check given line to match @snippet tag
|
102
|
+
def is_snippet_tag_line(s)
|
103
|
+
return /@snippet\s*<.*?>/ === s
|
104
|
+
end
|
105
|
+
|
106
|
+
# Check given line to match @snip or @snippet tag
|
107
|
+
def is_snip_or_snippet_tag_line(s)
|
108
|
+
return is_snip_tag_line(s) || is_snippet_tag_line(s)
|
109
|
+
end
|
110
|
+
|
111
|
+
# Check given line to have `#` character
|
112
|
+
def has_ref_text(s)
|
113
|
+
return /<.*?#(.*?):/ === s
|
114
|
+
end
|
115
|
+
|
116
|
+
# Check given line to match `:` character
|
117
|
+
def has_colon(s)
|
118
|
+
return /:/ === s
|
119
|
+
end
|
120
|
+
|
121
|
+
# Check given line to match snippet tag with repo
|
122
|
+
def is_tag_line_with_repository(s)
|
123
|
+
return is_snip_or_snippet_tag_line(s) && has_colon(s)
|
124
|
+
end
|
125
|
+
|
126
|
+
def is_tag_line_with_repository_have_ref(s)
|
127
|
+
return is_tag_line_with_repository(s) && has_ref_text(s)
|
128
|
+
end
|
129
|
+
|
130
|
+
# Get spaces from given line
|
131
|
+
def get_spaces(s)
|
132
|
+
if is_snip_or_snippet_tag_line(s)
|
133
|
+
# return spaces
|
134
|
+
return /(@snip|@snippet)(\s*?)</.match(s)[2]
|
135
|
+
end
|
136
|
+
|
137
|
+
# return empty string
|
138
|
+
return ""
|
139
|
+
end
|
140
|
+
|
141
|
+
# Get suffix from given line
|
142
|
+
def get_suffix(s)
|
143
|
+
if is_snip_or_snippet_tag_line(s)
|
144
|
+
# return suffix text
|
145
|
+
return />(.*)/.match(s)[1]
|
146
|
+
end
|
147
|
+
|
148
|
+
# return empty string
|
149
|
+
return ""
|
150
|
+
end
|
151
|
+
|
152
|
+
# Get prefix from given line
|
153
|
+
def get_prefix(s)
|
154
|
+
if is_snip_or_snippet_tag_line(s)
|
155
|
+
# return prefix text
|
156
|
+
return /(.*?)@/.match(s)[1]
|
157
|
+
end
|
158
|
+
|
159
|
+
# return empty string
|
160
|
+
return ""
|
161
|
+
end
|
162
|
+
|
163
|
+
# Get path from given line
|
164
|
+
def get_path(s)
|
165
|
+
if is_snip_or_snippet_tag_line(s)
|
166
|
+
# return snippet path (without repo name)
|
167
|
+
path = ::Pathname.new(/<(.*?:)?(.*?)>/.match(s)[2])
|
168
|
+
return path.cleanpath.to_s
|
169
|
+
end
|
170
|
+
|
171
|
+
# return empty string
|
172
|
+
return ""
|
173
|
+
end
|
174
|
+
|
175
|
+
# Get repo's ref from given line
|
176
|
+
def get_ref(s)
|
177
|
+
if is_tag_line_with_repository_have_ref(s)
|
178
|
+
# return ref text
|
179
|
+
return /<.+?#(.*?):/.match(s)[1]
|
180
|
+
end
|
181
|
+
|
182
|
+
return ""
|
183
|
+
end
|
184
|
+
|
185
|
+
# Get repository name from given line
|
186
|
+
def get_repo(s)
|
187
|
+
if is_tag_line_with_repository(s)
|
188
|
+
# return repository name
|
189
|
+
return /<(.*?)[:#]/.match(s)[1]
|
190
|
+
end
|
191
|
+
|
192
|
+
# return empty string
|
193
|
+
return ""
|
194
|
+
end
|
195
|
+
|
196
|
+
end
|
197
|
+
|
198
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class SocialSnippet::TagParser
|
2
|
+
|
3
|
+
class << self
|
4
|
+
|
5
|
+
# Find `@snip` tags from text
|
6
|
+
#
|
7
|
+
# @param s [String or Array] parsed text
|
8
|
+
# @return [Array] found `@snip` tags with line_no
|
9
|
+
def find_snip_tags(s)
|
10
|
+
found_lines = []
|
11
|
+
|
12
|
+
lines = get_lines(s)
|
13
|
+
|
14
|
+
lines.each.with_index do |line, i|
|
15
|
+
if ::SocialSnippet::Tag.is_snip_tag_line(line)
|
16
|
+
found_lines.push(
|
17
|
+
{
|
18
|
+
:line_no => i,
|
19
|
+
:tag => ::SocialSnippet::Tag.new(line),
|
20
|
+
}
|
21
|
+
)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
return found_lines
|
26
|
+
end
|
27
|
+
|
28
|
+
# Find `@snippet` tags from text
|
29
|
+
#
|
30
|
+
# @param s [String or Array] parsed text
|
31
|
+
# @return [Array] found `@snippet` tags with line_no
|
32
|
+
def find_snippet_tags(s)
|
33
|
+
found_lines = []
|
34
|
+
|
35
|
+
lines = get_lines(s)
|
36
|
+
|
37
|
+
lines.each.with_index do |line, i|
|
38
|
+
if ::SocialSnippet::Tag.is_snippet_tag_line(line)
|
39
|
+
found_lines.push(
|
40
|
+
{
|
41
|
+
:line_no => i,
|
42
|
+
:tag => ::SocialSnippet::Tag.new(line),
|
43
|
+
}
|
44
|
+
)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
return found_lines
|
49
|
+
end
|
50
|
+
|
51
|
+
def get_lines(s)
|
52
|
+
if s.is_a?(String)
|
53
|
+
return s.split("\n")
|
54
|
+
elsif s.is_a?(Array)
|
55
|
+
return s
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
@@ -1,3 +1,28 @@
|
|
1
1
|
module SocialSnippet
|
2
|
-
|
2
|
+
|
3
|
+
VERSION = "0.0.2"
|
4
|
+
|
5
|
+
module Version
|
6
|
+
|
7
|
+
class << self
|
8
|
+
|
9
|
+
# Check given text matches version pattern
|
10
|
+
def is_matched_version_pattern(pattern, version)
|
11
|
+
return true if pattern == "" || pattern.nil?
|
12
|
+
return true if pattern == version
|
13
|
+
|
14
|
+
# "2.1.0" and "2.1.1" match "2.1"
|
15
|
+
# "2.11.0" and "2.11.1" do not match "2.1"
|
16
|
+
return version.start_with?("#{pattern}.")
|
17
|
+
end
|
18
|
+
|
19
|
+
# Check given text is version string
|
20
|
+
def is_version(s)
|
21
|
+
return /^([0]|[1-9][0-9]*)\.([0]|[1-9][0-9]*)\.([0]|[1-9][0-9]*)$/ === s
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
3
28
|
end
|
data/social_snippet.gemspec
CHANGED
@@ -8,7 +8,7 @@ Gem::Specification.new do |spec|
|
|
8
8
|
spec.version = SocialSnippet::VERSION
|
9
9
|
spec.authors = ["Hiroyuki Sano"]
|
10
10
|
spec.email = ["sh19910711@gmail.com"]
|
11
|
-
spec.summary = %q{
|
11
|
+
spec.summary = %q{Share and use snippet libraries for the online judges}
|
12
12
|
spec.homepage = "https://github.com/social-snippet/social-snippet"
|
13
13
|
spec.license = "MIT"
|
14
14
|
|
@@ -17,7 +17,22 @@ Gem::Specification.new do |spec|
|
|
17
17
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
|
-
spec.
|
21
|
-
spec.
|
20
|
+
spec.add_runtime_dependency "bundler"
|
21
|
+
spec.add_runtime_dependency "rake"
|
22
|
+
spec.add_runtime_dependency "version_sorter"
|
23
|
+
spec.add_runtime_dependency "rugged"
|
24
|
+
spec.add_runtime_dependency "rest-client"
|
25
|
+
|
26
|
+
spec.add_development_dependency "yard"
|
27
|
+
spec.add_development_dependency "pry"
|
28
|
+
spec.add_development_dependency "guard"
|
29
|
+
spec.add_development_dependency "guard-shell"
|
30
|
+
spec.add_development_dependency "pry-byebug"
|
31
|
+
|
22
32
|
spec.add_development_dependency "rspec"
|
33
|
+
spec.add_development_dependency "fakefs"
|
34
|
+
spec.add_development_dependency "webmock"
|
35
|
+
spec.add_development_dependency "codeclimate-test-reporter"
|
36
|
+
|
37
|
+
|
23
38
|
end
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
module SocialSnippet
|
4
|
+
|
5
|
+
describe Api do
|
6
|
+
|
7
|
+
describe "#insert_snippet()", :without_fakefs => true do
|
8
|
+
|
9
|
+
let(:example_repo_info) do
|
10
|
+
{
|
11
|
+
"name" => "example-repo",
|
12
|
+
"desc" => "This is my repository.",
|
13
|
+
"url" => "https://github.com/social-snippet/example-repo",
|
14
|
+
"dependencies" => {
|
15
|
+
},
|
16
|
+
}
|
17
|
+
end # example_repo_info
|
18
|
+
|
19
|
+
before do
|
20
|
+
WebMock
|
21
|
+
.stub_request(
|
22
|
+
:get,
|
23
|
+
"https://api.server/api/v0/repositories/example-repo",
|
24
|
+
)
|
25
|
+
.to_return(
|
26
|
+
:status => 200,
|
27
|
+
:body => example_repo_info.to_json,
|
28
|
+
:headers => {
|
29
|
+
"Content-Type" => "application/json",
|
30
|
+
},
|
31
|
+
)
|
32
|
+
end # GET /repositories/my-repo
|
33
|
+
|
34
|
+
context "$ sspm install example-repo" do
|
35
|
+
|
36
|
+
let(:install_command) { CommandLine::SSpm::SubCommands::InstallCommand.new ["example-repo"] }
|
37
|
+
let(:install_command_output) { ::StringIO.new }
|
38
|
+
let(:install_command_logger) { ::SocialSnippet::Logger.new install_command_output }
|
39
|
+
|
40
|
+
before do
|
41
|
+
allow(fake_social_snippet).to receive(:logger).and_return install_command_logger
|
42
|
+
install_command.init
|
43
|
+
install_command.run
|
44
|
+
expect(install_command_output.string).to match /Success/
|
45
|
+
end # install example-repo
|
46
|
+
|
47
|
+
context "create instance" do
|
48
|
+
|
49
|
+
let(:string_io) { ::StringIO.new }
|
50
|
+
let(:string_logger) { ::SocialSnippet::Logger.new(string_io) }
|
51
|
+
before { allow(fake_social_snippet).to receive(:logger).and_return string_logger }
|
52
|
+
|
53
|
+
#
|
54
|
+
# tests from here
|
55
|
+
#
|
56
|
+
|
57
|
+
context "$ ssnip / without snip" do
|
58
|
+
|
59
|
+
let(:input) do
|
60
|
+
[
|
61
|
+
'hello',
|
62
|
+
'world',
|
63
|
+
].join($/)
|
64
|
+
end
|
65
|
+
|
66
|
+
let(:expected) do
|
67
|
+
[
|
68
|
+
'hello',
|
69
|
+
'world',
|
70
|
+
].join($/) + $/
|
71
|
+
end
|
72
|
+
|
73
|
+
before { fake_social_snippet.api.insert_snippet input }
|
74
|
+
it { expect(string_io.string).to eq expected }
|
75
|
+
|
76
|
+
end # $ ssnip / without snip
|
77
|
+
|
78
|
+
context "$ ssnip / with a snip tag" do
|
79
|
+
|
80
|
+
let(:input) do
|
81
|
+
[
|
82
|
+
'// @snip <example-repo:func.cpp>'
|
83
|
+
].join($/)
|
84
|
+
end
|
85
|
+
|
86
|
+
before { fake_social_snippet.api.insert_snippet input }
|
87
|
+
|
88
|
+
# last update: 2014-10-28
|
89
|
+
it { expect(string_io.string).to match(/@snippet/) }
|
90
|
+
it { expect(string_io.string).to match(/example-repo#.*:func\.cpp/) }
|
91
|
+
it { expect(string_io.string).to match(/example-repo#.*:func\/sub_func_1\.cpp/) }
|
92
|
+
it { expect(string_io.string).to match(/example-repo#.*:func\/sub_func_2\.cpp/) }
|
93
|
+
it { expect(string_io.string).to match(/example-repo#.*:func\/sub_func_3\.cpp/) }
|
94
|
+
|
95
|
+
end # $ ssnip / with a snip tag
|
96
|
+
|
97
|
+
end # create instance
|
98
|
+
|
99
|
+
end # $ sspm install example-repo
|
100
|
+
|
101
|
+
end # insert_snippet()
|
102
|
+
|
103
|
+
end # Api
|
104
|
+
|
105
|
+
end # SocialSnippet::CommandLine
|
106
|
+
|