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,86 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SocialSnippet::Repository
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              require "yaml"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
              class RepositoryInstaller
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                attr_reader :social_snippet
         
     | 
| 
      
 8 
     | 
    
         
            +
                attr_reader :data
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize(new_social_snippet)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @social_snippet = new_social_snippet
         
     | 
| 
      
 12 
     | 
    
         
            +
                  init_data
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                def path
         
     | 
| 
      
 16 
     | 
    
         
            +
                  social_snippet.config.install_path
         
     | 
| 
      
 17 
     | 
    
         
            +
                end
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                def data_file
         
     | 
| 
      
 20 
     | 
    
         
            +
                  social_snippet.config.installed_repos_file
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def init_data
         
     | 
| 
      
 24 
     | 
    
         
            +
                  ::FileUtils.touch data_file
         
     | 
| 
      
 25 
     | 
    
         
            +
                  load
         
     | 
| 
      
 26 
     | 
    
         
            +
                  reset unless data
         
     | 
| 
      
 27 
     | 
    
         
            +
                end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                def reset
         
     | 
| 
      
 30 
     | 
    
         
            +
                  @data = {}
         
     | 
| 
      
 31 
     | 
    
         
            +
                  save
         
     | 
| 
      
 32 
     | 
    
         
            +
                end
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
                def load
         
     | 
| 
      
 35 
     | 
    
         
            +
                  @data = ::YAML.load_file(data_file)
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                def save
         
     | 
| 
      
 39 
     | 
    
         
            +
                  ::File.write data_file, data.to_yaml
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                def add(repo_name, repo_ref)
         
     | 
| 
      
 43 
     | 
    
         
            +
                  data[repo_name] ||= Set.new
         
     | 
| 
      
 44 
     | 
    
         
            +
                  data[repo_name].add repo_ref
         
     | 
| 
      
 45 
     | 
    
         
            +
                  save
         
     | 
| 
      
 46 
     | 
    
         
            +
                end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                def remove(repo_name, repo_ref)
         
     | 
| 
      
 49 
     | 
    
         
            +
                  data[repo_name] ||= Set.new
         
     | 
| 
      
 50 
     | 
    
         
            +
                  data[repo_name].delete repo_ref
         
     | 
| 
      
 51 
     | 
    
         
            +
                  save
         
     | 
| 
      
 52 
     | 
    
         
            +
                end
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
                def exists?(repo_name, repo_ref = nil)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  data[repo_name] ||= Set.new
         
     | 
| 
      
 56 
     | 
    
         
            +
                  if repo_ref.nil?
         
     | 
| 
      
 57 
     | 
    
         
            +
                    data[repo_name].empty? === false
         
     | 
| 
      
 58 
     | 
    
         
            +
                  else
         
     | 
| 
      
 59 
     | 
    
         
            +
                    data[repo_name].include? repo_ref
         
     | 
| 
      
 60 
     | 
    
         
            +
                  end
         
     | 
| 
      
 61 
     | 
    
         
            +
                end
         
     | 
| 
      
 62 
     | 
    
         
            +
             
     | 
| 
      
 63 
     | 
    
         
            +
                def copy_repository(repo, options = {})
         
     | 
| 
      
 64 
     | 
    
         
            +
                  social_snippet.logger.debug "repository_installer: repo.path = #{repo.path}"
         
     | 
| 
      
 65 
     | 
    
         
            +
                  ::FileUtils.cp_r repo.path, repo_path(repo.name)
         
     | 
| 
      
 66 
     | 
    
         
            +
                end
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
                def fetch(repo_name, options)
         
     | 
| 
      
 69 
     | 
    
         
            +
                  repo = ::SocialSnippet::Repository::RepositoryFactory.create(repo_path(repo_name), options)
         
     | 
| 
      
 70 
     | 
    
         
            +
                  repo.update
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                def repo_path(name)
         
     | 
| 
      
 74 
     | 
    
         
            +
                  ::File.join(path, name)
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                def each(&block)
         
     | 
| 
      
 78 
     | 
    
         
            +
                  data
         
     | 
| 
      
 79 
     | 
    
         
            +
                    .select {|repo_name, repo_refs| not repo_refs.empty? }
         
     | 
| 
      
 80 
     | 
    
         
            +
                    .keys
         
     | 
| 
      
 81 
     | 
    
         
            +
                    .each {|repo_name| block.call repo_name }
         
     | 
| 
      
 82 
     | 
    
         
            +
                end
         
     | 
| 
      
 83 
     | 
    
         
            +
             
     | 
| 
      
 84 
     | 
    
         
            +
              end # RepositoryInstaller
         
     | 
| 
      
 85 
     | 
    
         
            +
             
     | 
| 
      
 86 
     | 
    
         
            +
            end # SocialSnippet
         
     | 
| 
         @@ -0,0 +1,177 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SocialSnippet::Repository
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              class RepositoryManager
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :installer
         
     | 
| 
      
 6 
     | 
    
         
            +
                attr_reader :repo_paths
         
     | 
| 
      
 7 
     | 
    
         
            +
                attr_reader :repo_cache_path
         
     | 
| 
      
 8 
     | 
    
         
            +
                attr_reader :social_snippet
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
                # Constructor
         
     | 
| 
      
 11 
     | 
    
         
            +
                #
         
     | 
| 
      
 12 
     | 
    
         
            +
                # @param new_social_snippet [::SocialSnippet::Core]
         
     | 
| 
      
 13 
     | 
    
         
            +
                def initialize(new_social_snippet)
         
     | 
| 
      
 14 
     | 
    
         
            +
                  @social_snippet = new_social_snippet
         
     | 
| 
      
 15 
     | 
    
         
            +
                  @installer = ::SocialSnippet::Repository::RepositoryInstaller.new(social_snippet)
         
     | 
| 
      
 16 
     | 
    
         
            +
                  @repo_cache_path = social_snippet.config.repository_cache_path
         
     | 
| 
      
 17 
     | 
    
         
            +
                  @repo_paths = []
         
     | 
| 
      
 18 
     | 
    
         
            +
             
     | 
| 
      
 19 
     | 
    
         
            +
                  init_repo_paths
         
     | 
| 
      
 20 
     | 
    
         
            +
                  init_repo_cache_path
         
     | 
| 
      
 21 
     | 
    
         
            +
                end
         
     | 
| 
      
 22 
     | 
    
         
            +
             
     | 
| 
      
 23 
     | 
    
         
            +
                def init_repo_cache_path
         
     | 
| 
      
 24 
     | 
    
         
            +
                  ::FileUtils.mkdir_p repo_cache_path
         
     | 
| 
      
 25 
     | 
    
         
            +
                end
         
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
      
 27 
     | 
    
         
            +
                def init_repo_paths
         
     | 
| 
      
 28 
     | 
    
         
            +
                  repo_paths.push installer.path
         
     | 
| 
      
 29 
     | 
    
         
            +
                  repo_paths.each {|path| ::FileUtils.mkdir_p path }
         
     | 
| 
      
 30 
     | 
    
         
            +
                end
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                def deps(repo_name, repo_ref = nil)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  repo = find_repository(repo_name)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  repo.checkout(repo_ref) unless repo_ref.nil?
         
     | 
| 
      
 35 
     | 
    
         
            +
                  repo.dependencies
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                def has_deps?(repo_name, repo_ref = nil)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  not deps(repo_name, repo_ref).empty?
         
     | 
| 
      
 40 
     | 
    
         
            +
                end
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                # Get snippet
         
     | 
| 
      
 43 
     | 
    
         
            +
                #
         
     | 
| 
      
 44 
     | 
    
         
            +
                # @param context [::SocialSnippet::Context] The context of snippet
         
     | 
| 
      
 45 
     | 
    
         
            +
                # @param tag [::SocialSnippet::Tag] The tag of snippet
         
     | 
| 
      
 46 
     | 
    
         
            +
                def get_snippet(context, tag)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  return ::SocialSnippet::Snippet.new(resolve_snippet_path(context, tag))
         
     | 
| 
      
 48 
     | 
    
         
            +
                end
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
                # Resolve snippet path from tag
         
     | 
| 
      
 51 
     | 
    
         
            +
                #
         
     | 
| 
      
 52 
     | 
    
         
            +
                # @param context [::SocialSnippet::Context] The context of snippet
         
     | 
| 
      
 53 
     | 
    
         
            +
                # @param tag [::SocialSnippet::Tag] The tag of snippet
         
     | 
| 
      
 54 
     | 
    
         
            +
                def resolve_snippet_path(context, tag)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  if tag.has_repo?
         
     | 
| 
      
 56 
     | 
    
         
            +
                    repo = find_repository_by_tag(tag)
         
     | 
| 
      
 57 
     | 
    
         
            +
                    return repo.real_path tag.path
         
     | 
| 
      
 58 
     | 
    
         
            +
                  end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                  new_context = context.clone
         
     | 
| 
      
 61 
     | 
    
         
            +
                  new_context.move tag.path
         
     | 
| 
      
 62 
     | 
    
         
            +
                  return new_context.path
         
     | 
| 
      
 63 
     | 
    
         
            +
                end
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                # Find repository by tag
         
     | 
| 
      
 66 
     | 
    
         
            +
                #
         
     | 
| 
      
 67 
     | 
    
         
            +
                # @param tag [::SocialSnippet::Tag] The tag of repository
         
     | 
| 
      
 68 
     | 
    
         
            +
                def find_repository_by_tag(tag)
         
     | 
| 
      
 69 
     | 
    
         
            +
                  if tag.has_ref?
         
     | 
| 
      
 70 
     | 
    
         
            +
                    find_repository(tag.repo, tag.ref)
         
     | 
| 
      
 71 
     | 
    
         
            +
                  else
         
     | 
| 
      
 72 
     | 
    
         
            +
                    find_repository(tag.repo)
         
     | 
| 
      
 73 
     | 
    
         
            +
                  end
         
     | 
| 
      
 74 
     | 
    
         
            +
                end
         
     | 
| 
      
 75 
     | 
    
         
            +
             
     | 
| 
      
 76 
     | 
    
         
            +
                # Find repository by repo name
         
     | 
| 
      
 77 
     | 
    
         
            +
                #
         
     | 
| 
      
 78 
     | 
    
         
            +
                # @param name [String] The name of repository
         
     | 
| 
      
 79 
     | 
    
         
            +
                def find_repository(name, ref = nil)
         
     | 
| 
      
 80 
     | 
    
         
            +
                  repo_paths.each do |repo_path|
         
     | 
| 
      
 81 
     | 
    
         
            +
                    path = "#{repo_path}/#{name}"
         
     | 
| 
      
 82 
     | 
    
         
            +
                    if ::Dir.exists?(path)
         
     | 
| 
      
 83 
     | 
    
         
            +
                      repo = RepositoryFactory.create(path, ref)
         
     | 
| 
      
 84 
     | 
    
         
            +
                      repo.load_cache repo_cache_path
         
     | 
| 
      
 85 
     | 
    
         
            +
                      return repo
         
     | 
| 
      
 86 
     | 
    
         
            +
                    end
         
     | 
| 
      
 87 
     | 
    
         
            +
                  end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                  return nil
         
     | 
| 
      
 90 
     | 
    
         
            +
                end
         
     | 
| 
      
 91 
     | 
    
         
            +
             
     | 
| 
      
 92 
     | 
    
         
            +
                def find_repositories_start_with(prefix)
         
     | 
| 
      
 93 
     | 
    
         
            +
                  glob_path = ::File.join(installer.path, "#{prefix}*")
         
     | 
| 
      
 94 
     | 
    
         
            +
                  ::Dir.glob(glob_path).map do |repopath|
         
     | 
| 
      
 95 
     | 
    
         
            +
                    Pathname(repopath).basename.to_s
         
     | 
| 
      
 96 
     | 
    
         
            +
                  end
         
     | 
| 
      
 97 
     | 
    
         
            +
                end
         
     | 
| 
      
 98 
     | 
    
         
            +
             
     | 
| 
      
 99 
     | 
    
         
            +
                def complete_repo_name(keyword)
         
     | 
| 
      
 100 
     | 
    
         
            +
                  repo_name = get_repo_name_prefix(keyword)
         
     | 
| 
      
 101 
     | 
    
         
            +
                  find_repositories_start_with(repo_name)
         
     | 
| 
      
 102 
     | 
    
         
            +
                end
         
     | 
| 
      
 103 
     | 
    
         
            +
             
     | 
| 
      
 104 
     | 
    
         
            +
                def complete_file_name(keyword)
         
     | 
| 
      
 105 
     | 
    
         
            +
                  repo_name   = get_repo_name(keyword)
         
     | 
| 
      
 106 
     | 
    
         
            +
                  repo        = find_repository(repo_name)
         
     | 
| 
      
 107 
     | 
    
         
            +
                  file_path   = get_file_path_prefix(keyword)
         
     | 
| 
      
 108 
     | 
    
         
            +
                  glob_path   = "#{file_path}*"
         
     | 
| 
      
 109 
     | 
    
         
            +
             
     | 
| 
      
 110 
     | 
    
         
            +
                  repo.glob(glob_path).map do |cand_file_path|
         
     | 
| 
      
 111 
     | 
    
         
            +
                    if ::File.directory?(cand_file_path)
         
     | 
| 
      
 112 
     | 
    
         
            +
                      Pathname(cand_file_path).basename.to_s + "/"
         
     | 
| 
      
 113 
     | 
    
         
            +
                    else
         
     | 
| 
      
 114 
     | 
    
         
            +
                      Pathname(cand_file_path).basename.to_s + ">"
         
     | 
| 
      
 115 
     | 
    
         
            +
                    end
         
     | 
| 
      
 116 
     | 
    
         
            +
                  end
         
     | 
| 
      
 117 
     | 
    
         
            +
                end
         
     | 
| 
      
 118 
     | 
    
         
            +
             
     | 
| 
      
 119 
     | 
    
         
            +
                def complete(keyword)
         
     | 
| 
      
 120 
     | 
    
         
            +
                  if is_completing_repo_name?(keyword)
         
     | 
| 
      
 121 
     | 
    
         
            +
                    complete_repo_name(keyword)
         
     | 
| 
      
 122 
     | 
    
         
            +
                  elsif is_completing_file_path?(keyword)
         
     | 
| 
      
 123 
     | 
    
         
            +
                    complete_file_name(keyword)
         
     | 
| 
      
 124 
     | 
    
         
            +
                  else
         
     | 
| 
      
 125 
     | 
    
         
            +
                    raise "completion error"
         
     | 
| 
      
 126 
     | 
    
         
            +
                  end
         
     | 
| 
      
 127 
     | 
    
         
            +
                end
         
     | 
| 
      
 128 
     | 
    
         
            +
             
     | 
| 
      
 129 
     | 
    
         
            +
                def get_repo_name(keyword)
         
     | 
| 
      
 130 
     | 
    
         
            +
                  /^[^@]*@[^<]+<([^:#>]*[^:#>])/.match(keyword)[1]
         
     | 
| 
      
 131 
     | 
    
         
            +
                end
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
                def get_repo_name_prefix(keyword)
         
     | 
| 
      
 134 
     | 
    
         
            +
                  /^[^@]*@[^<]+<([^:#>]*[^:#>])$/.match(keyword)[1]
         
     | 
| 
      
 135 
     | 
    
         
            +
                end
         
     | 
| 
      
 136 
     | 
    
         
            +
             
     | 
| 
      
 137 
     | 
    
         
            +
                def get_file_path_prefix(keyword)
         
     | 
| 
      
 138 
     | 
    
         
            +
                  /^[^@]*@[^<]+<[^#:]+:([^>]*)$/.match(keyword)[1]
         
     | 
| 
      
 139 
     | 
    
         
            +
                end
         
     | 
| 
      
 140 
     | 
    
         
            +
             
     | 
| 
      
 141 
     | 
    
         
            +
                def is_completing_repo_name?(keyword)
         
     | 
| 
      
 142 
     | 
    
         
            +
                  /^[^@]*@[^<]+<[^:#>]*$/ === keyword
         
     | 
| 
      
 143 
     | 
    
         
            +
                end
         
     | 
| 
      
 144 
     | 
    
         
            +
             
     | 
| 
      
 145 
     | 
    
         
            +
                def is_completing_file_path?(keyword)
         
     | 
| 
      
 146 
     | 
    
         
            +
                  /^[^@]*@[^<]+<[^#:]+:[^>]*$/ === keyword
         
     | 
| 
      
 147 
     | 
    
         
            +
                end
         
     | 
| 
      
 148 
     | 
    
         
            +
             
     | 
| 
      
 149 
     | 
    
         
            +
                def cache_installing_repo(repo, options = {})
         
     | 
| 
      
 150 
     | 
    
         
            +
                  repo.create_cache repo_cache_path
         
     | 
| 
      
 151 
     | 
    
         
            +
                end
         
     | 
| 
      
 152 
     | 
    
         
            +
             
     | 
| 
      
 153 
     | 
    
         
            +
                def fetch(repo_name, options)
         
     | 
| 
      
 154 
     | 
    
         
            +
                  installer.fetch repo_name, options
         
     | 
| 
      
 155 
     | 
    
         
            +
                end
         
     | 
| 
      
 156 
     | 
    
         
            +
             
     | 
| 
      
 157 
     | 
    
         
            +
                def update(repo_name, repo_ref, repo, options)
         
     | 
| 
      
 158 
     | 
    
         
            +
                  cache_installing_repo repo, options
         
     | 
| 
      
 159 
     | 
    
         
            +
                  installer.add repo_name, repo_ref
         
     | 
| 
      
 160 
     | 
    
         
            +
                end
         
     | 
| 
      
 161 
     | 
    
         
            +
             
     | 
| 
      
 162 
     | 
    
         
            +
                def install(repo_name, repo_ref, repo, options)
         
     | 
| 
      
 163 
     | 
    
         
            +
                  installer.copy_repository repo, options
         
     | 
| 
      
 164 
     | 
    
         
            +
                  update repo_name, repo_ref, repo, options
         
     | 
| 
      
 165 
     | 
    
         
            +
                end
         
     | 
| 
      
 166 
     | 
    
         
            +
             
     | 
| 
      
 167 
     | 
    
         
            +
                def exists?(repo_name, repo_ref = nil)
         
     | 
| 
      
 168 
     | 
    
         
            +
                  installer.exists? repo_name, repo_ref
         
     | 
| 
      
 169 
     | 
    
         
            +
                end
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
                def each_installed_repo(&block)
         
     | 
| 
      
 172 
     | 
    
         
            +
                  installer.each &block
         
     | 
| 
      
 173 
     | 
    
         
            +
                end
         
     | 
| 
      
 174 
     | 
    
         
            +
             
     | 
| 
      
 175 
     | 
    
         
            +
              end # RepositoryManager
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
            end # SocialSnippet
         
     | 
| 
         @@ -0,0 +1,103 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SocialSnippet
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              class Resolvers::BaseResolver
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :social_snippet
         
     | 
| 
      
 6 
     | 
    
         
            +
                attr_reader :visited
         
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
      
 8 
     | 
    
         
            +
                # Constructor
         
     | 
| 
      
 9 
     | 
    
         
            +
                #
         
     | 
| 
      
 10 
     | 
    
         
            +
                # @param new_social_snippet [::SocialSnippet::Core]
         
     | 
| 
      
 11 
     | 
    
         
            +
                def initialize(new_social_snippet)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  @social_snippet = new_social_snippet
         
     | 
| 
      
 13 
     | 
    
         
            +
                  @visited = Set.new
         
     | 
| 
      
 14 
     | 
    
         
            +
                end
         
     | 
| 
      
 15 
     | 
    
         
            +
             
     | 
| 
      
 16 
     | 
    
         
            +
                # Call block each snip tags
         
     | 
| 
      
 17 
     | 
    
         
            +
                #
         
     | 
| 
      
 18 
     | 
    
         
            +
                # @param src [Array<String>] The text of source code
         
     | 
| 
      
 19 
     | 
    
         
            +
                # @param context [SocialSnippet::Context] The context of current code
         
     | 
| 
      
 20 
     | 
    
         
            +
                # @param base_tag [SocialSnippet::Tag]
         
     | 
| 
      
 21 
     | 
    
         
            +
                def each_snip_tags(src, context, base_tag)
         
     | 
| 
      
 22 
     | 
    
         
            +
                  TagParser.find_snip_tags(src).each do |tag_info|
         
     | 
| 
      
 23 
     | 
    
         
            +
                    t = tag_info[:tag].set_by_tag(base_tag)
         
     | 
| 
      
 24 
     | 
    
         
            +
                    new_context = context.clone
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    move_context_by_tag! new_context, t
         
     | 
| 
      
 27 
     | 
    
         
            +
                    overwrite_tag_in_same_repository! context, t
         
     | 
| 
      
 28 
     | 
    
         
            +
                    update_tag_path_by_context! new_context, t
         
     | 
| 
      
 29 
     | 
    
         
            +
                    resolve_tag_repo_ref! t
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                    snippet = social_snippet.repo_manager.get_snippet(context, t)
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                    if block_given?
         
     | 
| 
      
 34 
     | 
    
         
            +
                      yield(
         
     | 
| 
      
 35 
     | 
    
         
            +
                        tag_info[:tag],
         
     | 
| 
      
 36 
     | 
    
         
            +
                        tag_info[:line_no],
         
     | 
| 
      
 37 
     | 
    
         
            +
                        snippet,
         
     | 
| 
      
 38 
     | 
    
         
            +
                        new_context
         
     | 
| 
      
 39 
     | 
    
         
            +
                      )
         
     | 
| 
      
 40 
     | 
    
         
            +
                    end
         
     | 
| 
      
 41 
     | 
    
         
            +
                  end
         
     | 
| 
      
 42 
     | 
    
         
            +
                end
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                private
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                def move_context_by_tag!(context, tag)
         
     | 
| 
      
 47 
     | 
    
         
            +
                  if tag.has_repo?
         
     | 
| 
      
 48 
     | 
    
         
            +
                    if tag.has_ref?
         
     | 
| 
      
 49 
     | 
    
         
            +
                      context.move tag.path, tag.repo, tag.ref
         
     | 
| 
      
 50 
     | 
    
         
            +
                    else
         
     | 
| 
      
 51 
     | 
    
         
            +
                      context.move tag.path, tag.repo
         
     | 
| 
      
 52 
     | 
    
         
            +
                    end
         
     | 
| 
      
 53 
     | 
    
         
            +
                  else
         
     | 
| 
      
 54 
     | 
    
         
            +
                    context.move tag.path
         
     | 
| 
      
 55 
     | 
    
         
            +
                  end
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
                # Overwrite tag
         
     | 
| 
      
 59 
     | 
    
         
            +
                def overwrite_tag_in_same_repository!(context, tag)
         
     | 
| 
      
 60 
     | 
    
         
            +
                  if context.is_in_repository? && tag.has_repo? === false
         
     | 
| 
      
 61 
     | 
    
         
            +
                    tag.set_repo context.repo
         
     | 
| 
      
 62 
     | 
    
         
            +
                    tag.set_ref context.ref
         
     | 
| 
      
 63 
     | 
    
         
            +
                  end
         
     | 
| 
      
 64 
     | 
    
         
            +
                end
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                # Update tag path by context
         
     | 
| 
      
 67 
     | 
    
         
            +
                def update_tag_path_by_context!(context, tag)
         
     | 
| 
      
 68 
     | 
    
         
            +
                  if tag.has_repo?
         
     | 
| 
      
 69 
     | 
    
         
            +
                    tag.set_path context.path
         
     | 
| 
      
 70 
     | 
    
         
            +
                  end
         
     | 
| 
      
 71 
     | 
    
         
            +
                end
         
     | 
| 
      
 72 
     | 
    
         
            +
             
     | 
| 
      
 73 
     | 
    
         
            +
                # Resolve tag's ref
         
     | 
| 
      
 74 
     | 
    
         
            +
                def resolve_tag_repo_ref!(tag)
         
     | 
| 
      
 75 
     | 
    
         
            +
                  repo = social_snippet.repo_manager.find_repository_by_tag(tag)
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                  # not found
         
     | 
| 
      
 78 
     | 
    
         
            +
                  return if repo.nil?
         
     | 
| 
      
 79 
     | 
    
         
            +
             
     | 
| 
      
 80 
     | 
    
         
            +
                  if tag.has_ref? === false || tag.ref != repo.latest_version(tag.ref)
         
     | 
| 
      
 81 
     | 
    
         
            +
                    if repo.has_versions?
         
     | 
| 
      
 82 
     | 
    
         
            +
                      tag.set_ref repo.latest_version(tag.ref)
         
     | 
| 
      
 83 
     | 
    
         
            +
                    else
         
     | 
| 
      
 84 
     | 
    
         
            +
                      tag.set_ref repo.short_commit_id
         
     | 
| 
      
 85 
     | 
    
         
            +
                    end
         
     | 
| 
      
 86 
     | 
    
         
            +
                  end
         
     | 
| 
      
 87 
     | 
    
         
            +
                end
         
     | 
| 
      
 88 
     | 
    
         
            +
             
     | 
| 
      
 89 
     | 
    
         
            +
                def visit(tag)
         
     | 
| 
      
 90 
     | 
    
         
            +
                  visited.add tag.to_path
         
     | 
| 
      
 91 
     | 
    
         
            +
                end
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
                def is_visited(tag)
         
     | 
| 
      
 94 
     | 
    
         
            +
                  visited.include? tag.to_path
         
     | 
| 
      
 95 
     | 
    
         
            +
                end
         
     | 
| 
      
 96 
     | 
    
         
            +
             
     | 
| 
      
 97 
     | 
    
         
            +
                def is_self(tag, context)
         
     | 
| 
      
 98 
     | 
    
         
            +
                  tag.repo === context.repo && tag.path === context.path
         
     | 
| 
      
 99 
     | 
    
         
            +
                end
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
              end
         
     | 
| 
      
 102 
     | 
    
         
            +
             
     | 
| 
      
 103 
     | 
    
         
            +
            end
         
     | 
| 
         @@ -0,0 +1,61 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SocialSnippet
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              class Resolvers::DepResolver < Resolvers::BaseResolver
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :dep_to
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                # Constructor
         
     | 
| 
      
 8 
     | 
    
         
            +
                #
         
     | 
| 
      
 9 
     | 
    
         
            +
                # @param social_snippet [::SocialSnippet::Core]
         
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize(social_snippet)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @dep_to = {} # dep_to[tag_from] = tag_to
         
     | 
| 
      
 12 
     | 
    
         
            +
                  super(social_snippet)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                # Find all missing depended snippets
         
     | 
| 
      
 16 
     | 
    
         
            +
                #
         
     | 
| 
      
 17 
     | 
    
         
            +
                # @param src [Array<String>] The text of source code
         
     | 
| 
      
 18 
     | 
    
         
            +
                # @param context_from [SocialSnippet::Context] The context of previous code
         
     | 
| 
      
 19 
     | 
    
         
            +
                # @param tag_from [SocialSnippet::Tag] The previous tag
         
     | 
| 
      
 20 
     | 
    
         
            +
                def find(src, context_from, tag_from)
         
     | 
| 
      
 21 
     | 
    
         
            +
                  found_tags = find_func src, context_from, tag_from
         
     | 
| 
      
 22 
     | 
    
         
            +
                  found_tags.each do |tag_info|
         
     | 
| 
      
 23 
     | 
    
         
            +
                    # remove self from deps graph
         
     | 
| 
      
 24 
     | 
    
         
            +
                    tag = tag_info[:tag]
         
     | 
| 
      
 25 
     | 
    
         
            +
                    dep_to[tag.to_path] ||= ::Set.new
         
     | 
| 
      
 26 
     | 
    
         
            +
                    dep_to[tag.to_path].delete tag_from.to_path
         
     | 
| 
      
 27 
     | 
    
         
            +
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
                  found_tags
         
     | 
| 
      
 29 
     | 
    
         
            +
                end
         
     | 
| 
      
 30 
     | 
    
         
            +
             
     | 
| 
      
 31 
     | 
    
         
            +
                private
         
     | 
| 
      
 32 
     | 
    
         
            +
             
     | 
| 
      
 33 
     | 
    
         
            +
                def set_snippet_dep(tag_from, tag_to)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  dep_to[tag_from.to_path] ||= ::Set.new
         
     | 
| 
      
 35 
     | 
    
         
            +
                  dep_to[tag_from.to_path].add tag_to.to_path
         
     | 
| 
      
 36 
     | 
    
         
            +
                end
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
                def find_func(src, context_from, tag_from)
         
     | 
| 
      
 39 
     | 
    
         
            +
                  found_tags = []
         
     | 
| 
      
 40 
     | 
    
         
            +
                  context = context_from.clone
         
     | 
| 
      
 41 
     | 
    
         
            +
             
     | 
| 
      
 42 
     | 
    
         
            +
                  each_snip_tags(src, context_from, tag_from) do |tag, line_no, snippet, new_context|
         
     | 
| 
      
 43 
     | 
    
         
            +
                    next if is_visited(tag)
         
     | 
| 
      
 44 
     | 
    
         
            +
                    visit tag
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
                    set_snippet_dep tag_from, tag
         
     | 
| 
      
 47 
     | 
    
         
            +
                    found_tags.push({
         
     | 
| 
      
 48 
     | 
    
         
            +
                      :tag => tag,
         
     | 
| 
      
 49 
     | 
    
         
            +
                      :context => new_context,
         
     | 
| 
      
 50 
     | 
    
         
            +
                    })
         
     | 
| 
      
 51 
     | 
    
         
            +
                    # find more deps 
         
     | 
| 
      
 52 
     | 
    
         
            +
                    found_tags.push *find_func(snippet.lines, new_context, tag)
         
     | 
| 
      
 53 
     | 
    
         
            +
                  end
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
                  return found_tags
         
     | 
| 
      
 56 
     | 
    
         
            +
                end
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
              end # DepResolver
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            end # SocialSnippet
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
         @@ -0,0 +1,100 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            module SocialSnippet
         
     | 
| 
      
 2 
     | 
    
         
            +
             
     | 
| 
      
 3 
     | 
    
         
            +
              class Resolvers::InsertResolver < Resolvers::BaseResolver
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
                attr_reader :deps_resolver
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
                # Constructor
         
     | 
| 
      
 8 
     | 
    
         
            +
                #
         
     | 
| 
      
 9 
     | 
    
         
            +
                # @param social_snippet [::SocialSnippet::Core]
         
     | 
| 
      
 10 
     | 
    
         
            +
                def initialize(social_snippet)
         
     | 
| 
      
 11 
     | 
    
         
            +
                  @deps_resolver = Resolvers::DepResolver.new(social_snippet)
         
     | 
| 
      
 12 
     | 
    
         
            +
                  super(social_snippet)
         
     | 
| 
      
 13 
     | 
    
         
            +
                end
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                # Insert snippets to given text
         
     | 
| 
      
 16 
     | 
    
         
            +
                #
         
     | 
| 
      
 17 
     | 
    
         
            +
                # @param src [Array<String>] The text of source code
         
     | 
| 
      
 18 
     | 
    
         
            +
                def insert(src)
         
     | 
| 
      
 19 
     | 
    
         
            +
                  context = Context.new("")
         
     | 
| 
      
 20 
     | 
    
         
            +
                  lines = src.split("\n")
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
                  TagParser.find_snippet_tags(lines).each do |tag_info|
         
     | 
| 
      
 23 
     | 
    
         
            +
                    visit tag_info[:tag]
         
     | 
| 
      
 24 
     | 
    
         
            +
                  end
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                  dest = insert_func(lines, context)
         
     | 
| 
      
 27 
     | 
    
         
            +
                  return dest.join("\n")
         
     | 
| 
      
 28 
     | 
    
         
            +
                end
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
                private
         
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
      
 32 
     | 
    
         
            +
                def insert_func(code, context_from, base_tag = nil)
         
     | 
| 
      
 33 
     | 
    
         
            +
                  inserter = Inserter.new(code)
         
     | 
| 
      
 34 
     | 
    
         
            +
                  context = context_from.clone
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
                  # replace each @snip tags
         
     | 
| 
      
 37 
     | 
    
         
            +
                  each_snip_tags(code, context, base_tag) do |tag, line_no, snippet, new_context|
         
     | 
| 
      
 38 
     | 
    
         
            +
                    inserter.set_index line_no
         
     | 
| 
      
 39 
     | 
    
         
            +
                    inserter.ignore
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
                    visit(tag) if is_self(tag, context)
         
     | 
| 
      
 42 
     | 
    
         
            +
                    next if is_visited(tag)
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
                    insert_depended_snippets! inserter, snippet, new_context, tag
         
     | 
| 
      
 45 
     | 
    
         
            +
                    insert_by_tag_and_context! inserter, snippet, new_context, tag
         
     | 
| 
      
 46 
     | 
    
         
            +
                  end
         
     | 
| 
      
 47 
     | 
    
         
            +
             
     | 
| 
      
 48 
     | 
    
         
            +
                  inserter.set_index_last
         
     | 
| 
      
 49 
     | 
    
         
            +
                  return inserter.dest
         
     | 
| 
      
 50 
     | 
    
         
            +
                end
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
                # Insert snippet by tag and context
         
     | 
| 
      
 53 
     | 
    
         
            +
                def insert_by_tag_and_context!(inserter, snippet, context, tag)
         
     | 
| 
      
 54 
     | 
    
         
            +
                  src = insert_func(snippet.lines, context, tag)
         
     | 
| 
      
 55 
     | 
    
         
            +
                  inserter.insert tag.to_snippet_tag # @snip -> @snippet
         
     | 
| 
      
 56 
     | 
    
         
            +
                  inserter.insert src
         
     | 
| 
      
 57 
     | 
    
         
            +
                  visit tag
         
     | 
| 
      
 58 
     | 
    
         
            +
                end
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
                # Insert depended snippet
         
     | 
| 
      
 61 
     | 
    
         
            +
                def insert_depended_snippets!(inserter, snippet, context, tag)
         
     | 
| 
      
 62 
     | 
    
         
            +
                  dep_tags = deps_resolver.find(snippet.lines, context, tag)
         
     | 
| 
      
 63 
     | 
    
         
            +
                  dep_tags = sort_dep_tags_by_dep(dep_tags)
         
     | 
| 
      
 64 
     | 
    
         
            +
             
     | 
| 
      
 65 
     | 
    
         
            +
                  dep_tags.each do |tag_info|
         
     | 
| 
      
 66 
     | 
    
         
            +
                    sub_t = tag_info[:tag]
         
     | 
| 
      
 67 
     | 
    
         
            +
                    sub_c = tag_info[:context]
         
     | 
| 
      
 68 
     | 
    
         
            +
             
     | 
| 
      
 69 
     | 
    
         
            +
                    visit(tag) if is_self(tag, context)
         
     | 
| 
      
 70 
     | 
    
         
            +
                    next if is_visited(sub_t)
         
     | 
| 
      
 71 
     | 
    
         
            +
             
     | 
| 
      
 72 
     | 
    
         
            +
                    sub_snippet = social_snippet.repo_manager.get_snippet(sub_c, sub_t)
         
     | 
| 
      
 73 
     | 
    
         
            +
                    insert_by_tag_and_context! inserter, sub_snippet, sub_c, sub_t
         
     | 
| 
      
 74 
     | 
    
         
            +
                  end
         
     | 
| 
      
 75 
     | 
    
         
            +
                end
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
                # Sort by dependency
         
     | 
| 
      
 78 
     | 
    
         
            +
                def sort_dep_tags_by_dep(dep_tags)
         
     | 
| 
      
 79 
     | 
    
         
            +
                  dep_tags_index = {}
         
     | 
| 
      
 80 
     | 
    
         
            +
             
     | 
| 
      
 81 
     | 
    
         
            +
                  # map tag to index
         
     | 
| 
      
 82 
     | 
    
         
            +
                  dep_tags.each.with_index do |tag_info, k|
         
     | 
| 
      
 83 
     | 
    
         
            +
                    tag = tag_info[:tag]
         
     | 
| 
      
 84 
     | 
    
         
            +
                    dep_tags_index[tag.to_path] = k
         
     | 
| 
      
 85 
     | 
    
         
            +
                  end
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                  # generate dependency graph
         
     | 
| 
      
 88 
     | 
    
         
            +
                  dep_tags_hash = {}
         
     | 
| 
      
 89 
     | 
    
         
            +
                  dep_tags.each do |tag_info|
         
     | 
| 
      
 90 
     | 
    
         
            +
                    tag = tag_info[:tag].to_path
         
     | 
| 
      
 91 
     | 
    
         
            +
                    dep_ind = dep_tags_index[tag]
         
     | 
| 
      
 92 
     | 
    
         
            +
                    dep_tags_hash[dep_ind] = deps_resolver.dep_to[tag].to_a.map {|tag| dep_tags_index[tag] }
         
     | 
| 
      
 93 
     | 
    
         
            +
                  end
         
     | 
| 
      
 94 
     | 
    
         
            +
             
     | 
| 
      
 95 
     | 
    
         
            +
                  dep_tags_hash.tsort.map {|k| dep_tags[k]}
         
     | 
| 
      
 96 
     | 
    
         
            +
                end
         
     | 
| 
      
 97 
     | 
    
         
            +
             
     | 
| 
      
 98 
     | 
    
         
            +
              end # BaseResolver
         
     | 
| 
      
 99 
     | 
    
         
            +
             
     | 
| 
      
 100 
     | 
    
         
            +
            end # SocialSnippet
         
     |