Skip to content

Commit

Permalink
Merge branch 'master' into update/ecto-phoenix
Browse files Browse the repository at this point in the history
  • Loading branch information
simonprev committed Dec 8, 2018
2 parents abf1582 + da82db5 commit 27b63be
Show file tree
Hide file tree
Showing 18 changed files with 157 additions and 69 deletions.
2 changes: 1 addition & 1 deletion lib/movement/builders/revision_sync.ex
Expand Up @@ -10,7 +10,7 @@ defmodule Movement.Builders.RevisionSync do

def build(context) do
context
|> assign_translations
|> assign_translations()
|> EntriesCommitProcessor.process()
|> EntriesCommitProcessor.process_for_remove()
end
Expand Down
39 changes: 39 additions & 0 deletions lib/movement/comparer.ex
@@ -1,3 +1,42 @@
defmodule Movement.Comparer do
alias Movement.Comparers.{SyncSmart, SyncPassive, MergeSmart, MergeForce, MergePassive}

@callback compare(map, map) :: Movement.Operation.t()

@default_comparer "smart"

@sync_comparers %{
"passive" => &SyncPassive.compare/2,
"smart" => &SyncSmart.compare/2
}

@merge_comparers %{
"passive" => &MergePassive.compare/2,
"smart" => &MergeSmart.compare/2,
"force" => &MergeForce.compare/2
}

@doc """
A string is used to identify the algorithm used to compare incoming translations to their current form.
The implementations of `Movement.Comparer` are accessible from this function.
## Examples
iex> Movement.Comparer.comparer(:sync, "smart")
&Movement.Comparers.SyncSmart.compare/2
iex> Movement.Comparer.comparer(:sync, "passive")
&Movement.Comparers.SyncPassive.compare/2
iex> Movement.Comparer.comparer(:merge, "passive")
&Movement.Comparers.MergePassive.compare/2
iex> Movement.Comparer.comparer(:merge, "smart")
&Movement.Comparers.MergeSmart.compare/2
iex> Movement.Comparer.comparer(:merge, "force")
&Movement.Comparers.MergeForce.compare/2
"""
def comparer(:sync, type) do
Map.get(@sync_comparers, type, @sync_comparers[@default_comparer])
end

def comparer(:merge, type) do
Map.get(@merge_comparers, type, @merge_comparers[@default_comparer])
end
end
39 changes: 39 additions & 0 deletions lib/movement/comparers/sync_passive.ex
@@ -0,0 +1,39 @@
defmodule Movement.Comparers.SyncPassive do
@behaviour Movement.Comparer

alias Movement.Mappers.Operation, as: OperationMapper

alias Movement.{
Operation,
TranslationComparer
}

@doc """
## Examples
iex> suggested_translation = %Movement.SuggestedTranslation{key: "a", text: "foo"}
iex> Movement.Comparers.SyncPassive.compare(nil, suggested_translation).action
"new"
iex> translation = %Accent.Translation{removed: true, key: "a", proposed_text: "bar", corrected_text: "baz"}
iex> suggested_translation = %Movement.SuggestedTranslation{key: "a", text: "foo"}
iex> Movement.Comparers.SyncPassive.compare(translation, suggested_translation).action
"renew"
iex> translation = %Accent.Translation{marked_as_removed: true, key: "a", proposed_text: "bar", corrected_text: "baz"}
iex> suggested_translation = %Movement.SuggestedTranslation{key: "a", text: "foo"}
iex> Movement.Comparers.SyncPassive.compare(translation, suggested_translation).action
"noop"
"""
def compare(%{key: key, marked_as_removed: true}, _), do: %Operation{action: "noop", key: key}

def compare(translation, suggested_translation) do
case TranslationComparer.compare(translation, suggested_translation.text) do
{action, text} when action in ~w(new renew remove) ->
suggested_translation = %{suggested_translation | text: text}

OperationMapper.map(action, translation, suggested_translation)

_ ->
%Operation{action: "noop", key: suggested_translation.key}
end
end
end
@@ -1,4 +1,4 @@
defmodule Movement.Comparers.Sync do
defmodule Movement.Comparers.SyncSmart do
@behaviour Movement.Comparer

alias Movement.Mappers.Operation, as: OperationMapper
Expand All @@ -13,22 +13,22 @@ defmodule Movement.Comparers.Sync do
iex> translation = %Accent.Translation{key: "a", proposed_text: "foo", corrected_text: "bar"}
iex> suggested_translation = %Movement.SuggestedTranslation{key: "a", text: "foo"}
iex> Movement.Comparers.Sync.compare(translation, suggested_translation) |> Map.get(:action)
iex> Movement.Comparers.SyncSmart.compare(translation, suggested_translation).action
"autocorrect"
iex> translation = %Accent.Translation{key: "a", proposed_text: "bar", corrected_text: "foo"}
iex> suggested_translation = %Movement.SuggestedTranslation{key: "a", text: "foo"}
iex> Movement.Comparers.Sync.compare(translation, suggested_translation) |> Map.get(:action)
iex> Movement.Comparers.SyncSmart.compare(translation, suggested_translation).action
"update_proposed"
iex> translation = %Accent.Translation{key: "a", proposed_text: "bar", corrected_text: "baz"}
iex> suggested_translation = %Movement.SuggestedTranslation{key: "a", text: "foo"}
iex> Movement.Comparers.Sync.compare(translation, suggested_translation) |> Map.get(:action)
iex> Movement.Comparers.SyncSmart.compare(translation, suggested_translation).action
"conflict_on_corrected"
iex> translation = %Accent.Translation{key: "a", proposed_text: "bar", corrected_text: "baz"}
iex> suggested_translation = %Movement.SuggestedTranslation{key: "a", text: "foo"}
iex> Movement.Comparers.Sync.compare(translation, suggested_translation) |> Map.get(:text)
iex> Movement.Comparers.SyncSmart.compare(translation, suggested_translation).text
"foo"
"""
def compare(translation, suggested_translation) do
Expand Down
22 changes: 2 additions & 20 deletions lib/web/controllers/merge_controller.ex
Expand Up @@ -6,7 +6,6 @@ defmodule Accent.MergeController do

alias Movement.Builders.RevisionMerge, as: RevisionMergeBuilder
alias Movement.Persisters.RevisionMerge, as: RevisionMergePersister
alias Movement.Comparers.{MergeSmart, MergeForce, MergePassive}

alias Accent.{
Project,
Expand Down Expand Up @@ -81,26 +80,9 @@ defmodule Accent.MergeController do
end
end

defp assign_comparer(conn = %{params: %{"merge_type" => "force"}}, _) do
context =
conn.assigns[:movement_context]
|> Movement.Context.assign(:comparer, &MergeForce.compare/2)

assign(conn, :movement_context, context)
end

defp assign_comparer(conn = %{params: %{"merge_type" => "passive"}}, _) do
context =
conn.assigns[:movement_context]
|> Movement.Context.assign(:comparer, &MergePassive.compare/2)

assign(conn, :movement_context, context)
end

defp assign_comparer(conn, _) do
context =
conn.assigns[:movement_context]
|> Movement.Context.assign(:comparer, &MergeSmart.compare/2)
comparer = Movement.Comparer.comparer(:merge, conn.params["merge_type"])
context = Movement.Context.assign(conn.assigns[:movement_context], :comparer, comparer)

assign(conn, :movement_context, context)
end
Expand Down
33 changes: 12 additions & 21 deletions lib/web/controllers/peek_controller.ex
Expand Up @@ -6,8 +6,6 @@ defmodule Accent.PeekController do

alias Movement.Builders.ProjectSync, as: ProjectSyncBuilder
alias Movement.Builders.RevisionMerge, as: RevisionMergeBuilder
alias Movement.Comparers.Sync, as: SyncComparer
alias Movement.Comparers.{MergeSmart, MergeForce, MergePassive}

alias Accent.{
Project,
Expand All @@ -24,7 +22,8 @@ defmodule Accent.PeekController do
plug(:fetch_revision_id_from_project_language when action === :merge)
plug(:load_and_authorize_resource, model: Revision, id_name: "revision_id", preload: :language, only: [:peek_merge])
plug(Accent.Plugs.MovementContextParser)
plug(:parse_merge_option when action in [:merge])
plug(:assign_merge_comparer when action in [:merge])
plug(:assign_sync_comparer when action in [:sync])

@broadcaster Application.get_env(:accent, :hook_broadcaster)

Expand All @@ -42,6 +41,9 @@ defmodule Accent.PeekController do
- `document_path`
- `document_format`
### Optional params
- `merge_type`
### Response
#### Success
Expand All @@ -54,7 +56,6 @@ defmodule Accent.PeekController do
operations =
conn.assigns[:movement_context]
|> Movement.Context.assign(:project, conn.assigns[:project])
|> Movement.Context.assign(:comparer, &SyncComparer.compare/2)
|> ProjectSyncBuilder.build()
|> Map.get(:operations)
|> Enum.group_by(&Map.get(&1, :revision_id))
Expand Down Expand Up @@ -84,6 +85,7 @@ defmodule Accent.PeekController do
### Optional params
- `merge_type`
- `sync_type`
### Response
Expand All @@ -98,7 +100,6 @@ defmodule Accent.PeekController do
operations =
conn.assigns[:movement_context]
|> Movement.Context.assign(:revision, conn.assigns[:revision])
|> Movement.Context.assign(:merge_type, conn.assigns[:merge_type])
|> RevisionMergeBuilder.build()
|> Map.get(:operations)
|> Enum.group_by(&Map.get(&1, :revision_id))
Expand All @@ -116,26 +117,16 @@ defmodule Accent.PeekController do
render(conn, "index.json", operations: operations)
end

defp parse_merge_option(conn = %{params: %{"merge_type" => "force"}}, _) do
context =
conn.assigns[:movement_context]
|> Movement.Context.assign(:comparer, &MergeForce.compare/2)

assign(conn, :movement_context, context)
end

defp parse_merge_option(conn = %{params: %{"merge_type" => "passive"}}, _) do
context =
conn.assigns[:movement_context]
|> Movement.Context.assign(:comparer, &MergePassive.compare/2)
defp assign_sync_comparer(conn, _) do
comparer = Movement.Comparer.comparer(:sync, conn.params["sync_type"])
context = Movement.Context.assign(conn.assigns[:movement_context], :comparer, comparer)

assign(conn, :movement_context, context)
end

defp parse_merge_option(conn, _) do
context =
conn.assigns[:movement_context]
|> Movement.Context.assign(:comparer, &MergeSmart.compare/2)
defp assign_merge_comparer(conn, _) do
comparer = Movement.Comparer.comparer(:merge, conn.params["merge_type"])
context = Movement.Context.assign(conn.assigns[:movement_context], :comparer, comparer)

assign(conn, :movement_context, context)
end
Expand Down
9 changes: 5 additions & 4 deletions lib/web/controllers/sync_controller.ex
Expand Up @@ -5,7 +5,6 @@ defmodule Accent.SyncController do

alias Movement.Builders.ProjectSync, as: SyncBuilder
alias Movement.Persisters.ProjectSync, as: SyncPersister
alias Movement.Comparers.Sync, as: SyncComparer
alias Accent.Project
alias Accent.Hook.Context, as: HookContext

Expand All @@ -31,6 +30,9 @@ defmodule Accent.SyncController do
- `document_path`
- `document_format`
### Optional params
- `sync_type` (smart or passive), default: smart.
### Response
#### Success
Expand Down Expand Up @@ -68,9 +70,8 @@ defmodule Accent.SyncController do
end

defp assign_comparer(conn, _) do
context =
conn.assigns[:movement_context]
|> Movement.Context.assign(:comparer, &SyncComparer.compare/2)
comparer = Movement.Comparer.comparer(:sync, conn.params["merge_type"])
context = Movement.Context.assign(conn.assigns[:movement_context], :comparer, comparer)

assign(conn, :movement_context, context)
end
Expand Down
4 changes: 4 additions & 0 deletions test/movement/comparer_test.exs
@@ -0,0 +1,4 @@
defmodule AccentTest.Movement.Comparer do
use ExUnit.Case, async: true
doctest(Movement.Comparer)
end
4 changes: 4 additions & 0 deletions test/movement/comparers/sync_passive_test.exs
@@ -0,0 +1,4 @@
defmodule AccentTest.Movement.Comparers.SyncPassive do
use ExUnit.Case
doctest Movement.Comparers.SyncPassive
end
4 changes: 4 additions & 0 deletions test/movement/comparers/sync_smart_test.exs
@@ -0,0 +1,4 @@
defmodule AccentTest.Movement.Comparers.SyncSmart do
use ExUnit.Case
doctest Movement.Comparers.SyncSmart
end
4 changes: 0 additions & 4 deletions test/movement/comparers/sync_test.exs

This file was deleted.

2 changes: 1 addition & 1 deletion webapp/app/locales/en/translations.js
Expand Up @@ -58,7 +58,7 @@ export default {
document_format: 'Format of the file',
document_path: 'Name of the file',
language: 'Language',
merge_type: 'Mode',
commit_type: 'Mode',
file_source: 'Document path',
merge_button: 'Add translations',
pattern_help: 'You need to specify the pattern of the files included in the zip that will be imported, eg: **/*.strings',
Expand Down
11 changes: 9 additions & 2 deletions webapp/app/pods/components/commit-file/component.js
Expand Up @@ -39,6 +39,8 @@ export default Component.extend({

mergeTypes: ['smart', 'passive', 'force'],
mergeType: 'smart',
syncTypes: ['smart', 'passive'],
syncType: 'smart',

revisionValue: computed('revision', 'revisions.[]', function() {
return this.mappedRevisions.find(({value}) => value === this.revision) || this.mappedRevisions[0];
Expand All @@ -56,6 +58,7 @@ export default Component.extend({
}),

isMerge: equal('commitAction', 'merge'),
isSync: equal('commitAction', 'sync'),

documentFormatValue: computed('documentFormat', 'documentFormatOptions', function() {
return this.documentFormatOptions.find(({value}) => value === this.documentFormat);
Expand Down Expand Up @@ -84,6 +87,10 @@ export default Component.extend({
this.set('mergeType', mergeType);
},

onSelectSyncType(syncType) {
this.set('syncType', syncType);
},

onSelectRevision(revision) {
this.set('revision', this.revisions.find(({id}) => id === revision.value));
this.set('revisionValue', revision);
Expand All @@ -92,15 +99,15 @@ export default Component.extend({
commit() {
this._onCommiting();

this.onCommit(this.getProperties('fileSource', 'documentPath', 'documentFormat', 'revision', 'mergeType'))
this.onCommit(this.getProperties('fileSource', 'documentPath', 'documentFormat', 'revision', 'mergeType', 'syncType'))
.then(this._onCommitingDone.bind(this))
.catch(this._onCommitingError.bind(this));
},

peek() {
this._onPeeking();

this.onPeek(this.getProperties('fileSource', 'documentPath', 'documentFormat', 'revision', 'mergeType'))
this.onPeek(this.getProperties('fileSource', 'documentPath', 'documentFormat', 'revision', 'mergeType', 'syncType'))
.then(this._onPeekingDone.bind(this))
.catch(this._onPeekingError.bind(this));
},
Expand Down
21 changes: 20 additions & 1 deletion webapp/app/pods/components/commit-file/template.hbs
Expand Up @@ -23,7 +23,7 @@
</div>

<div class="option option--borderless">
<p class="textHelper">{{t 'components.commit_file.merge_type'}}:</p>
<p class="textHelper">{{t 'components.commit_file.commit_type'}}:</p>
{{#power-select
searchEnabled=false
selected=mergeType
Expand All @@ -37,6 +37,25 @@
{{/if}}
{{/if}}

{{#if isSync}}
{{#if file}}
<div class="options">
<div class="option option--borderless">
<p class="textHelper">{{t 'components.commit_file.commit_type'}}:</p>
{{#power-select
searchEnabled=false
selected=syncType
options=syncTypes
onchange=(action 'onSelectSyncType') as |option|
}}
{{option}}
{{/power-select}}
</div>
<div class="option option--borderless"></div>
</div>
{{/if}}
{{/if}}

{{#if file}}
<div>
{{#unless document}}
Expand Down

0 comments on commit 27b63be

Please sign in to comment.