social_snippet 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- MDgwZmJhNmU0MDJmMjExOTVjZTM3ZmI4Y2EyMDNjN2ZmOWQ2MzI5Yg==
4
+ ZjdkNTQyNTZmNWMzYmFmOWM0MGU1NDhjOTRlNjIxMGNmNGNkYTU5YQ==
5
5
  data.tar.gz: !binary |-
6
- ZGQ5Mjk5MzFiZmM0ZWM1OTJmMjdlNjMyMTcyNmQxNmRmZWM0NTE1Yg==
6
+ YjQ3MDAwNWI3MDliOWFjNjY0YjA3MTdmODYyNmQ1MDk0NjEzNGY2NA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- NmUzZjQ0MWEwZWE0ZmYxNDlhMDJlYWY0NDhjNjA4NzdmZTUzY2FhYjA3MWMz
10
- MGRiNzdhNTNkZjZiZWRjZTlkYTM4OWYwODQ2ZWIzYTg3NTNiNTI3NTYxNmUw
11
- Y2I1ZTIwMWRjYzRmOGRkOTYzN2IyNmI4MGRlNzZmNzdiNzVmYmQ=
9
+ YTQxZGJmOGQwNDYzNjUwN2E3ZjM5ODI4NWFlNDMxNDFkZTJlYzBhMzkzZjkw
10
+ MzE3NzBjMzk3MjYxMTgyZGQxMTRjMzFlN2Y1MjFhMjMyMTI0MmU4Yjg1NDJj
11
+ YjY4NWYzZjY0NDM3NzE5YjViMmExNjY3YTg4MTI2ZmRkZjVkZjQ=
12
12
  data.tar.gz: !binary |-
13
- OWQyMTk2NTAxMzRhODYyYWViZTY5OTBhMjkyNzU0NjNhNTIzOGQyYzJiOGZj
14
- ZTFhM2EwMTA1NjJkZjA0MGRhZWE4Yjk5YWYxOTRkNjVkOTgwM2VjZWZmNGVm
15
- OTZlZDMxYzk1MDEwODYzZDUxNmMzNzA1YjM2YzU4ZTE3MDJiNDM=
13
+ ZWMwZjM4NGQ2MWIwMmYzOGNjMTQ5NzVjNTNlZjg4NWUyNDJkMmEyYzEyMmIy
14
+ NzE5M2FhOTkwNDFiODU3YTNlMmQ3NDBiNmRmMzMxZWIzYTNkODFkYTkzMDdj
15
+ MTU4ZjRmNjAzZDc1OTY3MmViMmIxYTA5ZGRhZTQ5NWRlYmU2NGU=
data/.travis.yml CHANGED
@@ -23,6 +23,9 @@ deploy:
23
23
  secure: "hlC3/Vsqpw3RdA0g8nAuusXEpGiwLtndGQVd8eg8x7yCoubFmsruwJG2Cci4QF2aIVGovFzrrmlxPb204nndsmBCzTLZEnn2dsCqOt8TZDAyFRZf6xeZ53eT7AjOJvFIafS4YLQ975upzsQ/cW4OgWFRaqhHgckTUSapa7Dyeao="
24
24
  gem:
25
25
  master: social_snippet
26
+ on:
27
+ repo: social-snippet/social-snippet
28
+ ruby: "2.2"
26
29
 
27
30
  cache:
28
31
  bundler: true
data/Gemfile CHANGED
@@ -1,27 +1,2 @@
1
1
  source 'https://rubygems.org'
2
-
3
- gem "bundler"
4
- gem "rake"
5
- gem "version_sorter"
6
- gem "rugged"
7
- gem "rest-client"
8
-
9
- group :development do
10
- gem "yard", :require => false
11
- gem "pry", :require => false
12
- gem "guard", :require => false
13
- gem "guard-shell", :require => false
14
- end
15
-
16
- group :test do
17
- gem "rspec", :require => false
18
- gem "fakefs", :require => false
19
- gem "webmock", :require => false
20
- gem "simplecov", :require => false
21
- gem "codeclimate-test-reporter", :require => false
22
- end
23
-
24
- # should be disabled on travis-ci
25
- group :debug do
26
- gem "pry-byebug", :require => false
27
- end
2
+ gemspec
data/README.md CHANGED
@@ -4,6 +4,7 @@
4
4
  [![Build Status](https://img.shields.io/travis/social-snippet/social-snippet.svg)](https://travis-ci.org/social-snippet/social-snippet)
5
5
  [![Code Climate](https://img.shields.io/codeclimate/github/social-snippet/social-snippet.svg)](https://codeclimate.com/github/social-snippet/social-snippet)
6
6
  [![Test Coverage](https://img.shields.io/codeclimate/coverage/github/social-snippet/social-snippet.svg)](https://codeclimate.com/github/social-snippet/social-snippet)
7
+ [![API Doc](http://img.shields.io/badge/RubyDocs-API-green.svg)](http://www.rubydoc.info/github/social-snippet/social-snippet)
7
8
 
8
9
  TODO: Write a gem description
9
10
 
@@ -14,3 +14,4 @@ require_relative "social_snippet/registry"
14
14
  require_relative "social_snippet/command_line"
15
15
  require_relative "social_snippet/logger"
16
16
  require_relative "social_snippet/api"
17
+ require_relative "social_snippet/tsortable_hash"
@@ -9,25 +9,55 @@ class SocialSnippet::Api
9
9
  @social_snippet = new_social_snippet
10
10
  end
11
11
 
12
+ # $ sspm config key=value
12
13
  def config_set(key, value)
13
14
  social_snippet.config.set! key, value
14
15
  end
15
16
 
17
+ # $ sspm config key
16
18
  def config_get(key)
17
19
  value = social_snippet.config.get(key)
18
20
  social_snippet.logger.say "#{key}=#{value}"
19
21
  end
20
22
 
21
- # Insert snippets to given text
23
+ # Initialize the snippet.json interactively.
24
+ # $ sspm init
25
+ def init_manifest(options = {})
26
+ answer = {}
27
+ json_str = "{}"
28
+
29
+ # load current configuration
30
+ if ::File.exists?("snippet.json")
31
+ answer = ::JSON.parse(::File.read "snippet.json")
32
+ end
33
+
34
+ loop do
35
+ answer = ask_manifest_questions(manifest_questions(answer), answer)
36
+ json_str = ::JSON.pretty_generate(answer)
37
+ social_snippet.logger.say ""
38
+ social_snippet.logger.say json_str
39
+ social_snippet.logger.say ""
40
+ break if ask_confirm("Is this okay? [Y/N]: ")
41
+ end
42
+
43
+ ::File.write "snippet.json", json_str
44
+
45
+ answer
46
+ end
47
+
48
+ # Insert snippets to given text.
49
+ # $ ssnip
22
50
  #
23
51
  # @param src [String] The text of source code
24
- def insert_snippet(src)
25
- resolver = ::SocialSnippet::Resolvers::InsertResolver.new(social_snippet)
52
+ #
53
+ def insert_snippet(src, options = {})
54
+ resolver = ::SocialSnippet::Resolvers::InsertResolver.new(social_snippet, options)
26
55
  res = resolver.insert(src)
27
56
  output res
28
57
  res
29
58
  end
30
59
 
60
+ # $ sspm install name
31
61
  def install_repository_by_name(repo_name, repo_ref, options = {})
32
62
  installed_as = repo_name
33
63
  installed_as = options[:name] unless options[:name].nil?
@@ -51,12 +81,14 @@ class SocialSnippet::Api
51
81
  install_repository installed_as, repo_ref, repo
52
82
  end
53
83
 
84
+ # $ sspm install URL
54
85
  def install_repository_by_url(repo_url, repo_ref, options = {})
55
86
  output "Cloning repository..."
56
87
  repo = ::SocialSnippet::Repository::RepositoryFactory.clone(repo_url)
57
88
  install_repository_by_repo repo, repo_ref, options
58
89
  end
59
90
 
91
+ # $ sspm install ./path/to/repo
60
92
  def install_repository_by_path(repo_path, repo_ref, options = {})
61
93
  output "Cloning repository..."
62
94
  repo = ::SocialSnippet::Repository::RepositoryFactory.clone_local(repo_path)
@@ -76,39 +108,8 @@ class SocialSnippet::Api
76
108
  install_repository installed_as, repo_ref, repo
77
109
  end
78
110
 
79
- # Install repository
80
- #
81
- # @param repo [::SocialSnippet::Repository::Drivers::BaseRepository]
82
- def install_repository(repo_name, repo_ref, repo, options = {})
83
- display_name = repo_name
84
-
85
- if repo_ref.nil?
86
- repo_ref = resolve_reference(repo)
87
-
88
- if repo.has_versions?
89
- output "Resolving #{display_name}'s version"
90
- else
91
- output "No versions, use current reference"
92
- end
93
- end
94
-
95
- display_name = "#{repo_name}\##{repo_ref}"
96
-
97
- output "Installing: #{display_name}"
98
- unless options[:dry_run]
99
- social_snippet.repo_manager.install repo_name, repo_ref, repo, options
100
- end
101
-
102
- output "Success: #{display_name}"
103
-
104
- # install dependencies
105
- if has_dependencies?(repo)
106
- output "Finding #{display_name}'s dependencies"
107
- install_missing_dependencies repo.dependencies, options
108
- output "Finish finding #{display_name}'s dependencies"
109
- end
110
- end
111
-
111
+ # Update a repository
112
+ # $ sspm update repo-name
112
113
  def update_repository(repo_name, options = {})
113
114
  unless social_snippet.repo_manager.exists?(repo_name)
114
115
  output "ERROR: #{repo_name} is not installed"
@@ -150,6 +151,8 @@ class SocialSnippet::Api
150
151
  end
151
152
  end
152
153
 
154
+ # Update all installed repositories
155
+ # $ sspm update
153
156
  def update_all_repositories(options = {})
154
157
  social_snippet.repo_manager.each_installed_repo do |repo_name|
155
158
  update_repository repo_name, options
@@ -171,6 +174,7 @@ class SocialSnippet::Api
171
174
  output ::JSON.pretty_generate(repo_info)
172
175
  end
173
176
 
177
+ # $ sspm search query
174
178
  def search_repositories(query, options = {})
175
179
  format_text = search_result_format(options)
176
180
  social_snippet.registry_client.repositories.search(query).each do |repo|
@@ -189,6 +193,86 @@ class SocialSnippet::Api
189
193
 
190
194
  private
191
195
 
196
+ # Install repository
197
+ #
198
+ # @param repo [::SocialSnippet::Repository::Drivers::BaseRepository]
199
+ def install_repository(repo_name, repo_ref, repo, options = {})
200
+ display_name = repo_name
201
+
202
+ if repo_ref.nil?
203
+ repo_ref = resolve_reference(repo)
204
+
205
+ if repo.has_versions?
206
+ output "Resolving #{display_name}'s version"
207
+ else
208
+ output "No versions, use current reference"
209
+ end
210
+ end
211
+
212
+ display_name = "#{repo_name}\##{repo_ref}"
213
+
214
+ output "Installing: #{display_name}"
215
+ unless options[:dry_run]
216
+ social_snippet.repo_manager.install repo_name, repo_ref, repo, options
217
+ end
218
+
219
+ output "Success: #{display_name}"
220
+
221
+ # install dependencies
222
+ if has_dependencies?(repo)
223
+ output "Finding #{display_name}'s dependencies"
224
+ install_missing_dependencies repo.dependencies, options
225
+ output "Finish finding #{display_name}'s dependencies"
226
+ end
227
+ end
228
+
229
+ def ask_confirm(message)
230
+ ret = social_snippet.prompt.ask(message) do |q|
231
+ q.limit = 1
232
+ q.validate = /^[yn]$/i
233
+ end
234
+ /y/i === ret
235
+ end
236
+
237
+ def ask_manifest_questions(questions, obj)
238
+ questions.inject(obj) do |obj, q|
239
+ obj[q[:key]] = ask_manifest_question(q)
240
+ obj
241
+ end
242
+ end
243
+
244
+ def ask_manifest_question(question)
245
+ if question[:type] === :string
246
+ social_snippet.prompt.ask("#{question[:key]}: ") do |q|
247
+ q.default = question[:default]
248
+ if question[:validate].is_a?(Regexp)
249
+ q.validate = question[:validate]
250
+ end
251
+ end
252
+ end
253
+ end
254
+
255
+ def manifest_questions(answer)
256
+ [
257
+ {
258
+ :key => "name",
259
+ :type => :string,
260
+ :validate => /[a-zA-Z0-9\.\-_]+/,
261
+ :default => answer["name"],
262
+ },
263
+ {
264
+ :key => "description",
265
+ :type => :string,
266
+ :default => answer["description"],
267
+ },
268
+ {
269
+ :key => "license",
270
+ :default => answer["license"] || "MIT",
271
+ :type => :string,
272
+ },
273
+ ]
274
+ end
275
+
192
276
  def resolve_reference(repo)
193
277
  if repo.has_versions?
194
278
  repo.latest_version
@@ -40,7 +40,7 @@ EOF
40
40
  }
41
41
  end.map do |sub_command|
42
42
  " #{to_command_name(sub_command[:sym])}\t#{sub_command[:instance].desc}"
43
- end.join("\n")
43
+ end.join($/)
44
44
  end
45
45
 
46
46
  def find_subcommand(command_name)
@@ -15,3 +15,4 @@ require_relative "sub_commands/info_command"
15
15
  require_relative "sub_commands/update_command"
16
16
  require_relative "sub_commands/publish_command"
17
17
  require_relative "sub_commands/config_command"
18
+ require_relative "sub_commands/init_command"
@@ -0,0 +1,27 @@
1
+ module SocialSnippet::CommandLine
2
+
3
+ # TODO: $ sspm init --no-prompt
4
+ class SSpm::SubCommands::InitCommand < Command
5
+
6
+ def usage
7
+ <<EOF
8
+ Usage:
9
+ $ sspm init
10
+ -> Generate snippet.json interactively
11
+ EOF
12
+ end
13
+
14
+ def desc
15
+ "Generate snippet.json interactively"
16
+ end
17
+
18
+ def define_options
19
+ end
20
+
21
+ def run
22
+ social_snippet.api.init_manifest options
23
+ end
24
+
25
+ end
26
+
27
+ end
@@ -1,13 +1,4 @@
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
1
+ require "highline"
11
2
 
12
3
  class SocialSnippet::Core
13
4
 
@@ -18,6 +9,7 @@ class SocialSnippet::Core
18
9
  attr_reader :registry_client
19
10
  attr_reader :logger
20
11
  attr_reader :api
12
+ attr_reader :prompt
21
13
 
22
14
  # Constructor
23
15
  def initialize(new_input_stream = STDIN, new_output_stream = STDOUT)
@@ -25,6 +17,7 @@ class SocialSnippet::Core
25
17
  @output_stream = new_output_stream
26
18
  @config = ::SocialSnippet::Config.new(self)
27
19
  @logger = ::SocialSnippet::Logger.new output_stream
20
+ @prompt = ::HighLine.new(input_stream, output_stream)
28
21
  init_logger
29
22
 
30
23
  @repo_manager = ::SocialSnippet::Repository::RepositoryManager.new(self)
@@ -58,7 +58,7 @@ class SocialSnippet::Inserter
58
58
  #
59
59
  # @return [String]
60
60
  def to_s
61
- dest.join("\n")
61
+ dest.join($/)
62
62
  end
63
63
 
64
64
  end
@@ -44,7 +44,7 @@ module SocialSnippet::Repository
44
44
  # @param context [::SocialSnippet::Context] The context of snippet
45
45
  # @param tag [::SocialSnippet::Tag] The tag of snippet
46
46
  def get_snippet(context, tag)
47
- return ::SocialSnippet::Snippet.new(resolve_snippet_path(context, tag))
47
+ ::SocialSnippet::Snippet.new(resolve_snippet_path(context, tag))
48
48
  end
49
49
 
50
50
  # Resolve snippet path from tag
@@ -49,7 +49,7 @@ module SocialSnippet
49
49
  :context => new_context,
50
50
  })
51
51
  # find more deps
52
- found_tags.push *find_func(snippet.lines, new_context, tag)
52
+ found_tags.push *find_func(snippet.lines.to_a, new_context, tag)
53
53
  end
54
54
 
55
55
  return found_tags
@@ -3,13 +3,21 @@ module SocialSnippet
3
3
  class Resolvers::InsertResolver < Resolvers::BaseResolver
4
4
 
5
5
  attr_reader :deps_resolver
6
+ attr_reader :options
6
7
 
7
8
  # Constructor
8
9
  #
9
10
  # @param social_snippet [::SocialSnippet::Core]
10
- def initialize(social_snippet)
11
+ def initialize(social_snippet, new_options = {})
12
+ @options = new_options
11
13
  @deps_resolver = Resolvers::DepResolver.new(social_snippet)
12
14
  super(social_snippet)
15
+ init_options
16
+ end
17
+
18
+ def init_options
19
+ options[:margin_bottom] = options.fetch(:margin_bottom, 0)
20
+ options[:margin_top] = options.fetch(:margin_top, 0)
13
21
  end
14
22
 
15
23
  # Insert snippets to given text
@@ -17,14 +25,14 @@ module SocialSnippet
17
25
  # @param src [Array<String>] The text of source code
18
26
  def insert(src)
19
27
  context = Context.new("")
20
- lines = src.split("\n")
28
+ lines = src.split($/)
21
29
 
22
30
  TagParser.find_snippet_tags(lines).each do |tag_info|
23
31
  visit tag_info[:tag]
24
32
  end
25
33
 
26
34
  dest = insert_func(lines, context)
27
- return dest.join("\n")
35
+ return dest.join($/)
28
36
  end
29
37
 
30
38
  private
@@ -51,15 +59,19 @@ module SocialSnippet
51
59
 
52
60
  # Insert snippet by tag and context
53
61
  def insert_by_tag_and_context!(inserter, snippet, context, tag)
54
- src = insert_func(snippet.lines, context, tag)
62
+ src = insert_func(snippet.lines.to_a, context, tag)
63
+
64
+ options[:margin_top].times { inserter.insert "" }
55
65
  inserter.insert tag.to_snippet_tag # @snip -> @snippet
56
66
  inserter.insert src
67
+ options[:margin_bottom].times { inserter.insert "" }
68
+
57
69
  visit tag
58
70
  end
59
71
 
60
72
  # Insert depended snippet
61
73
  def insert_depended_snippets!(inserter, snippet, context, tag)
62
- dep_tags = deps_resolver.find(snippet.lines, context, tag)
74
+ dep_tags = deps_resolver.find(snippet.lines.to_a, context, tag)
63
75
  dep_tags = sort_dep_tags_by_dep(dep_tags)
64
76
 
65
77
  dep_tags.each do |tag_info|
@@ -85,7 +97,7 @@ module SocialSnippet
85
97
  end
86
98
 
87
99
  # generate dependency graph
88
- dep_tags_hash = {}
100
+ dep_tags_hash = TSortableHash.new
89
101
  dep_tags.each do |tag_info|
90
102
  tag = tag_info[:tag].to_path
91
103
  dep_ind = dep_tags_index[tag]