[logaling-commit] logaling/logaling-command [master] Extract Logaling::Config from Command::Application

Back to archive index

null+****@clear***** null+****@clear*****
Tue Feb 14 18:59:33 JST 2012


SHIMADA Koji	2012-02-14 18:59:33 +0900 (Tue, 14 Feb 2012)

  New Revision: 7713c7b527be01d2b05631383f656cfefcb6cf08

  Merged b0ee22d: Merge pull request #43 from logaling/extract-config-object

  Log:
    Extract Logaling::Config from Command::Application

  Added files:
    lib/logaling/config.rb
  Modified files:
    lib/logaling/command/application.rb

  Modified: lib/logaling/command/application.rb (+29 -93)
===================================================================
--- lib/logaling/command/application.rb    2012-02-14 18:16:01 +0900 (8c9f5bc)
+++ lib/logaling/command/application.rb    2012-02-14 18:59:33 +0900 (5b96d74)
@@ -19,6 +19,7 @@ require 'thor'
 require 'rainbow'
 require "logaling/repository"
 require "logaling/glossary"
+require "logaling/config"
 
 module Logaling::Command
   LOGALING_CONFIG = '.logaling'
@@ -28,9 +29,13 @@ module Logaling::Command
     def initialize(*args)
       super
       @repository = Logaling::Repository.new(LOGALING_HOME)
-      @config = load_config_and_merge_options
-      @source_language = @config["source-language"]
-      @target_language = @config["target-language"]
+      project_config_path = File.join(find_dotfile, 'config')
+      @config = Logaling::Config.load_config_and_merge_options(project_config_path, @repository.config_path, options)
+    rescue Logaling::CommandFailed
+      @config = Logaling::Config.load_config_and_merge_options(nil, @repository.config_path, options)
+    ensure
+      @source_language =****@confi*****_language
+      @target_language =****@confi*****_language
     end
 
     map '-a' => :add,
@@ -57,7 +62,7 @@ module Logaling::Command
         FileUtils.mkdir_p(File.join(LOGALING_CONFIG, "glossary"))
         config = {"glossary" => project_name, "source-language" => source_language}
         config["target-language"] = target_language if target_language
-        write_config(File.join(LOGALING_CONFIG, "config"), config)
+        Logaling::Config.new(config).write_config(File.join(LOGALING_CONFIG, "config"))
 
         register unless options["no-register"]
         say "Successfully created #{LOGALING_CONFIG}"
@@ -85,43 +90,37 @@ module Logaling::Command
     def register
       logaling_path = find_dotfile
 
-      check_required_option(@config, {"glossary" => "input glossary name '-g <glossary name>'"})
+      @config.check_required_option("glossary" => "input glossary name '-g <glossary name>'")
 
-      @repository.register(logaling_path, @config["glossary"])
+      @repository.register(logaling_path, @config.glossary)
       @repository.index
-      say "#{@config['glossary']} is now registered to logaling."
+      say "#{@config.glossary} is now registered to logaling."
     rescue Logaling::CommandFailed => e
       say e.message
       say "Try 'loga new' first."
     rescue Logaling::GlossaryAlreadyRegistered => e
-      say "#{@config['glossary']} is already registered."
+      say "#{@config.glossary} is already registered."
     end
 
     desc 'unregister', 'Unregister .logaling'
     def unregister
-      check_required_option(@config, {"glossary" => "input glossary name '-g <glossary name>'"})
+      @config.check_required_option("glossary" => "input glossary name '-g <glossary name>'")
 
-      @repository.unregister(@config["glossary"])
+      @repository.unregister(@config.glossary)
       @repository.index
-      say "#{@config['glossary']} is now unregistered."
+      say "#{@config.glossary} is now unregistered."
     rescue Logaling::CommandFailed => e
       say e.message
     rescue Logaling::GlossaryNotFound => e
-      say "#{@config['glossary']} is not yet registered."
+      say "#{@config.glossary} is not yet registered."
     end
 
     desc 'config [KEY] [VALUE] [--global(optional)]', 'Set config.'
     method_option "global", type: :boolean, default: false
     def config(key, value)
-      support_keys = %w(glossary source-language target-language)
-      raise Logaling::CommandFailed, "#{key} is unsupported option" unless support_keys.include?(key)
-
       config_path = options["global"] ? File.join(LOGALING_HOME, "config") : File.join(find_dotfile, "config")
       FileUtils.touch(config_path) unless File.exist?(config_path)
-
-      config = load_config(config_path)
-      config = merge_options({key => value}, config)
-      write_config(config_path, config)
+      Logaling::Config.add(config_path, key, value)
       say "Successfully set config."
     rescue Logaling::CommandFailed => e
       say e.message
@@ -131,8 +130,8 @@ module Logaling::Command
     def add(source_term, target_term, note='')
       @repository.index
 
-      if****@repos*****_pair_exists?(source_term, target_term, @config["glossary"])
-        raise Logaling::TermError, "term '#{source_term}: #{target_term}' already exists in '#{@config["glossary"]}'"
+      if****@repos*****_pair_exists?(source_term, target_term, @config.glossary)
+        raise Logaling::TermError, "term '#{source_term}: #{target_term}' already exists in '#{@config.glossary}'"
       end
 
       glossary.add(source_term, target_term, note)
@@ -158,8 +157,8 @@ module Logaling::Command
     def update(source_term, target_term, new_target_term, note='')
       @repository.index
 
-      if****@repos*****_pair_exists_and_has_same_note?(source_term, new_target_term, note, @config["glossary"])
-        raise Logaling::TermError, "term '#{source_term}: #{new_target_term}' already exists in '#{@config["glossary"]}'"
+      if****@repos*****_pair_exists_and_has_same_note?(source_term, new_target_term, note, @config.glossary)
+        raise Logaling::TermError, "term '#{source_term}: #{new_target_term}' already exists in '#{@config.glossary}'"
       end
 
       glossary.update(source_term, target_term, new_target_term, note)
@@ -175,7 +174,7 @@ module Logaling::Command
     def lookup(source_term)
       @repository.index
       terms =****@repos*****(source_term, @source_language, @target_language,
-                                @config["glossary"])
+                                @config.glossary)
       unless terms.empty?
         max_str_size = terms.map{|term| term[:source_term].size}.sort.last
         run_pager
@@ -186,7 +185,7 @@ module Logaling::Command
           glossary_name = ""
           if****@repos*****_counts > 1
             glossary_name = term[:glossary_name]
-            if term[:glossary_name] == @config["glossary"]
+            if term[:glossary_name] ==****@confi*****
               glossary_name = glossary_name.foreground(:white).background(:green)
             end
           end
@@ -213,9 +212,9 @@ module Logaling::Command
         "source-language" => "input source-language code '-S <source-language code>'",
         "target-language" => "input target-language code '-T <target-language code>'"
       }
-      check_required_option(@config, required_options)
+      @config.check_required_option(required_options)
       @repository.index
-      terms =****@repos*****_glossary(@config["glossary"], @config["source-language"], @config["target-language"])
+      terms =****@repos*****_glossary(@config.glossary, @config.source_language, @config.target_language)
       unless terms.empty?
         run_pager
         max_str_size = terms.map{|term| term[:source_term].size}.sort.last
@@ -225,7 +224,7 @@ module Logaling::Command
           printf("  %-#{max_str_size+10}s %s\n", term[:source_term], target_string)
         end
       else
-        "glossary <#{@config['glossary']}> not found"
+        "glossary <#{@config.glossary}> not found"
       end
 
     rescue Logaling::CommandFailed, Logaling::GlossaryDBNotFound => e
@@ -260,8 +259,8 @@ module Logaling::Command
           "source-language" => "input source-language code '-S <source-language code>'",
           "target-language" => "input target-language code '-T <target-language code>'"
         }
-        check_required_option(@config, required_options)
-        @glossary = Logaling::Glossary.new(@config["glossary"], @config["source-language"], @config["target-language"])
+        @config.check_required_option(required_options)
+        @glossary = Logaling::Glossary.new(@config.glossary, @config.source_language, @config.target_language)
       end
     end
 
@@ -270,56 +269,6 @@ module Logaling::Command
       exit 1
     end
 
-    def check_required_option(config, required={})
-      required.each do |required_option, message|
-        raise(Logaling::CommandFailed, message) unless config[required_option]
-      end
-    end
-
-    def load_config_and_merge_options
-      config_list ||= {}
-      find_config.each{|type, path| config_list[type] = load_config(path)}
-      global_config = config_list["global_config"] ? config_list["global_config"] : {}
-      project_config = config_list["project_config"] ? config_list["project_config"] : {}
-
-      config = merge_options(project_config, global_config)
-      config = merge_options(options, config)
-
-      config
-    end
-
-    def merge_options(options, secondary_options)
-      config ||={}
-      config["glossary"] = options["glossary"] ? options["glossary"] : secondary_options["glossary"]
-      config["source-language"] = options["source-language"] ? options["source-language"] : secondary_options["source-language"]
-      config["target-language"] = options["target-language"] ? options["target-language"] : secondary_options["target-language"]
-      config
-    end
-
-    def find_config
-      config ||= {}
-      config["project_config"] = File.join(find_dotfile, 'config')
-      config["global_config"] = global_config_path if global_config_path
-      config
-    rescue Logaling::CommandFailed
-      config ||= {}
-      config["project_config"] =****@repos*****_path if****@repos*****_path
-      config["global_config"] = global_config_path if global_config_path
-      config
-    end
-
-    def load_config(config_path=nil)
-      config ||= {}
-      if config_path
-        File.readlines(config_path).map{|l| l.chomp.split " "}.each do |option|
-          key = option[0].sub(/^[\-]{2}/, "")
-          value = option[1]
-          config[key] = value
-        end
-      end
-      config
-    end
-
     def find_dotfile
       dir = Dir.pwd
       searched_path = []
@@ -338,19 +287,6 @@ module Logaling::Command
       end
     end
 
-    def global_config_path
-      path = File.join(LOGALING_HOME, "config")
-      File.exist?(path) ? path : nil
-    end
-
-    def write_config(config_path, config)
-      File.open(config_path, 'w') do |fp|
-        fp.puts "--glossary #{config['glossary']}" if config['glossary']
-        fp.puts "--source-language #{config['source-language']}" if config['source-language']
-        fp.puts "--target-language #{config['target-language']}" if config['target-language']
-      end
-    end
-
     # http://nex-3.com/posts/73-git-style-automatic-paging-in-ruby
     def run_pager
       return if options["no-pager"]

  Added: lib/logaling/config.rb (+99 -0) 100644
===================================================================
--- /dev/null
+++ lib/logaling/config.rb    2012-02-14 18:59:33 +0900 (c227bcf)
@@ -0,0 +1,99 @@
+# Copyright (C) 2012  Koji SHIMADA <koji.****@enish*****>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+module Logaling
+  class Config
+    class << self
+      def add(config_path, key, value)
+        raise Logaling::CommandFailed, "#{key} is unsupported option" unless support?(key)
+
+        config = load_config(config_path)
+        config = merge_options({key => value}, config)
+        Config.new(config).write_config(config_path)
+      end
+
+      def load_config_and_merge_options(project_config_path, global_config_path, options)
+        config_list ||= {}
+        find_config(project_config_path, global_config_path).each{|type, path| config_list[type] = load_config(path)}
+        global_config = config_list["global_config"] ? config_list["global_config"] : {}
+        project_config = config_list["project_config"] ? config_list["project_config"] : {}
+
+        config = merge_options(project_config, global_config)
+        config = merge_options(options, config)
+
+        Config.new(config)
+      end
+
+      private
+      def support?(key)
+        support_keys = %w(glossary source-language target-language)
+        support_keys.include?(key)
+      end
+
+      def merge_options(options, secondary_options)
+        config ||={}
+        config["glossary"] = options["glossary"] ? options["glossary"] : secondary_options["glossary"]
+        config["source-language"] = options["source-language"] ? options["source-language"] : secondary_options["source-language"]
+        config["target-language"] = options["target-language"] ? options["target-language"] : secondary_options["target-language"]
+        config
+      end
+
+      def find_config(project_config_path, global_config_path)
+        config ||= {}
+        if project_config_path
+          config["project_config"] = project_config_path
+        else
+          config["project_config"] = global_config_path
+        end
+        config["global_config"] = global_config_path if global_config_path
+        config
+      end
+
+      def load_config(config_path=nil)
+        config ||= {}
+        if config_path
+          File.readlines(config_path).map{|l| l.chomp.split " "}.each do |option|
+            key = option[0].sub(/^[\-]{2}/, "")
+            value = option[1]
+            config[key] = value
+          end
+        end
+        config
+      end
+    end
+    attr_reader :glossary, :source_language, :target_language
+
+    def initialize(config)
+      @glossary = config["glossary"]
+      @source_language = config["source-language"]
+      @target_language = config["target-language"]
+      @config = config
+    end
+
+    def check_required_option(required={})
+      required.each do |required_option, message|
+        raise(Logaling::CommandFailed, message) unless @config[required_option]
+      end
+    end
+
+    def write_config(config_path)
+      File.open(config_path, 'w') do |fp|
+        fp.puts "--glossary #{@glossary}" if @glossary
+        fp.puts "--source-language #{@source_language}" if @source_language
+        fp.puts "--target-language #{@target_language}" if @target_language
+      end
+    end
+  end
+end




More information about the logaling-commit mailing list
Back to archive index